微控制器USB学习(二)

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

猜你喜欢

转载自blog.csdn.net/qq_42312125/article/details/105339776