分享下几年前的USB学习笔记
www.usb.org
有的USB芯片虽然符合2.0协议,但是不支持高速模式,所以选芯片时一定要注意。
USB低速模式,采用的是电压传输模式,而在高速模式下采用的是电流传输模式。 USB使用NRZI编码,当数据为0时电平翻转,当数据为1时电平不翻转。未防止长时间电平不翻转,所以在数据发送前会进行位填充处理。 一般USB都是4根线,后来有了5根线,也就是USB OTG,多出来的那根线叫ID线,用来身份识别(主机/从机)。 USB标准中规定了信号线的颜色 Vbus为红色,D-为白色,D+为绿色,GND为黑色。
USB集线器端的D+和D-都会有一个15K下拉电阻,设备端通过D+还是D-接1.5K上拉电阻来判断速度。 一般USB芯片都会内部集成1.5K上拉电阻,来实现软连接。
低速设备:D-接1.5K上拉电阻全速和高速设备:D+接1.5K上拉电阻,USB高速设备先被识别为全速设备,然后通过集线器和设备的互相确认,再切换到高速模式; 在高速模式下,是电流传输模式,这时候需要将D+上的1.5K上拉断开。新增加的描述符
Device Qualifier DescriptorOther Speed Configuration Descriptor 配置和接口都是人为抽象出来的概念,方便更好地管理端点。 一个设备可以有多个配置,但是同一时刻只能有一种配置生效。每个配置下又可以有多个接口。 总结:由端点构成一个接口,由接口又构成一个配置,由配置构成设备。在USB系统中,主机处于主导地位,所以把主机到设备的数据叫做输出,从设备到主机的数据叫做输入。
主机复位设备,复位后的设备地址都为0主机获取设备描述符,此时主机只会读取一个数据包的设备描述符(标准设备描述符有18字节,而有些设备的端点0大小不足18字节,但至少有8字节,) 此时,主机知道了端点0的最大包长度。主机再次复位设备(将总线设置为SE0状态大约10ms来实现) SE0状态:由于USB使用的是差分数据线,通常都是一高一低的,而SE0是一种都为低的特殊状态。主机往地址0的端点0发送一个地址设置请求,以设置设备的通行地址。设备收到后进入到状态过程,等待主机请求状态返回主机请求状态返回,设备返回0长度的数据包主机发送应答ACK包给设备,设备收到ACK后,开始启用新的设备地址后面的所有通信都在新的地址进行主机用新的地址重新获取设备描述符,这次需要获取全部的设备描述符(可能由于设备端点0的最大包长度不足18字节,主机会发送多个IN令牌包)主机获取配置描述符(配置描述符总共9字节)主机根据配置描述符中锁描述的配置集合总长度,获取配置集合(配置集合包含:配置描述符,接口描述符、类特殊描述符、端点描述符)。类特殊描述符合端点描述符必须跟随配置描述符以集合的方式一起返回,不能单独获取获取字符串描述符、HID(Human Interface Device)设备还有报告描述符等。USB是串行总线,LSB方式一位一位传输,原始数据在发送到总线上之前需要进行未填充和NRZI编码(当然这些都是由PHY完成)。 总线上的数据以包为基本单位,所以一个数据包必然有包标识符PID(Packet Identifier)和包结束符EOP(End of Packet)。
PID总共有8bit,USB协议之用了4位(PID0-PID3),另外4位(PID4-PID7)是PID0-PID3的取反,用来校验PID。
PID类型PID名PID[3:0]说明令牌类(tocken)OUT0001B (01)通知设备将要有输出数据令牌类(tocken)IN1001B (09)通知设备将要有输入数据令牌类(tocken)SOF0101B (05)通知设备这是一个起始包令牌类(tocken)SETUP1101B (0D)通知设备将要开始一个控制传输数据类(data)DATA00011B (03)不同类的数据包数据类(data)DATA11011B (0B)不同类的数据包数据类(data)DATA2*0111B (07)不同类的数据包 (USB2.0新增)数据类(data)MDATA*1111B (0F)不同类的数据包 (USB2.0新增)握手类(handshake)ACK0010B (02)确认握手类(handshake)NAK0001B (01)不确认握手类(handshake)STALL1110B (0E)挂起握手类(handshake)NYET0110B (06)未准备好,只有高速模式下,表示本次数据成功接收,但是没有能力接收下一次传输特殊类(special)PRE1100B (0C)前导(这是一个令牌包)特殊类(special)ERR*1100B (0C)错误(这是一个握手包)(USB2.0新增)特殊类(special)SPLIT*1000B (08)分裂事务(这是一个令牌包)(USB2.0新增)特殊类(special)PING*0100B (04)PING测试(这是一个令牌包)(USB2.0新增)特殊类(special)-0000B (00)保留SETUP令牌包只用在控制传输 setup令牌包后只能使用DATA0数据包,且只能发送到设备控制端点0,并且设备必须接收,而OUT令牌包则没有这些限制。 IN令牌包用来通知设备返回一个数据包。 SOF令牌包 4个令牌包中,只有SOF令牌包之后不跟随数据传输,其他的都有数据传输。
之所以有不同类型的数据包,是用在当握手包出错是纠错,比如当数据包成功发送或者接收时,数据包类型切换。
握手包用来表示一个传输是否被对方确认。
PRE是通知集线器打开其低速端口的一种前导包。pre只使用在全速设备中,平时,为了防止全速信号使低速设备误动作,集线器是没有将全速信号传递给低速设备的。只有当收到PRE令牌时,才打开其低速端口。接着主机会以低速模式给低速设备发送令牌、数据等。 PRE令牌包结构图
同步域8位PIDEOPPING令牌包 PING令牌包与OUT令牌包具有一样的结构,但是PING令牌包后并不发数据,而是等待设备返回ACK或者NAK,以判断设备是否能够传送数据。 只有在USB2.0的高速环境中才会使用PING令牌包,它只被使用在批量传输和控制传输的输出事务中,PING命令可以在下位机处理速度慢的情况下测试设备当前是否有空间接受数据,避免直接使用OUT令牌包,既浪费了总线带宽,又白白传送了数据。
这么多数据包一般的USB接口芯片都会完成,如CRC校验、位填充、PID识别、数据包切换、握手等协议处理。
批量传输包含三个阶段:令牌包阶段、数据包阶段、握手包阶段。通常用在数据量大,但对实时性要求不高的场景中,如打印机、大容量存储设备等。 批量传输没有规定数据包中数据的意义,具体的数据结构由设备自己定义。 批量输出事务 step1、主机发出一个OUT令牌包;包含设备地址、端点号 step2、设备返回数据,NAK(没有数据返回,主机会再稍后重试),STALL(端点处于挂起状态),无任何响应(检测到有错误,等待主机自动超时)。 step3、主机返回ACK(成功接收),无任何响应(检测到错误,等待设备自动超时)。 批量输入事务 step1、主机发出一个IN令牌包;包含设备地址、端点号 step2、主机切换到数据接收状态,等待设备返回数据。 step3、主机切换为接收模式,等待设备返回握手包。
中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于这个时间间隔的范围内安排一次传输。 中断传输通常用在数据量不大,但是对时间要求较严格的设备中,如HID设备(键盘,鼠标) 中断传输流程和批量传输基本上一样,只是没有NYET和PING两种包。
等时传输用在数据量大,对实时性要求高的场合,如音频设备,视频设备等。等时传输对数据的100%正确要求不高,所以当数据错误时,并不要求重传操作,因此等时传输没有应答包。
控制传输与前面3中相比,稍微复杂些。 包含3个过程:建立过程,数据过程,状态过程。
主机使用SETUP令牌包,数据只能使用DATA0包,设备只能使用ACK或者不应答(出错了)。
数据过程是可选的,可包含0个或多个数据事务,在数据事务中,所有的数据事务必须是同一个传输方向的。 数据过程的第一个包必须是DATA1包,然后每次正确传输一个数据包后就在DATA0和DATA1之间交替。
传输方向刚好和数据过程相反; 状态过程只使用DATA1包。
一个具体的端点,只能工作在一种传输模式下。 每个端点描述符中都规定了端点所支持的最大数据包长度。 控制传输的端点:低速模式最大包长固定为8字节,高速模式最大包长固定为64字节,而全速模式可在8、16、24、32、64字节中选择。 等时传输:低速模式不支持等时传输,全速模式最大包长上限是1023字节,高速模式最大包长上限是1024字节。 中断传输:低速模式最大包长上限是8字节,全速模式最大包长上限是64字节,高速模式最大包长上限是1024字节。 批量传输:低速模式不支持批量传输,全速模式最大包长可在8、16、24、32字节中选择,高速模式最大包长上限是512字节。
