【极海APM32F407 Tiny Board】3. USB虚拟串口(CDC)测评
[复制链接]
USB 外设是APM407中比较复杂的外设之一了。能彻底搞懂需要花费大量时间,OTG分为主机和从机,我先从从机入手,测试验证它的虚拟串口功能。
CDC类是目前比较实用的功能了。在项目中可以用得到,我只要一跟数据线,就可以用PC对设备进行固件升级和查看日志打印等。
SB2.0标准下定义了很多子类,有音频类,CDC类,HID,打印,大容量存储类,HUB,智能卡等等,这些在usb.org官网上有具体的定义,这里主要介绍通信类CDC。USB CDC类的通信部分主要包含三部分:枚举过程、虚拟串口操作和数据通信。
APM32F4xx 中的 OTG 符合 USB2.0 规范, 且符合 On-The-Go 补充标准。 在常规的 USB中,从机和主机身份相对固定,数据传输的控制都由主机处理和发起。而 OTG 则可以让器件在从机和主机中转换, 既可以当主机,也可以变换为从机。 OTG 常应用于设备与设备之间的交互, 例如打印机和相机之间,手机和 U 盘之间都可以利用 OTG 进行数据交互。
APM32F407 作从机时,可用的 IN 端点有 4 个, OUT 端点有 4 个,合计 8 个端点。 端点 0比较特殊,仅作为控制端点。 作为从机时支持全速和高速,其中,高速控制器拥有两个接口, 其中有个内嵌的高速 PHY, 可以减少外围设备的设计。
这里不得不表扬一下Geehy, 对比有商 GD32F407(无高速USB),GD32F450,GD32F470 (有HS USB,但是需要外置USB3300 芯片),Geehy 的USB外设集成度非常高,做的很优秀。
如何使用USB外设呢?第一步还是要进行初始化:
使用了一个非常抽象的回调函数。实际上是执行了以下函数:
2. 在主循环中就可以发送和接收数据了:
其中虚拟串口操作部分并不一定强制需要,因为若跳过这些虚拟串口的操作,实际上USB依然是可以通信的,这也就是为什么上图中,在操作虚拟串口之前会有两条数据通信的数据。之所以会有虚拟串口操作,主要是我们通常使用PC作为Host端,在PC端使用一个串口工具来与其进行通信,PC端的对应驱动将其虚拟成一个普通串口,这样一来,可以方便PC端软件通过操作串口的方式来与其进行通信,但实际上,Host端与Device端物理上是通过USB总线来进行通信的,与串口没有关系,这一虚拟化过程,起决定性作用的是对应驱动,包含如何将每一条具体的虚拟串口操作对应到实际上的USB操作。需要注意的是,Host端与Device端的USB通信速率并不受所谓的串口波特率影响,它就是标准的USB2.0全速(12Mbps)速度,实际速率取决于总线的实际使用率、驱动访问USB外设有效速率(两边)以及外部环境对通信本身造成的干扰率等因素组成。
实际上, USB 从机模式下的枚举和通信基本都依靠中断, 即使在轮询中调用了收发 USB 数据的函数, 最终也是会通过中断处理数据传输。
发送数据接口函数:USBD_STA_T USBD_HS_CDC_ItfSend(uint8_t *buffer, uint16_t length);
测试发现,不管串口的波特率设置为多少,都可以正常收发数据:
最后,全速仿真运行即可。
总结:USB OTG 外设的内容非常丰富,集成了高速phy,在同类M4内核产品对比中都是非常优秀的!
|