上一节我们讲了USB的电气信号,今天我们讲帧的组成内容;请注意,USB通信中的“帧”相当于串口通信中的“字节”。在常见的串口,I2C,SPI等等,均以字节为单位,通过分析字节组成的数据得到信息;USB以帧为单位,通过帧组成的数据得到信息,不完整的帧组成的信息没有任何意思,直接丢弃。
帧的组成
一个完整的帧是由SOP+SYNC+包内容+SOP组成的,缺其中任何一个都可以认为是异常帧,丢掉不用即可。
包内容又与PID相关,PID类型分为四种,令牌包,数据包,握手包和特殊包;接下来详细论述下这几个类型包的组成部分。
Token令牌包
从下图IN/OUT/SETUP包的帧格式可以清楚地知道,设备地址是7Bits,所以地址范围为0-127,最多接入128个设备;LS设备最多3个端点,FS/HS设备最多16个端点。
SOF帧没有设备地址和端点号,被帧编号替换;帧编号由11个字节组成,主机每发出一个帧,帧编号自动加1;当帧号达到0x7ff时,将归零重新开始。
LS/FS每1ms发送一次SOF帧
HS每125us发送一次SOF帧
令牌包CRC5的计算多项式为:G(X) = X^5 + X^2 + 1;
CRC仅仅计算地址域(IN/OUT/SETUP的设备地址和端点地址)和帧编号(SOF的帧编号)的CRC,不对SYNC和PID做CRC计算。
数据包
数据包不带地址信息,根据包在做的发送类型不同,数据包最大长度也不相同,如图也做了规范;
数据包CRC5的计算多项式为:G(X) = X^16 + X^15 + X^2 + 1;
CRC仅仅计算数据域的CRC,不对SYNC和PID做CRC计算。
握手包
握手包是非常简单的,只有PID,没有地址,端点号,数据,CRC等内容;只是回复ok/fail/stall等信息。
握手包的响应
在USB2.0协议中规定,全速设备的握手包分别有三种ACK,NAK和STALL。
ACK:表示肯定的应答,数据传输成功,由主机或设备发出;对于IN包来说是主机收到了设备端的数据,可以进行下一次的数据传输;
NAK:表示否定的应答,数据传输失败,由主机或设备发出;对于OUT包来说是设备接收主机的数据失败,此时主机可以进行重发请求;
STALL:表示功能错误或端点被设置了STALL属性,一般由设备发出;表示该设备不支持这个请求,或者无法发送和接收数据;协议STALL握手包表示设备不支持这个协议;功能STALL握手包表示,设备的端点已经停止,因此无法完成发送数据或接收数据的操作。
主机接收到NAK包后,说明设备是完整的;主机只要重发就行,设备总会收到;接收到STALL包后,说明端点已经停止,此时只能重新枚举此设备;笔者曾经做CDC设备设备时,接收到STALL包后,就再也无法通信的,只能重新枚举解决。有高手知道出现STALL包后的解决方案,可以在评论区告诉,先行感谢!
结语
USB标准统一,可以连接多个设备;所以一出来就迅速占领了市场,我们的生活现在也基本离不开它了;帧格式是USB协议中非常重要的一环,他的传输都是通过这个些帧组合起来的,大家可以仔细阅读下;下一章节我们将继续介绍USB的控制传输,BULK传输,中断传输和同步传输。好了,今天就先写到这里,有什么需要讨论的,请在评论区告诉我,谢谢大家!
标签:协议,USB,主机,嵌入式,CRC,STALL,端点,设备 From: https://blog.csdn.net/zhaohuiacuicui/article/details/140550909