USB硬件接口
1、Type —— Type A(普通PC端)、Type B(USB设备的接口)、Type C(属于USB3.0)
2、Mini —— Mini A、Mini B(数码相机、移动硬盘等移动设备)
3、 Micro —— Micro A、MicroB(手机等移动设备),属于USB2.0
USB模式
1、USB HOST模式
2、USB OTG
USB OTG是USB2.0的补充规范,即可做host,也可做device,主要通过USB ID电平来切换角色
USB体系
1、USB host 主机
2、USB device 设备
—— USB HUB(USB接口扩展方法)
—— USB function(HID、mass device、imaging device)
3、USB interconnect 物理连接
USB设备插入识别
通过两根端口数据线(D+、D-)判断,当有设备插入时,其中一根数据线的电平会被拉高,若D+拉高,则是全速或高速设备,D-拉高则是低速设备
STM32 USB IP分类
1、USB IP
可做全速或低速USB 设备, 512字节Packet buffer SRAM
2、USB+ IP
可做全速或低速USB设备,1024字节Packet buffer SRAM,有USB低功耗管理,USB DP 线上有可控嵌入式上拉电阻,控制USB的连接与断开
3、OTG IP
—— FS OTG IP
可做全速或低速USB主机,全速USB设备
—— HS OTG IP
可做高速、全速和低速USB主机,高速或全速USB设备
USB IP 模块功能图
SIE:硬件识别同步信号、进行比特填充、产生以及校验CRC、产生以及验证PID、握手,根据外设事件来产生SOF、复位信号
Arbiter(仲裁器):接收和处理来自APB1或USB的memory request
Packet buffer interface:一组收发Packet buffer,来管理本地的512字节Packet buffer memory
USB的端点地址设置规则
USB的每个EP对应的位置地址和其大小都通过buffer描述表来指定,该buffer描述表也位于Packet buffer memory里面,其地址由USB_BTABLE寄存器指定。每个EP描述符占用4个半字(即8个字节),描述的信息有该EP TX的地址和大小以及EP RX的地址和大小
举例
如果:USB设备使用三个端点:EP0的IN、OUT,EP1的IN、EP2的OUT,
且 #define BTABLE_ADDRESS (0x00) 即端点描述表从地址0x00开始
由于有3个双向端点,故描述表的大小为 3*8 = 24个字节,即0x18
因此:EP0 的起始地址 RX_ADDR应为0x18 #define ENDP0_RXADDR (0x18)
此时如果再指定接收的缓冲区大小为0x40 SetEPRxCount(ENDP0, 0x40)
则EP0 的TX_ADDR应该为0x58 #define ENDP0_TXADDR (0x58)
同理,如果发送缓冲区的大小也为0x40
则EP1的起始地址RX_ADDR应该为0x98 #define ENDP1_RXADDR (0x98)
EP2也以此类推
双缓冲端点
当某个批量类型的EP被使能为“双缓冲”后,该EP只能作为单向端点使用(发送或接受),其发送Packet memory和接收Packet memory都可以被使用
USB中断处理
usb_dcd_int.c:void USB_Istr()函数,在该函数里有一条语句 wIstr = _GetISTR(),之后根据wIstr读出的中断标志调用相关的函数;当读出中断标志是CTR中断标志时调用 CTR()函数
void CTR():获取EP ID,如果是端点0,判断是IN包还是OUT/SET UP包,分别进行处理;如果是非0端点,调用其GetInReport处理函数或GetOutReport函数