USB 的重要关键字:
- 端点:位于 USB 设备或主机上的一个数据缓冲区,用来存放和发送 USB 的各种数据,每
一个端点都有唯一确定的地址,有不同的传输特性(如输入端点、输出端点、配置端点、
批量传输端点)。 - 帧:时间概念,在 USB 中,一帧就是 1ms,它是一个独立的单元,包含了一系列总线动
作,USB 将 1 帧分为好几份,每一份就是一个 USB 传输动作。 - 上行、下行:设备到主机为上行,主机到设备为下行。
Q1:USB 的传输线结构是怎样的?
一条 USB 传输线分别由地线、电源线、D+和 D-构成。D+和 D-是差分输入线,使用 3.3V
电压,与 CMOS 的 5V 电平不同。电源线和地线可为设备提供 5V 电压,最大电流为 500mA,
可在编程中设置。
Q2:数据是如何在 USB 传输线里传送的?
数据在 USB 传输线里是由低位到高位发送的。
Q3:USB 的编码方案是怎样的(了解即可)?
USB 采用不归零取反来传输数据,当传输线上的差分数据输入 0 时就取反,输入 1 时就
保持原值,为了确保信号发送的准确性,当在 USB 总线上发送一个包时,传输设备就要进
行位插入操作(即在数据流中每连续 6 个 1 后就插入一个 0),从而强迫 NRZI 码发生变化。
Q4:USB 的数据格式是怎样的?
USB 数据格式是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,
包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和
控制传输)。下面简单介绍一下域、包、事务和传输,注意它们之间的关系。 - 域:是 USB 数据最小的单位,由若干位组成,域可分为七个类型:
- 同步域(SYNC):八位,固定值为 0000 0001,用于本地时钟与输入同步;
- 标识域(PID):由四位标识符+四位标识符反码构成,表明包的类型和格式(这是
一个很重要的部分,这里可计算出,USB 的标识码有 16 种,具体分类见 Q5); - 地址域(ADDR):七位地址,设备在主机上的地址,地址 000 0000 被命名为零地
址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由
此可以知道为什么一个 USB 主机只能接 127 个设备的原因; - 端点域(ENDP):四位,一个 USB 设备有的端点数最大为 16 个;
- 帧号域(FRAM):11 位,每一个帧都有一个特定的帧号,帧号域最大容量 0x800,
对于同步传输有重要意义(同步传输为四种传输类型之一,见下文); - 数据域(DATA):长度 为 0~1023 字节,在不同的传输类型中,数据域的长度各不
相同,但必须为整数个字节的长度; - 校验域(CRC):对令牌包和数据包(对于包的分类见下文)中非 PID 域进行校验的
一种方法,CRC 校验在通讯中应用很广泛,是一种很好的校验方法。CRC 码的除法
是模 2 运算,不同于十进制中的除法;
- 包:由域构成的包有四种类型:令牌包、数据包、握手包和特殊包,前三种是重要的包,
不同的包的域结构不同。
- 令牌包:可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设
置输入