一、USB协议介绍1、概述1USB是“Universal Serial Bus Specification”的缩写是一种主从协议支持多个从机所有传输都由主机发起。2USB的硬件线数与串口一致VCC、GND、D、DUSB将数据线作为差分线。3不管是哪种通信协议都有通用的要求USB协议也是如此具体要求如下①位数据的传输由时钟信号驱动。②数据帧至少具有开始标识、数据段和结束标识三部分。③如果要求可靠传输则数据帧必须具备校验字段。2、USB协议硬件电路1USB设备分为低速、全速和高速三种。①USB高速/全速设备标准原理图[1]主机/Hub端D、D各内置15kΩ的下拉电阻到GND。[2]设备端D内置1.5kΩ的上拉电阻到VCCUSB收发器为Full-speed USB Transceiver斜率缓冲为标准速率电平跳变边沿变化快。[3]线缆差分阻抗为90Ω。[4]有USB设备接入主机时D被上拉到高电平D保持低电平主机能够判断有设备接入且是高速/全速设备。②USB低速设备标准原理图[1]主机/Hub端D、D各内置15kΩ的下拉电阻到GND。[2]设备端D内置1.5kΩ的上拉电阻到VCCUSB收发器为Low-speed USB Transceiver带低速斜率缓冲电平跳变边沿变化平缓能够降低EMI干扰。[3]线缆差分阻抗为90Ω。[4]有USB设备接入主机时D被上拉到高电平D保持低电平主机能够判断有设备接入且是低速设备。③USB收发器[1]USB收发器是MCU内部或外部芯片里处理D/D差分电平的模拟硬件模块负责把内部数字比特流转换成USB差分J/K/SE0总线电平输出到D/D同时也负责采D/D差分电压将总线上的比特信号还原给内核。[2]USB收发器内置差分曼彻斯特编码/解码硬件可以自动识别SOP/EOP时序。2USB协议采用差分信号即D、D两线电压差区分总线状态一共有4种静态组合总线状态指示差分1D为高电平D为低电平差分0D为低电平D为高电平单端0SE0D和D为低电平单端1SE1D和D为高电平3USB协议定义了J状态和K状态用于屏蔽不同速度模式的区别为免异义下面如无特殊说明都以高速USB2.0为标准进行介绍。速度模式J状态K状态低速USB1.1差分0差分1全速USB1.1差分1差分0高速USB2.0差分1差分0①总线长期保持J状态代表没有数据传输。②总线长时间超过10ms处于SE0状态主机将下发复位指令设备重启USB控制器。③总线保持K状态一段时间也称为恢复状态将唤醒休眠的USB设备。④总线如果处于SE1状态说明发生硬件故障。4USB的比特传输①USB采用差分曼彻斯特编码传输比特0比特中间位置发生J→K状态翻转传输结束后发送K→J状态翻转传输比特1比特中间位置发生不发生J/K状态翻转保持J状态。②接收方可以从比特0的跳变处提取时钟信号不用单独拉时钟线实现自同步。②与CAN协议类似USB协议也有位填充机制如果连续发送6个比特1硬件会强制插入一个比特0制造一次跳变以同步时钟另外USB收发器会自动识别这个填充位并剔除上层数据帧格式无需关注。3、USB协议的帧格式1数据帧第一层传输格式封装①SOP数据帧的起始标志。总线空闲时处于J状态当要传输数据时总线先切换到K状态这个J→K的跳变就是SOP接收方识别到这段时序判定数据帧传输开始。②DATAUSB不硬性规定数据包的长度数据包格式将在下一层封装中展开。③EOP数据帧的结束标志。数据包传输完成后总线保持两个bit时长的SE0状态然后切换到J状态保持一个bit的时长接收方识别到这段时序判定数据帧传输完毕。2数据帧第二层传输格式封装①PIDPacket ID包类型标识长度为8bit低4位为高4位取反。②Packet根据PID的不同数据帧格式会有差异具体将在下一层封装中展开。3数据帧第三层传输格式封装①令牌PID只能由主机发送是总线调度的核心主要用于发起一次数据传输并指定读或写。IN主机要求从设备上传数据使用该令牌OUT主机要下发数据给从设备使用该令牌SETUP控制传输专用主机配置从设备的参数、枚举ADDR从机设备地址长度为7bitEP端点指明本次数据传输使用的端点通道长度为4bitCRC5使用CRC5根据PIDADDREP计算而得的校验码长度为4bit如果CRC校验不通过接收端会丢弃数据帧②特殊PID主机定时广播1ms发送一次同步总线时序。SOF所有设备都会接收SOFFRAME帧计数器FrameNumber长度为11bit0~2047循环使用CRC5使用CRC5根据PIDFRAME计算而得的校验码长度为4bit如果CRC校验不通过接收端会丢弃数据帧③握手PID只能由从机回复主机时发送从设备收到令牌或数据后回复主机传输状态用于传输应答。ACK从机回复积极响应表示数据传输可继续进行NAK从机回复消极响应表示暂时忙无法处理数据或无数据主机请求的数据不存在数据传输暂时无法进行需要等待从机一段时间STALL从机回复端点出错传输停止需要主机重置④数据PID主机和从机都可发送用于承载上层业务数据紧跟在令牌包后面出现。DATA0上一个发送数据包的PID为DATA1那么本次发送数据包的PID为DATA0数据接收方根据数据PID判断是否存在丢包的情况DATA1上一个发送数据包的PID为DATA0那么本次发送数据包的PID为DATA1数据接收方根据数据PID判断是否存在丢包的情况Payload数据载荷长度不定CRC16使用CRC16根据PIDPayload计算而得的校验码长度为16bit如果CRC校验不通过接收端会丢弃数据帧4、USB设备的通信方式1端点EndPoint的概念①端点是USB设备内部独立的收发缓存通道编号0~15也就是说一个设备最多可用16个通道主机根据设备地址和端点号就能锁定总线上某设备的某一条专用数据通道。②EP0是控制端点只能用于控制传输设备上电后主机只通过EP0和设备通信使用SETUP令牌包完成设备识别、参数配置等。③EP1~EP15是自定义端点每个端点可以绑定中断传输、批量传输、同步传输中的一种传输类型用于传输业务数据。④端点区分IN方向和OUT方向一个端点编号同时存在IN、OUT两条独立通道由令牌PID决定读写方向。主机读设备设备通过IN端点上传数据主机写设备主机通过OUT端点下发数据。2USB的四大传输类型①控制传输唯一绑定EP0端点用于设备枚举、配置、查询设备描述符、复位端点所有USB设备强制支持数据帧出错会自动重传。设备上电后主机通过EP0端点发送SETUP令牌设备回应后主机可以读取设备的描述符识别设备类型加载对应的驱动。②中断传输主机按固定周期定时发IN令牌设备有数据则回复ACK并将数据上报主机无数据则回复NAK数据帧出错会自动重传。适用于鼠标、键盘、按键这类周期性少量上报设备③批量传输总线空闲时主机持续发送IN令牌和OUT令牌尽可能地占用总线带宽带宽优先级低于同步传输和中断传输设备有数据则回复ACK并将数据上报主机无数据则回复NAK数据帧出错会自动重传。适用于U盘、虚拟串口、固件下载等④同步传输主机每隔1ms发送一次SOF帧设备有数据则上报主机无数据则不回复。不同于中断传输的是同步传输无ACK机制允许少量丢包数据帧出错不重传并且带宽优先级高于批量传输和中断传输。适用于音频、摄像头、喇叭这类可接受不可靠传输的设备3USB设备地址①USB是主从架构只有1个主机多个从设备共享一条总线总线所有信号广播发送主机靠ADDR区分目标设备目标设备靠ADDR判断是否需要处理该信号。②每个从设备上电枚举后主机会为其分配唯一的地址范围为1~127。4USB设备的描述符①下图是USB设备所有描述符的层级从属结构示例主机在枚举时通过EP0控制传输逐级读取这套描述符才能识别设备功能、分配驱动、打开对应端点通道。②Device Descriptor设备描述符一个USB设备只有1个设备描述符是主机需要读取的第一个描述符设备描述符存放全局基础信息如USB协议版本、厂商ID VID、产品ID PID、设备版本号主机获取VID/PID以去系统匹配对应的驱动另外全局基础信息还有设备EP0支持的最大包长度、设备支持的配置Configuration种数上图所示的示例中有两套配置③Configuration Descriptor配置描述符一个USB设备可以做多套硬件配置主机上电后只能激活其中一套配置每套配置包含的信息有配置的总功耗、是否能自供电、该套配置包含多少接口④Interface Descriptor接口描述符接口描述符依附在配置下一套配置里可以包含多个接口对应不同的功能接口描述符记录接口编号、备用设置号、设备的类及子类、使用的协议以及接口下包含多少端点⑤Endpoint Descriptor端点描述符端点描述符依附在接口下每个业务端点对应一张端点描述符EP0没有端点描述符端点描述符包含核心传输参数如端点地址EP号IN/OUT方向、传输类型中断/批量/同步、单次最大数据包长度、中断轮询间隔中断传输专用主机读取后就知道访问这个端点该用哪种传输方式、一次最多传多少数据二、STM32中的USB外设1、USB外设简介1STM32内置USB从控制器支持USB全速通信符合USB2.0技术规范。2STM32F103的USB模块实现了标准USB接口的所有特性它由串行接口控制器SIE、定时器、分组缓冲器接口、端点相关寄存器、控制寄存器和中断寄存器等部分组成。3STM32F103C8T6的硬件USB资源只有USB1本文基于STM32F103C8T6进行USB外设的介绍。2、USB外设的数据传输1USB数据传输通过一个专用的数据缓冲区来完成它能被USB外设直接访问其大小由所使用的端点数目和每个端点最大数据分组大小所决定。2每个端点最大可使用512字节缓冲区和CAN外设共用一个专用的512字节SARM存储器也就是说USB外设和CAN外设不能同时使用最多可用于16个单向端点或8个双向端点。3USB模块同PC主机通信根据USB规范实现了令牌分组的检测、数据发送/接收的处理、握手分组的处理整个传输的格式由硬件完成其中包括CRC的生成和校验、位填充机制等程序只需关心报文数据而无需关注总线的电平细节。3、USB框图