USB学习(二)
USB通讯协议
USB是一个主从关系的协议,由多个USB设备以及集线器,连接到一个USB主机上,最后形成一个星状网络。而实际上在这个网络中,从设备上,只能看到主机,是看不到别的从设备的,因此其实从设备与从设备之间,是不能直接通讯的。
从设备接入USB主机的时候,USB主机会给从设备分配一个唯一的地址,并且在通过USB总线传输数据的时候,会附带有相应的从设备地址,而从设备靠着这个地址,来决定这个数据是否属于自己的。一个USB主机,最多只能分配127个地址(1~127),并且最多只能连接5层集线器,在第5层的集线器中,只能连接USB设备,而不能连接Hub。
USB主机和USB设备之间的通讯,是通过管道(Pipe)进行的。这个管道可能有点难理解,其实是这样的,并不是真的一条管子,而是在USB主机这里,有一处数据缓冲区,而这个数据缓冲区,这个缓冲区是用来做数据收发的时候进行缓冲的,它直接指向的是对应的从设备,从设备是通过缓冲区指向的一个端点,也就是确定好的索引方向,来接收主机发送过来的信息。这样一来,USB设备地址、端点索引和端点方向,就可以直接组合成一个唯一的USB主机和USB设备通讯的通道了。
在USB协议上,管道传输的数据基本单位是一个包(Packet),这个包的组成是由多个逻辑0和1构成的。然后多个包又可以构成一个事务,多个事务可以构成一个传输。
USB协议中定义了三大类包:
- 令牌包
- 数据包
- 握手包
这些包的的区分,是通过标识符(PID)进行区分的,PID的令牌包:
- Setup包
- IN包
- OUT包
- Ping包
同样的,数据包也有分类:
- DATA0包
- DATA1包
握手包:
- ACK包
- NAK包
- STALL包
通过多个包的组,会相应的变成事务,如Setup事务等等。
包
这当然不是包子了、、、它是USB基本传输单元。从面所讲的,包的种类有很多,作用也不同,我们可以对包进行分析。
1)包的标识符
包的类型铜鼓长度为8为的包标识符指定的,其中包括4位的包类型位域和与其对应的4位校验位位域。
这里就举个例子:
包类型 | 包名称 | PDI值 |
---|---|---|
令牌包 | OUT | 4‘b0001 |
IN | 4’b1001 | |
SOF | 4’b0101 | |
SETUP | 4’b1101 |
2)包目标地址
USB设备接入USB主机之后,USB主机会给USB设备分配一个地址,但是在收到主机发送过来的地址之前,默认的地址是0,包目标设备的地址长度只有7位,这也是为啥一个USB主机最多只能管理127个USB设备的原因。
3)包目标端点
USB的设备和主机之间,在通讯上建立好一个个单独的管道,并且每一个都对应着一个端点。端点上是有方向区分的:
- IN:1
- OUT:0
4)数据数据
数据长度的范围是0-1024字节。
5)帧索引
帧索引的长度是11bit,该位域的初始值为0,由USB主机对其进行递增,达到2047时则重新从0开始计数。
6)循环冗余校验码
USB协议规定只有令牌包和数据包具有循环冗余校验码,其它的包没有。令牌包使用5为循环冗余校验码,数据包使用16位循环冗余检验码。
包格式
1)令牌包
sync | setup | addr | endp | crc5 | eop |
---|---|---|---|---|---|
00000001 | 0xb4 | 0 | 0 | 0x08 | 233.330ns |
2)数据包
sync | data0 | data | crc6 | eop |
---|---|---|---|---|
00000001 | 0xc3 | 8bytes | 0xbb29 | 250.000ns |
3)握手包
sync | ack | eop |
---|---|---|
00000001 | 0x4b | 266.660ns |