walnutcy

USB协议层 --1

0
阅读(6114)


注: 原发表于21ic的读书笔记中,后来发现二姨经常关门,所以现在打算把那边原来的慢慢搬过来,并整理一下,另EDN有一个博客备份,应该可以把以前写的东西都存在电脑上。

如题,边实践边学习,这样才不会空洞.
解析协议,我喜欢从数据流来查,一点一点的来,
位序: USB的位序为LSB,低位在前;
同步字段,就当是一个包的起始标志吧,不用太在意;
物理数据流的 "NRZI编码和位填充NRZI编码和位填充"也先不考虑了,这些多在IC内部实现了,
(除非你老板让你自己写一个软USB,否则不用看了)
同步字段后就是包标识符PID, (LSB)PID0|PID1|PID2|PID3|PID0|PID1|PID2|PID3(MSB)
由上可知,PID自身有补码校验,
PID表明了包的类型,按我自己的习惯来记吧;
8,9,A,B都属于Token包;
----8: OUT, 9: IN, A: SOF, B: SETUP
C,D,E,F都属于数据包;
----C: Data packet PID even, D: Data packet PID odd
----E,F,isochronous transaction 暂不考虑
4,5,6,7都属于握手包;
----4: ACK 5: NAK 7: STALL 6: NYET
0,1,2,3属于特殊包;--------其中0为系统自己保留使用的;
-----2: PING 1: SPLIT 3: ERR/PRE
地址段,了解一下就知道了,每个设备在host那有唯一的地址,共可128个设备,(当然为7位长),如下:(LSB)PID0|PID1|PID2|PID3|PID4|PID5|PID6|(MSB)
所有的功能部件都必须在端口0提供一个控制管道(缺省控制管道)。对于低速(Low Speed)设备,每个功能部件最多提供3个管道:在端口0的控制管道加上2个附加管道(或是2个控制管道,或是1个控制管道和1个中断端口,或是2个中断端口)。全速(Full Speed)功能部件可以支持最多可达16个的任何类型的端口,定义如下:
(LSB)ENDP0|ENDP1|ENDP2|ENDP3|(MSB)
数据字段可以在0到1,023字节之间变动,但必须是整数个字节。图8-4为多字节显示格式。每个字节的范围内的数据位移出时都是最低位(LSb)在前.
包格式 主要有:标记包,数据包和握手包
标记包: PID | ADDR | ENDP | CRC5
数据包: PID | DATAx.......... | CRC16
握手包: PID
特殊的标记包稍后考虑:SPLIT主要用于HOST与HUB之间通信;
先记到这吧,待续
Baidu
map