所有关于电路
项目

通过USB与EFM8单片机通信

2015年7月17日,经过罗伯特·凯

许多嵌入式应用程序受益于通信接口,允许在PC机和微控制器之间进行方便的数据传输。本文解释了如何使用Silicon Laboratories的虚拟COM端口库将数据从Windows应用程序发送到EFM8微控制器。

了解如何使用标准USB接口将数据从PC发送到EFM8微控制器。

推荐水平

中间的

本系列中的前一篇文章

必需的硬件/软件

项目概述

简单,可靠的单片机和PC机之间的通信链路可以将强大的功能添加到各种嵌入式应用程序可以将传感器数据上传到PC机进行分析,从一个图形用户界面发送命令,甚至把一个引导加载功能,使得它可以更新固件没有典型的调试接口。不久以前,该功能的标准选择是计算机的“串行端口”,这是一个非常模糊的术语,指的是为RS-232信号特性设计的通用异步接收/发送器(UART)。然而,如今,使用串行端口与微控制器通信可能就相当于用一群牛犁地——牛是简单的野兽,它们能完成工作,但很少有人会选择它们而不是最新的gps导航的巨型拖拉机。

偏好抛开,RS-232简单地变得越来越实用,因为串口不再是许多计算机上的标准功能 - 更不用说平板电脑和智能手机。那么,选择,落到USB,当然,在现代消费电子产品的背景下,当然远远超过RS-232。但是,嵌入式开发人员并不总是需要USB的复杂功能,更重要的是,当您从串行端口移动到USB时,实现复杂性在Quantum Leap中进行。

幸运的是,对于普通的EFM8开发人员来说,嵌入式USB连接的路径已经被硅实验室的专家清算和调整。在此项目中,我们将使用VCPxpress库,这大大简化了在Windows和EFM8微控制器之间建立虚拟COM端口(VCP)连接的过程。VCP功能非常适用于需要简单通信链路的嵌入式项目,因为USB设备枚举为COM端口,因此可以使用标准串行端口软件例程传输和接收字节。

该项目的基本目标是在PC和EFM8微控制器之间成功建立VCP通信。我们将使用scilab脚本将ASCII数据发送到EFM8,然后EFM8将使用讨论的技术在LCD上显示相应的字符前一篇文章

端口I / O

端口I/O配置与我们在前一篇文章中使用的配置相同。

除了芯片选择信号之外,SPI信号映射到适当的端口引脚,我们通过P0.1手动推动。我们无需直接为USB数据线配置端口引脚;所有USB外设初始化都通过VCPxpress库完成。

外设和中断

外围设备和中断设置与我们前面使用的类似:SPI配置用于与LCD模块通信,Timer4用于短延迟。我们在这个项目中不使用Timer2,因为我们不需要帧速率。相反,只要微控制器接收到USB数据包,LCD就会更新。

固件

为上一个项目开发的低级LCD接口也用于此项目。当EFM8从PC接收数据包时,它会清除LCD,然后打印收到的字符。在上一个项目中,LCD显示器根据内存限制仅限于前60行;此时间仅使用40行,因为VCPxPress库需要额外的RAM。

要在simple Studio中创建VCPXpress应用程序,首先要像往常一样创建一个新项目,然后合并任何现有的源文件或代码块。这里有一个重要的提示:尽管你的直觉可能会说服你,不要选择“USB Library”旁边的复选框:

选中此框将导致Simplicity Studio合并您不需要的库文件和配置代码,更糟糕的是,可以与VCPxpress库冲突。

您需要将VCPxPress库添加到项目中。右键单击“项目资源管理器”窗格中的项目名称,然后选择“属性”。beplay体育下载不了转到C / C ++ General> Paths和符号。选择“库”选项卡并添加vcpxpress.lib:

然后进入“Includes”选项卡,添加VCPXpress include目录:

还有一些文件需要在项目中包含:vcpxpress.h和vcpxpress.lib是库文件,descriptor.h和descriptor.c涉及初始化USB接口。您可以在压缩项目文件中找到所有四个:

USBVCPCommunication.zip

另外一个项目配置提示:当你构建一个VCPXpress项目时,很可能(也许是确定的)你会得到一些类似这样的链接器警告:

