LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

stm32-usb-vpc-hs

2022/4/10

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);

打开串口调试助手,查看发送是否能接收到一样的数据即可。