STM32 USB学习整理1

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、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设备未准备好、出错(高速时)
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值