STM32-USB-VPC-HS
简介
USB(Universal Serial BUS),通用串行总线
由四根线VCC、GND、D+(DP)、D-(DM)组成
前两个是电源线,后两个是差分传输数据线。
Communication Devices Class(Virtual Port Com)虚拟串口是USB通信的一种方式
另外还有HID(Human Interface Device),例如你的鼠标键盘。
(如果要详细了解USB通信,推荐一个公众号–鱼鹰谈单片机)
电路实现
STM32内部可以实现全速OTG,只需要将DP、DM对应的引脚接到USB接口对应的引脚即可。
但是如果要实现更高速的高速OTG,,则需要外接高速PHY,并且接线也不同。
为了调试方便,一般会将USB的数据线经过芯片HS8836A(可以理解为拓展坞),引出多路输出,
一些用于调试,一些用于主要通信。
外部高速PHY可以选用USB3300-EZK-TR,
USB的DP、DM数据线作为它的输入,采用ULPI协议,
输出8个数据位和STP、DIR、CLK、NXT
ULPI协议的信号定义如下:
DATA:8-bit双向数据总线
NXT:next,当连接设备发送数据时,NXT=1代表被接受,当连接设备接受数据时,NXT=1总线上有数据
CLK:clock,时钟
DIR:direct,用于确定数据总线方向
STP:stop,用于停止PHY的输出
将上述的12个引脚分别接到STM32,
以STM32F405RGT6为例,参照手册,引脚对应如下
PC0(OTG_HS_ULPI_STP) ---- STP
PC2(OTG_HS_ULPI_DIR) ---- DIR
PC3(OTG_HS_ULPI_NXT) ---- NXT
PA5(OTG_HS_ULPI_CK) ---- CLK
PA3、PB0、PB1、PB10、PB11、PB12、PB13、PB5(OTG_HS_ULPI_D0~7) ---- DATA0~7
软件实现
采用STM32CubeMX生成代码,主要就是选择
Connectivity>USB_OTG_HS>Device_Only
Middleware>USB_DEVICE>Communication Devices Class(Virtual Port Com)
时钟保证48MHz
一般这样子将代码烧进单片机,电脑就可以识别到虚拟串口了
在设备管理器>端口(COM和LPT)>STMicorelectronics Virtual COM Port
我这边遇到了很多问题,简单记录一下
刚开始是USB设备描述符请求失败,估计是焊接的问题,
但是再加工板子的时候不小心刮掉了阻焊层,VCC和GND连到一起,锡去不掉,只能重新焊另一块板子
焊接完是电脑识别不到,Debug代码发现卡在死在初始化,一步步调试发现选择外部phy超时,
这个外部phy表面上看着焊接得很好,电表测过,怀疑是加热太久芯片坏了,换个新的焊接上去
然后代码不会卡在死循环,正常运行,但是仍然是识别不到,
检查芯片和外部phy的每一个引脚,并将有可能虚焊的引脚全部再加工,终于可以识别了
排错过程参考了一些博客,简单记录:
1.USB时钟配置是否48MHz
2.堆栈设置是否不合适,我都设置为0x800
3.是否没有安装驱动,可以参考:https://blog.csdn.net/weixin_42243510/article/details/88715350
4.是否用了拓展坞,试试直接连接电脑
5.以上都没问题的话,可能是硬件有问题。
回环测试
在生成的代码中找到usbd_cdc_if.c,找到CDC_Receive_HS,接收时会调用这个函数
我们让它把接收到的数据发送出去
添加CDC_Transmit_HS(Buf,*Len);
打开串口调试助手,查看发送是否能接收到一样的数据即可。