这些警告并不一定意味着您的代码存在问题,您可以按如下方式抑制它们:右键单击项目名称,然后选择“属性”。转到C / C ++构建>设置并选择“工具设置”选项卡。点击“keil 8051链接器”下的“杂项”和粘贴“(?pr?_usb_writefifo?efm8_usbdep!*,?pr?_usbd_read?efm8_usbd!*,?pr?_usbd_write?efm8_usbd!*,?pr?_vcpxcore_write?vcpxpress!*)“进入”其他标志“文本框:

如果你点击“Keil 8051链接器”,你应该会看到:

令人惊讶的是,实现VCPXpress基本功能所需的代码很少。一个函数调用需要初始化USB接口,一个调用需要配置USB中断处理程序:这两个都可以在USBVCPCommunication_main.c中找到。处理接收的USB数据包的代码在USBInterface.c:

vcpxpress_api_callback(myapicallback){uint32_t api_interruptcode;//获取指示中断API_INTERRUPTCODE = GET_CALLBACK_SOURCE()的代码;//如果(api_interruptcode&device_open)刚刚打开USB连接){//启动第一个USB读取过程block_read(usbrxpacket,usb_packet_size,&usbbytesreceived);/ *当我们使用rx_complete中断代码* /}(api_interruptcode&rx_complete)// usb读取完成{/ *此标志在usbvcpcommunication_main.cn中处理收到的USB中的回调时,我们将处理收到的字节数据包* / usb_packet_received = true;//继续下一个USB读取过程block_read(usbrxpacket,usb_packet_size,&usbbytesreceived);}}

如上面代码所示,USB事件通过此“回调”函数处理。回调函数类似于中断服务例程(ISR)。发生中断事件时,硬件会导致处理器在ISR中执行代码。回调基本上是一个更高级别的软件驱动的ISR:中断事件由库处理,如果事件需要来自应用程序固件的注意力,则库将处理器指向回调函数。

block_read()函数用于启动从PC接收数据的过程。当接收到USB数据包时,固件将执行vcpxpress_api_callback(),中断代码将指示已准备好处处理USB数据。

“EFM8UB1外设驱动程序库”为函数和宏提供文档,通过您的代码与VCPxpress库交互。您可以通过单击Simplicity Studio中的“软件文档”来访问此信息:

USB设备需要USB主机

我们可以使用简单的终端程序发送和接收VCP数据,但我们将使用Scilab而不是基准Scilab-to-EFM8接口将派往未来的项目中派上友好。您需要下载Scilab串口库;安装和使用库的说明包含在下载的zip文件中。以下代码用于向EFM8发送ASCII字符串:

COMPort_Number = 4;cd“C: \ Program Files \ scilab-5.5.2 \”;exec(“C: \ Program Files \ scilab-5.5.2 \ slLoadLib.sci”);clc ();EFM8Port = slMount ();slConfig(EFM8Port, 115200, 8, 0, 1);return_val = slOpen(EFM8Port, COMPort_Number);printf("无法打开COM端口%d\n", COMPort_Number);slUMount (EFM8Port);slUnload (); else while 1 CharsToSend = input("Send this string to the EFM8:", "string"); if(CharsToSend == " ") break; end slSendArray(EFM8Port, ascii(CharsToSend), length(CharsToSend)); end slClose(EFM8Port); slUMount(EFM8Port); slUnload(); end

usb_string_to_efm8.zip.

运行脚本时,scilab控制台被清除,并提示您输入“将此字符串发送到EFM8:”(请记住,此处提供的固件仅支持26个大写字母和空格字符)。输入一些文本,然后按Enter键发送。脚本重复提示新字符串,直到在不输入任何其他字符的情况下按返回键。

测试系统

以下是测试通信链接的过程:

  • 构建“USBVCPCommunication”项目并将代码加载到EFM8中。
  • 断开插入标有“DBG”的连接器的迷你USB电缆连接,然后将电源开关移动到“USB”。
  • 将USB电缆从计算机连接到Micro USB连接器(靠近操纵杆)。
  • 在Windows设备管理器中查找VCP连接的COM端口号,并相应地修改Scilab脚本。

  • 运行scilab脚本并键入要发送的一些字符。按ENTER后,字符应显示在LCD上。

下一篇文章:如何使用EFM8微控制器在LCD上显示图像

为自己提供这个项目!得到BOM.

1条评论
  • Wouter Visee 2019年3月27日

    一个注意事项,这不仅仅是任何EFM8,这仅适用于通用蜜蜂(有能力的)EFM8芯片。

    喜欢的。 回复