[demo程序] USB2.0协议学习笔记---USB数据包结构

[复制链接]
 楼主| 余三水 发表于 2019-8-30 16:09 | 显示全部楼层 |阅读模式
USB包类型和传输过程     
       USB是一种串行总线,因此数据都是一位一位传输的,如同串口那样,但是USB在真实物理电路上却不是TTL电平,而是一种差分信号采用NRZI编码,就是用变化表示0,不变表示1,同时在USB中数据时低字节先发送的即LSB。USB中的数据交互最小单位是包一个包由许多域组成,但是统一的是每个包都有同步域开始,然后紧接着PID,这里的PID不是指PID,而是指类似包命令码这么一个意思。PID只用到了低四位,高四位是低四位的取反用于校验PID字段,常见的PID由USB标准中查到如下,其中*号标识的是USB1.1中没有的:
914979-20190602121745587-218700551.jpg
有表中可以看到USB包分为16种四类,现在先以令牌包的格式介绍包格式。记住一个概念,USB中主机占主导地位,因此输入输出都是在主机角度来说的。
令牌包:
输出(OUT),输入(IN),建立令牌包(SETUP)包结构:
同步域8位包标识PID7位地址4位端点号5位CRC5校验EOP
SOF同步包,这个包是主机和所有从设备之间同步的特殊包,因此它是广播的,结构也就比较特殊。
同步域8位标识PID11位帧号5位CRC5校验EOP

数据包:
数据包都具有同样的结构,一个同步域后面直接跟PID加上数据,最后是CRC校验,同样所有的CRC校验都是从PID字节之后的部分,最后是包结束符EOP。
同步域8位包标识PID字节0字节1......16位CRC16校验EOP
主机和设备之间会维护一个数据包类型切换机制用于错误恢复。假如主机发送数据给设备,但是设备的ACK包在传输中被破坏了,所以主机就不知道对方是否收到了数据,主机就会保持自己的数据包类型不变,但是如果下一次设备使用数据包类型和自己不同给自己发数据了,主机就知道上一次丢失ACK那次的传输实际上是成功的。反之就是失败了。
握手包:
ACK :用来确认数据接收正确,这一部分常常有USB物理层自动完成;
NCK:表示没有数据返回,常常是主机查询设备有无数据返回时由设备返回,主机不允许使用NCK应答(猜猜为什么);
STALL:设备无法执行一个请求,或者是端点已经挂起了时,设备会返回STALL;这种情况下需要主机干预才能解除STALL状态。
NYET:只在USB2.0高速事物中使用,表示本次数据接收成功,但是没有足够的空间来接收下一数据,下一次数据传输前主机需要先发送PING探查设备状态,确认可以接收数据。
特殊包:
特殊包是在一些特殊场合使用的包,主要有三个:ERR,SPLIT、PING。
PING:用在高速设备中,主机询问设备是否可以接收数据,设备如果有足够的空间接收数据则会用ACK握手包回应主机。
PRE:只用在高速模式中,作为前导包通知集线器打开,低速端口,因为集线器在平常情况下,防止高速信号导致低速设备误动作,集线器是没有将高速信号传递给速速设备的。
ERR:用在高速事物中的SPLIT令牌包分裂错误指示。
USB定义了这么多的数据包,但是还是不能直接用这些包就开始数据传输了,这里是USB的一个概念,USB的数据交换都是主机首先发起的,所以的引入了USB事物的概念USB事物通常都是有两个或者三个数据包组成的。令牌包有主机发送启动一个事物,然后主机发送数据包,最后由设备ACK应答。由此USB定义了四种传输类型,每种类型里包含多种USB事务。

zlmin 发表于 2019-10-3 19:40 来自手机 | 显示全部楼层
感谢分享!
zlmin 发表于 2019-10-3 19:37 来自手机 | 显示全部楼层
感谢分享!感谢分享!
febgxu 发表于 2019-9-2 22:18 | 显示全部楼层
                  
xiaoyaodz 发表于 2019-9-2 22:18 | 显示全部楼层
usb devices 相关的数据结构  
sdlls 发表于 2019-9-2 22:18 | 显示全部楼层
有相关的源代码吗?
lzmm 发表于 2019-9-2 22:18 | 显示全部楼层
USB通信的最基本单位是“包”  
minzisc 发表于 2019-9-2 22:18 | 显示全部楼层
同步传输,中断传输,批量传输,控制传输四种  
hudi008 发表于 2019-9-2 22:18 | 显示全部楼层
全速/高速模式的EOP是一个约为2个数据宽度的SE0  
selongli 发表于 2019-9-2 22:18 | 显示全部楼层
“IN事务”、“OUT事务”、“SETUP事务”  
GG_GG 发表于 2019-9-2 22:18 | 显示全部楼层
USB的传输方向:从设备到主机的数据为输入;从主机到设备的数据叫做输出
fentianyou 发表于 2019-9-2 22:18 | 显示全部楼层
Google了下 usb sniffer  
kkzz 发表于 2019-9-2 22:18 | 显示全部楼层
一个包被分成不同的域。根据不同类型的包,所包含的域是不一样的
febgxu 发表于 2019-9-2 22:18 | 显示全部楼层
传输的速度怎么样
sdlls 发表于 2019-9-2 22:17 | 显示全部楼层
不错的资料。     
febgxu 发表于 2019-9-2 22:17 | 显示全部楼层
谢谢楼主分享的资料。  
xiaoyaodz 发表于 2019-9-2 22:16 | 显示全部楼层
USB协议分析软件  
fentianyou 发表于 2019-9-2 22:16 | 显示全部楼层
想抓USB口与电脑之间所传输的数据包  
selongli 发表于 2019-9-2 22:16 | 显示全部楼层
USB的四种传输方式呢?
minzisc 发表于 2019-9-2 22:15 | 显示全部楼层
USB是一个数据传输过程  
lzmm 发表于 2019-9-2 22:15 | 显示全部楼层
好像哪里没法理解到位   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

356

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部