当前位置:   article > 正文

STM32 USB学习整理1_usbd_init

usbd_init

STM32 USB学习整理1

首先看初始化函数吧
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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设备未准备好、出错(高速时)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/482229
推荐阅读
相关标签
  

闽ICP备14008679号