USB 协议版本有USB1.1、USB2.0,而目前公布的最新USB协议USB3.0,主要由于数据线的增加USB3.0 数据传输速度有了很大的提高。对于 USB1.1 协议支持低速模式(1.5Mb/s)、 全速模式(12Mb/s),而 USB2.0协议还支持高速模式(480Mb/s)。不同的器件对 USB 协议的支持是不一样的。而我们应用的STM32的USB协议的解释都是基于USB2.0全速模式的。
2、USB线缆
USB线缆中的四个金属触点对应的导线V BUS为5V电源线,GND为电源地线,而D-和D+ 组合成一组差分数据线。D-和D+这一组差分数据线,在一个时刻只能传输一路信号,这也决定了USB2.0的全速模式只能是半双工的通讯方式。
注:在 USB 主机上,D-和 D+都是接了 15K 的电阻到低的,所以在没有设备接入的时候,D+、D-均是低电平。而在 USB 设备中,如果是高速设备,则会在 D+上接一个 1.5K 的电阻到 VCC,而如果是低速设备,则会在 D-上接一个 1.5K 的电阻到 VCC。
3、USB主机与设备
在 USB 的通讯模型中要严格区分USB主机(Host)与USB设备(Device) ,因为在USB的通讯中,有且只有一个主机。当检测到有 USB 设备接入时,首先由主机发起第一次通讯。
一个 USB 主控器同时最多可支持127个设备,这是由于USB协议中规定USB设备接入后,主控器会给它分配一个 7 位的设备地址,以后就使用该地址进行通讯,所以使用 USB 集线器能扩展接口,但无法扩展主控器可支持设备数目的上限。
注:STM32F103系列芯片的USB控制器外设仅可以作为USB设备的控制器,而不能用于USB主机控制器。在STM32F105、STM32F107系列芯片中的 USB 控制器称为“USB OTG全速控制器(OTG FS)”,它带有OTG(on the go)功能。OTG是 USB2.0协议中规定的双重角色功能,这种控制器仅可作为USB 的主机端,也可以作为 USB 通讯中的设备端。
4、USB传输类型
控制传输类型(Control Transfers):突发、非周期的传输,主要用于传输命令和状态消息。端点0一般就被配置为控制传输。
同步传输类型(Isochronous Transfers):周期性、持续的传输,常用于与时间相关的事件、信息的传送。例如音频设备中的音频数据。
中断传输类型(Interrupt Transfers):传输频率低、数据量小的传输。如鼠标、键盘设备的控制信息。
批量传输类型(Bulk Transfers):非周期性的,大数据量的传输。例如如 USB 存储器。
5、USB枚举
(1) 为了获得设备描述符,主机首先使用地址0,向接入的设备发送 USB 标准请求:Get Device Descriptor(获取设备描述符)。正常时,设备会给主机返回它自己的设备描述符,但由于第一次通讯不知道端点0支持数据包的最大长度,所以主机只能通过设备描述符中的第8个字节了解设备端点0的最大数据包长度,这8个字节以外的信息还没法了解。
(2) 主机为设备分配一个新地址,把这个地址存放到标准请求Set Address(设置地址)中,发送这个请求给设备,设备保存该地址,以后的通讯就使用这个新地址。
(3) 主机重新向设备发送Get Device Descriptor(获取设备描述符) 请求,这次主机会完全读取设备返回的设备描述符,了解设备的信息。
(4) 主机向循环设备发送Get Device Configuration(获取配置描述符)请求,获得设备的配置描述符、接口描述符、类特殊描述符、端点描述符。
(5) 主机发送Get Device String(描述字符集) 获取厂商 ID、产品描述、型号等信息。
(6) 若 USB 能提供该设备的驱动,主机向设备发送Set Configuration(选择设备配置)请求设备进入某个配置状态。
(7) 建立通讯。
注:1-3属于底层文件,4-6属于中层文件,这些文件用户是不需要进行改动的。在不同的 USB 应用中,用户可能需要对 USB 固件库的上层部分文件配置进行修改(主要为 usb_prop.c和 usb_endp.c文件)。
(1)usb_int.c,本文件包含两个中断服务函数 CTR_LP()和 CTR_HP(),在接收发送中断时使用这两个函数进行处理,这两个函数主要又调用各个 USB 端点的处理函数,端点处理函数由用户根据自己的需要自定义。
(2)usb_regs.c,本文件是硬件抽象层。它含有各种用于读取或设置 USB 寄存器的函数,相当于对寄存器操作方法的封装。
(3)usb_mem.c,本文件主要负责进行数据传输处理。它的函数主要负责数据在用户区域(内存)或 USB 数据包缓冲区的互相转移。
(4)usb_core.c,本文件主要负责 USB 协议管理,如 USB 标准请求、各种端点 0 的控制信息处理。
(5)usb_init.c,本文件主要包含了 USB 初始化的函数。
(6)usb_sil.c,本文件包含精简接口的初始化或向端点读写的操作函数。
(7)usb_pwr.c,该文件中包含处理上电、调电、挂起和恢复事件的函数。
(8)usb_istr.c,该文件中只有一个函数,即 USB 中断的 USB_Istr 函数,该函数对各类引起 USB 中断的事件作轮询处理。
(9)hw_config.c(usb_conf.c),该文件中包含系统配置的函数,包含基本的时钟配置、中断配置和存储器初始化函数。
(10)usb_desc.c,该文件包含一些与 USB 相关的设备描述符、配置描述符等,以数组形式存储,在 USB 主机请求的时候,这些信息会发送给主机。
(11)usb_prop.c,该文件用于实现相关设备的 USB 协议,例如初始化、SETUP 包、IN包、OUT 包等等。
(12)usb_endp.c,本文件包含端点收、发送的处理函数,由用户根据不同的 USB 设备进行不同的定义。
图表 1 USB固件库文件关系图
调用库函数RCC_USBCLKConfig()把 USB 的时钟预分频设置为 1.5,USB的时钟是由PLLCLK分频得来的,我们实验配置的PLLCLK为72MHz,1.5分频后正好为 48MHz 作为 USB 外设的时钟。调用 RCC_APB1PeriphClockCmd()函数使能 USB 外设的时钟,这时 USB 外设就运行起来了。
1、USB 低优先级中断(通道 20):可由所有 USB 事件触发(正确传输,USB 复位等)。固件在处理中断前应当首先确定中断源。
2、USB 高优先级中断(通道 19):仅能由同步和双缓冲批量传输的正确传输事件触发,目的是保证最大的传输速率。
3、USB 唤醒中断(通道 42):由 USB 挂起模式的唤醒事件触发。
图表 2 USB设备框图
BOT (Bulk Only Transport),译为仅批量传输协议,它是 USB 的子类协议。它只使用USB 传输模式中的批量传输通道进行命令、状态、数据的传输,没有中断和控制通道。建立了传输后(即枚举后),默认的端点 0 只用于清除批量管道的状态和发送 Mass Storage 复位、Get Max Lun 这两个请求。
在 BOT 协议中使用 CBW 格式发送命令,用 CSW 格式发送命令状态。