USB 全速和低速设备
1、同步域(SYNC) 8bit 0000 0001
2、标识域(PID) 8bit bit3~bit0有用,bit7~bit4是bit3~bit0的取反用来校验PID。
3、地址域(ADDR) 7bit地址,代表设备在主机上的地址。
4、端点域(ENDP) 4bit,一个USB设备端点最大数量为16个
5、帧号域(FRAM) 11bit,每一个帧都有一个特定的帧号,
6、数据域(DATA) 长度为0~1023字节
7、校验域(CRC) 5bit ,只校验PID后面的数据不包括PID,
8、包结束(EOP) 2个数据位宽度的单端0(SE0)信号。SE0(D+和D-同时拉低)
1、令牌包:OUT、IN、SOF、SETUP
OUT: (1110 0001)通知设备将要输出数据
IN: (0110 1001)通知设备将要输入数据
SOF: (1010 0101)通知设备这是一个帧起始包,全速每ms产生一个SOF包,高速设备每125us产生一个微帧,(高速设备每ms有8个微帧,这8个微帧的帧号一样,即相同的SOF),SOF包之后不跟随数据传输
SETUP:(0010 1101)通知设备将要开始一个控制传输,SETUP令牌包后只能使用DATA0数据包,且只能发送到控制端点,设备必须要接收
2、数据包:DATA0、DATA1、DATA2、MDATA
DATA0:(1100 0011)数据包
DATA1:(0100 1011)
DATA2:(1000 0111)
MDATA:(0000 1111)
3、握手包:ACK、NAK、STALL、NYET
ACK: (1101 0010)确认
NAK: (0101 1010)不确认,表示没有数据需要返回,或者数据正确接收没有足够空间容纳
STALL:(0001 1110)挂起,表示设备无法执行这个请求
NYET: (1001 0110)未准备好,USB2.0的高速设备输出事务,表示本次数据成功接收,但是没有足够空间接收下次数据,主机在下次输出数据时,将使用PING令牌包试探设备是否有空间接收数据。
4、特殊类:PRE、ERR、SPLIT、PING
PRE: (0011 1100)前导这是一个令牌包
ERR (0011 1100)错误这是一个握手包
SPLIT (0111 1000)分裂事务这是一个令牌包
PING (1011 0100)PING测试这时一个令牌包
/*****************************************令牌包结构**********************************************************/
1、SOF包结构:
[同步域] [8位包标识PID] [11位帧号] [5位CRC5校验] [EOP]
[0000 0001] [1010 0101] [000 0000 0000] [x xxxx] [D+和D-同时拉低]
2、OUT包结构:
[同步域] [8位包标识PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP]
[0000 0001] [1110 0001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
3、IN包结构:
[同步域] [8位包标识PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP]
[0000 0001] [0110 1001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
4、SETUP包结构:
[同步域] [8位包标识PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP]
[0000 0001] [0010 1101] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
/*****************************************数据包结构**********************************************************/
5、DATA0包结构:
[同步域] [8位包标识PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP]
[0000 0001] [1100 0011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
6、DATA1包结构:
[同步域] [8位包标识PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP]
[0000 0001] [0100 1011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
/*****************************************握手包结构**********************************************************/
7、ACK包结构:
[同步域] [8位包标识PID] [EOP]
[0000 0001] [1101 0010] [D+和D-同时拉低]
8、NAK包结构:
[同步域] [8位包标识PID] [EOP]
[0000 0001] [0101 1010] [D+和D-同时拉低]
9、STALL包结构:
[同步域] [8位包标识PID] [EOP]
[0000 0001] [0001 1110] [D+和D-同时拉低]
1、批量传输:
批量传输使用批量事务传输数据。
批量事务:令牌包阶段、数据包阶段、握手包阶段。
批量输出事务:OUT令牌包--DTAT包--握手包
批量输入事务:IN令牌包---DATA包---握手包
一次正确的批量输入事务:
[同步域] [IN PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [0110 1001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA0 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 设备返回
[0000 0001] [1100 0011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 主机返回
[0000 0001] [1101 0010] [D+和D-同时拉低]
一次正确的批量输出事务:
[同步域] [OUT PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [1110 0001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA0 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 主机发送
[0000 0001] [1100 0011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 设备返回
[0000 0001] [1101 0010] [D+和D-同时拉低]
2、中断传输
中断传输是一种保证查询频率的传输,中断端点在端点描述符种要报告它的查询间隔,主机会保证在小于这个时间间隔内安排一次传输。
中断传输使用中断事务。
中断传输和批量传输的结构基本一致
一次正确的中断输入事务:
[同步域] [IN PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [0110 1001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA0 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 设备返回
[0000 0001] [1100 0011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 主机返回
[0000 0001] [1101 0010] [D+和D-同时拉低]
一次正确的中断输出事务:
[同步域] [OUT PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [1110 0001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA0 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 主机发送
[0000 0001] [1100 0011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 设备返回
[0000 0001] [1101 0010] [D+和D-同时拉低]
3、等时传输
等时传输(同步传输)用在数据量大、对实时性要求高的场合。
等时传输使用等时事务。
一次正确的等时输入事务:
[同步域] [IN PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [0110 1001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA0 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 设备返回
[0000 0001] [1100 0011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
一次正确的等时输出事务:
[同步域] [OUT PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [1110 0001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA0 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 主机发送
[0000 0001] [1100 0011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
4、控制传输
控制传输分为三个过程:建立过程、数据过程(可选)、状态过程。
建立过程使用建立事务:建立事务是输出数据过程,令牌包使用SETUP令牌包,数据包类型只使用DATA0包,握手包设备只能使用ACK应答
建立过程
一次正确的建立事务:
[同步域] [SETUP PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [0010 1101] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA0 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 主机发送
[0000 0001] [1100 0011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 设备返回
[0000 0001] [1101 0010] [D+和D-同时拉低]
数据过程:(可选) --- 数据过程可以包含1笔或多笔数据事务,控制传输的数据事务与批量传输的批量事务是一致的。注意:在数据过程中,所有的数据事务必须是同一个传输方向,
也就是说在控制写过程中,数据过程的所有数据事务都是输出的。一旦数据传输方向发生改变,就会认为进入了状态过程。
数据过程的第一个数据包必须是DATA1,然后每次正缺传输一个数据包后就在DATA0和DATA1之间交替。
控制写数据过程:
[同步域] [OUT PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [1110 0001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA1 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 主机发送
[0000 0001] [0100 1011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 设备返回
[0000 0001] [1101 0010] [D+和D-同时拉低]
[同步域] [OUT PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [1110 0001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA0 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 主机发送
[0000 0001] [1100 0011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 设备返回
[0000 0001] [1101 0010] [D+和D-同时拉低]
。。。。。。。。。。。
控制读数据过程:
[同步域] [IN PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [1110 0001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA1 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 设备返回
[0000 0001] [0100 1011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 主机发送
[0000 0001] [1101 0010] [D+和D-同时拉低]
[同步域] [IN PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [1110 0001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA0 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 设备返回
[0000 0001] [1100 0011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 主机发送
[0000 0001] [1101 0010] [D+和D-同时拉低]
。。。。。。。。。。。
状态过程:(状态过程也是一笔批量事务),它的传输方向与前面的数据阶段相反,
即控制写传输在状态过程使用一个批量输入事务;
控制读传输在状态过程使用一个批量输出事务;
状态过程只能使用DATA1包。
控制写的状态过程:
[同步域] [IN PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [1110 0001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA1 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 设备返回
[0000 0001] [0100 1011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 主机发送
[0000 0001] [1101 0010] [D+和D-同时拉低]
控制读的状态过程:
[同步域] [OUT PID] [7位地址位] [4位端点号] [5位CRC5校验] [EOP] 主机发送
[0000 0001] [1110 0001] [A0~A6] [xxxx] [x xxxx] [D+和D-同时拉低]
[同步域] [DATA1 PID] [BYTE0] [BYTE1] ...... [16位CRC16校验] [EOP] 主机发送
[0000 0001] [0100 1011] [d0~d7] [d0~d7] ...... [c15~c0] [D+和D-同时拉低]
[同步域] [ACK PID] [EOP] 设备返回
[0000 0001] [1101 0010] [D+和D-同时拉低]
几种控制传输:
控制写:建立过程 数据过程 状态过程
SETUP OUT1 OUT0 。。。。。 IN1
DATA0 DATA1 DATA0 。。。。。 DATA1
控制读:建立过程 数据过程 状态过程
SETUP IN1 IN0 。。。。。 OUT1
DATA0 DATA1 DATA0 DATA1
无数据
控制写
传输: 建立过程 状态过程
SETUP IN1
DATA0 DATA1
1、端点类型与传输类型的关系:
一个具体的端点,只能工作在一种传输模式下。通常,把工作在什么模式下的端点,就叫什么端点。例如,控制端点、批量端点等。
端点0是每个USB设备都必须具备的默认控制端点,它一上电就存在并且可用。
设备的各种描述符以及主机发送的一些命令,都是通过端点0传输的。其他端点是可选的,需要根据具体的设备来决定。
非0端点只有在Set Config之后才能使用。
2、传输类型与端点支持的最大包长:
每个端点描述符中都规定了端点所支持的最大数据包长。主机每次发送数据,都不能超过端点的最大包长。
控制传输的端点:低速模式最大包长固定为8字节,高速模式最大包长固定为64字节,而全速模式可在8、16、32、64字节中选择。
等时传输的端点:全速模式最大包长上限为1023字节,高速模式最大包长上限为1024字节,低速模式不支持等时传输。
中断传输的端点:低速模式最大包长上限为8字节,全速模式最大包长上限为64字节,高速模式最大包长上限为1024字节。
批量传输的端点:高速模式固件为512字节,全速模式最大包长可在8、16、32、64字节中选择,低速模式不支持批量传输。