文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、USB简介
USB1.0和USB1.1支持1.5Mb/s的低速模式和12Mb/s的全速模式。在USB2.0以上支持480Mb/s的高速模式。
应用如下:
二、USB总线信号
一个USB设备端的连接器是由D+、D-及Vbus,GND和其它数据线构成的简短连续电路,USB使用的是差分传输模式,两个数据线D+和D-。
信号 | 描述 |
---|---|
差分的“1” | D+>Voh(min) D-<Vol(max) |
差分的“0” | D->Voh(min) D+<Vol(max) |
单终端“0”(SE0) | D+和D-<Vol(max) |
数据J态:高速 低速 | 差分的“0” 差分的“1” |
数据K态:高速 低速 | 差分的“1” 差分的“0” |
复位 | D+和D-小于Vol(max)的持续时间大于等于10毫秒 |
挂起状态(Suspend) | 3ms以上的J状态 |
包开始(SOP) | 数据线从空闲态转到K态 |
包结束(EOP) | 持续2位时间的SE0信号,后跟随1位时间的J状态 |
唤醒(Resume) | 唤醒(Resume) |
同步SYNC | 3个KJ状态切换,后跟随2位时间的K状态 |
举例:
三、USB传输
一个传输有多个事务组成,一个事务由2-3个包组成。传输又分为四种类型:批量传输、等时(同步)传输、中断传输、控制传输。
注意:USB传输数据先发数据低位再发高位数据
1. 数据的编码解码与位插入
在包传送时,USB使用一种NRZI(None Return Zero Invert,即无回零反向码)编码方案。在该编码方案中,“1”表示电平不变,“0”表示电平改变。
位填充是为了保证发送的数据序列中有足够多的电平变化,填充的对象是(输入数据),即先填充再编码,数据流中每6个连续的“1”,就要插入1个“0”,从而保证编码数据出现电平变化,接收方赋值解码NRZI码流,然后识别出填充位,并丢弃它们。
2. 域
一个包被分为不同域,域是 USB 数据最小的单位, 由若干位组成(多少位由具体的域决定)。不同类型的包所包含的域是不一样的,都要以同步域 SYNC 开始 ,紧跟一个包标识符PID,最终 以包结束符 EOP 来结束这个包。
2.1 同步域
所有的 USB 包都由 SYNC 开始,高速包的 SYNC 宽度为 32bit(31 位 0+1 位 1),全速 /低速包的SYNC 段度为 8bit(7 位 0+1 位 1)。实际接收到的 SYNC 长度由于 USB HUB 的 关系, 可能会小于该值。 同步域用于告诉 USB 串行接口引擎数据即将开始传输,另一个作用是用于本地时钟与输入同步。
2.2 标识域
数据包标识符(PID)紧跟在每个USB数据包的SYNC字段之后。PID由四位数据包类型字段和四位校验字段组成,如图8-1所示。PID指示分组的类型,并且通过推断,指示分组的格式和应用于分组的错误检测的类型。PID的四位校验字段确保PID的可靠解码,从而正确解释数据包的剩余部分。PID校验字段是通过对数据包类型字段执行1的补码而生成的。如果四个PID校验位不是它们各自的分组标识符位的补码,则存在PID错误。
2.3 地址域
地址共占 11 位,其中低 7 位是设备地址, 高 4 位是端点地址。
地址域:七位地址,代表了设备在主机上的地址,地址 000 0000 被命名为零地址, 是任何设备第一次连接到主机时,在被主机配置、枚举前的默认地址, 由此可以知道为什么一个 USB 主机只能接 127 个设备。
2.4 端点域
四位, 由此可知一个 USB 设备端点数量最大为 16 个。
2.5 帧号域
占 11 位,主机每发出一个帧,帧号都会自加 1,当帧号达到 0x7FF 时,将归零重新开始计数。帧号域最大容量 0x800,对于同步传输有重要意义。
2.6 数据域
根据传输类型的不同,数据域的数据长度从 0 到 1024 字节不等。
2.7 校验域
Token CRC 计算地址域和帧号域的CRC
G(X) = X5 + X2 + 1
Data CRC 计算数据域数据的CRC
G(X) = X16 + X5 + X2 + 1
3. 包
包(Packet)是 USB 系统中信息传输的基本单元, 所有数据都是经过打包后在总线上 传输的。包是USB 总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若 干个数据包组成一次事务传输。一次事务传输也不能打断,属于一次事务传输的几个包必须连续, 不能跨帧完成。一次传输由一次到多次事务传输构成, 可以跨帧完成。由域构成的包有四种类型, 分别是令牌包、数据包、握手包和特殊包,不同包的域结构不同。
3.1 令牌包
令牌包分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命 令的, 输出包是用来设置输出命令的,而不是放数据的) 其中输入包、输出包和设置包的格式都是一样的:
SYNC + PID + (ADDR + ENDP) + CRC5(五位的校验码)
输出(OUT)令牌包用来通知设备将要输出一个数据包;输入(IN)令牌包用来通知 设备返回一个数据包;建立(SETUP)令牌包只用在控制传输中,通知设备将要输出一个 数据包;帧起始包在每帧(或微帧) 开始时以广播的形式发送,所有 USB 全速设备和高速设备都可以接收到 SOF 包。
帧起始包:在每帧(或微帧)开始时发送,以广播的形式发送,所有USB全速设备和高速设备都可以接收到SOF包。
帧起始包的格式:SYNC + PID + 11 位 FRAM + CRC5(五位的校验码)
3.2 数据包
数据包分为 DATA0 包和 DATA1 包。当 USB 发送数据的时候, 如果一次发送的数据长 度大于相应端点的容量时,就需要把数据包分为好几个包分批发送,DATA0 包和 DATA1 包 交替发送,即如果第一个数据包是 DATA0,那第二个数据包就是 DATA1。但也有例外情况,
在同步传输中(四类传输类型中之一),所有的数据包都是为 DATA0 。格式如下:
SYNC + PID + 0~1024 字节 + CRC16
注意:低速设备允许的最大数据有效载荷大小为 8 个字节。 全速设备的最大数据有效
载荷大小为 1023.高速设备的最大数据有效载荷大小为 1024 个字节。
3.3 握手包
握手包包括 ACK、NAK、STALL 以及 NYET 四种, 其中ACK 表示肯定的应答成功的数据传输。对于 IN 事务,将由 host 发出;对于 OUT、SETUP 和 PING 事务, 将由 device 发出。
NAK 表示否定的应答失败的数据传输,要求重新传输。在数据阶段, 对于 IN 事务,它将由 device 发出; 在握手阶段, 对于 OUT 和 PING 事务, 它也将由 device 发出; host从不发送 NAK 包。
STALL 表示功能错误或端点被设置了 STALL 属性。
NYET 表示尚未准备好,要求等待。
握手包是结构最为简单的包,格式如下: SYNC + PID
4. 事务
4.1 IN
表示 USB 主机从总线上的某个 USB 设备接收一个数据包的过程
令牌包阶段——主机发送一个 PID 为 IN 的输入包给设备,通知设备要往主机发送数据;
数据包阶段——设备根据情况会作出三种反应(要注意:数据包阶段也不总是传送数据 的,根据传输情况还会提前进入握手包阶段)。
握手包阶段——主机正确接收到数据之后就会向设备发送 ACK 包。
【正常】的输入事务处理:设备往主机里面发出数据包(DATA0 与 DATA1 交替)
【设备忙】时的输入事务处理:无法往主机发出数据包就发送 NAK 无效包, IN 事务提前结
束,到了下一个 IN 事务才继续;
【设备出错】时的输入事务处理:发送错误包 STALL 包,事务也就提前结束了,总线进入
空闲状态
4.2 OUT
输出事务处理:表示USB 主机把一个数据包输出到总线上的某个USB 设备接收的过程。
令牌包阶段——主机发送一个 PID 为 OUT 的输出包给设备,通知设备要接收数据;
数据包阶段—— 比较简单,就是主机会往设备送数据, DATA0 与 DATA1 交替
握手包阶段——设备根据情况会作出三种反应
【正常】的输出事务处理:设备给主机返回 ACK,通知主机可以发送新的数据,如果数据
包发生了 CRC 校验错误,将不返回任何握手信息;
【设备忙时】的输出事务处理:无法给主机返回 ACK,就发送 NAK 无效包,通知主机再次
发送数据
【设备出错】的输出事务处理:发送错误包 STALL 包,事务提前结束,总线进入空闲状态。
4.3 SETUP
令牌包阶段——主机发送一个 PID 为 SETUP 的输出包给设备,通知设备要接收数据;
数据包阶段—— 比较简单,就是主机往设备送数据,注意, 这里只有一个固定为 8 个字节的 DATA0 包,这 8 个字节的内容就是标准的 USB 设备请求命令。
握手包阶段——设备接收到主机的命令信息后,返回 ACK,此后总线进入空闲状态,
并准备下一个传输(在 SETUP 事务后通常是一个 IN 或 OUT 事务构成的传输)。
【正常】的设置事务处理
【设备忙时】的设置事务处理
【设备出错】的设置事务处理
5. 传输
控制传输由三个阶段组成,设置阶段、可选的数据阶段、状态阶段,其中设置阶段由1个SETUP事务组成,数据阶段由0个或者多个IN/OUT事务组成,状态阶段由1个IN/OUT事务组成,其中每个阶段事务包结构有所不同
下图是一个控制读取的控制传输过程实例,每一个过程数据的含义