赞
踩
首先看初始化函数吧
USBD_Init(&USB_OTG_dev,USB_OTG_FS_CORE_ID,&USR_desc,&USBD_CDC_cb,&USR_cb);
void USBD_Init(USB_OTG_CORE_HANDLE *pdev, USB_OTG_CORE_ID_TypeDef coreID, USBD_DEVICE *pDevice, USBD_Class_cb_TypeDef *class_cb, USBD_Usr_cb_TypeDef *usr_cb) { /* Hardware Init */ USB_OTG_BSP_Init(pdev); USBD_DeInit(pdev); /*Register class and user callbacks */ pdev->dev.class_cb = class_cb; pdev->dev.usr_cb = usr_cb; pdev->dev.usr_device = pDevice; /* set USB OTG core params */ DCD_Init(pdev , coreID); /* Upon Init call usr callback */ pdev->dev.usr_cb->Init(); /* Enable Interrupts */ USB_OTG_BSP_EnableInterrupt(pdev); }
1、USBD_Init 来自于usbd_core.c(这个文件中写了USB的核心功能)
2、USB_OTG_BSP_Init 来自于usb_bsp.c
3、USB_OTG_FS_CORE_ID 代表全速
4、USR_desc 来自于usbd_desc.c
5、USBD_CDC_cb 来自于usbd_cdc_core.c(这个文件里有很多usb传输的重要函数)
6、USR_cb 来自于usbd_usr.c
下图是STM32F429官方USB例程里添加的文件
STM32F429使用的是USB2.0,支持低速、全速、高速,但是由于STM32内部没有集成高速PHY,所以目前只能使用全速,如果要使用高速模式就得自己设计一个高速PHY电路。他们的速度如下表:
速度模式 | 速度 |
---|---|
低速 | 1.5Mbps |
全速 | 12Mbps |
高速 | 480Mbps |
超速 | 5Gbps ( USB3.0 ) |
那么,USB设备是怎么区分速度的呢?
一般,在USB主机的DP(D+)、DM(D-)都接了下拉15K欧电阻。
对于低速设备,DM(D-)接了上拉1.5K欧电阻。
对于全速设备,DP(D+)接了上拉1.5K欧电阻。
对于高速设备,一接在主机的时候DP(D+)接了上拉1.5K欧电阻,后面经过握手协议之后,DP(D+)上断开1.5K欧电阻。
USB传输一定是主机发起的,USB的程序也是站在主机的角度编写的,这可能就是那么多RX表示STM32发送数据的原因吧!
USB传输主要是靠着“数据包”来传输的,包的组成如下(并不是所有的包都具有一下5部分):
包的分类主要是有PID 决定的:
PID类型 | PID名称 | 包的种类 |
---|---|---|
Token (令牌) | OUT、IN、SETUP、SOF | 令牌包 |
DATA (数据) | DATA0、DATA1、DATA2、MDATA | 数据包 |
Handshake (握手) | ACK、NAK、STALL、NYET | 握手包 |
Special (特殊) | PRE、ERR、SPLIT、PING | ------ |
USB传输时最基本最简单的流程为:主机发送令牌包给从机------->从机发送数据包给主机------->主机发送握手包给从机。
令牌包: 主机发命令
OUT | 主机到设备 |
IN | 设备到主机 |
SETUP | 主机到设备,只能发送到控制端点且设备必须接受,后面只能用DATA0数据包返回 |
SOF | 帧起始包(Start-of-Frame-Packets)不会导致任何返回,全速时约1ms发一次,高速约125us发一次 |
令牌包中没有帧号和数据部分。每个令牌包需要以EOP分隔,否则认为是无效命令。
数据包: 从机返回数据
握手包: 用来做应答
ACK | 传输正确完成 |
NAK | 未准备好发送数据或未准备好接收数据 |
STALL | 不能进行传输 |
NYET、ERR | 设备未准备好、出错(高速时) |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。