USB的传输,编码,数据格式,掌握usb的必备知识( 二 )


SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)
(上面的缩写解释请看上面域的介绍 , PID码的具体定义请看问题五)
帧起始包的格式:
SYNC+PID+11位FRAM+CRC5(五位的校验码)
2、数据包: 分为DATA0包和DATA1包 , 当USB发送数据的时候 , 当一次发送的数据长度大于相应端点的容量时 , 就需要把数据包分为好几个包 , 分批发 送 , DATA0包和DATA1包交替发送 , 即如果第一个数据包是DATA0 , 那第二个数据包就DATA1 。但也有例外情况 , 在同步传输中(四类传输类型中 之一) , 所有的数据包都是为DATA0 , 格式如下:
SYNC+PID+0~1023字节+CRC16
3、握手包:结构最为简单的包 , 格式如下
SYNC+PID
(注上面每种包都有不同类型的 , USB1.1共定义了十种包 , 具体请见问题五)
(三)事务:分别有IN事务、OUT事务和SETUP事务三大事务 , 每一种事务都由令牌包、数据包、握手包三个阶段构成 , 这里用阶段的意思是因为这些包的发送是有一定的时间先后顺序的 , 事务的三个阶段如下:
1、令牌包阶段:启动一个输入、输出或设置的事务
2、数据包阶段:按输入、输出发送相应的数据
3、握手包阶段:返回数据接收情况 , 在同步传输的IN和OUT事务中没有这个阶段 , 这是比较特殊的 。
事务的三种类型如下(以下按三个阶段来说明一个事务):
1、 IN事务:
令牌包阶段——主机发送一个PID为IN的输入包给设备 , 通知设备要往主机发送数据;
数据包阶段——设备根据情况会作出三种反应(要注意:数据包阶段也不总是传送数据的 , 根据传输情况还会提前进入握手包阶段)
1) 设备端点正常 , 设备往入主机里面发出数据包(DATA0与DATA1交替);
2) 设备正在忙 , 无法往主机发出数据包就发送NAK无效包 , IN事务提前结束 , 到了下一个IN事务才继续;
3) 相应设备端点被禁止 , 发送错误包STALL包 , 事务也就提前结束了 , 总线进入空闲状态 。
握手包阶段——主机正确接收到数据之后就会向设备发送ACK包 。
2、 OUT事务:
令牌包阶段——主机发送一个PID为OUT的输出包给设备 , 通知设备要接收数据;
数据包阶段——比较简单 , 就是主机会设备送数据 , DATA0与DATA1交替
握手包阶段——设备根据情况会作出三种反应
1)设备端点接收正确 , 设备往入主机返回ACK , 通知主机可以发送新的数据 , 如果数据包发生了CRC校验错误 , 将不返回任何握手信息;
2) 设备正在忙 , 无法往主机发出数据包就发送NAK无效包 , 通知主机再次发送数据;
3) 相应设备端点被禁止 , 发送错误包STALL包 , 事务提前结束 , 总线直接进入空闲状态 。
3、SETUP事务:
令牌包阶段——主机发送一个PID为SETUP的输出包给设备 , 通知设备要接收数据;
数据包阶段——比较简单 , 就是主机会设备送数据 , 注意 , 这里只有一个固定为8个字节的DATA0包 , 这8个字节的内容就是标准的USB设备请求命令(共有11条 , 具体请看问题七)
握手包阶段——设备接收到主机的命令信息后 , 返回ACK , 此后总线进入空闲状态 , 并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输)
(四)传输:
传输由OUT、IN、SETUP事务其中的事务构成 , 传输有四种类型 , 中断传输、批量传输、同步传输、控制传输 , 其中中断传输和批量转输的结构一样 , 同步传输有最简单的结构 , 而控制传输是最重要的也是最复杂的传输 。
1、中断传输:由OUT事务和IN事务构成 , 用于键盘、鼠标等HID设备的数据传输中
2、批量传输:由OUT事务和IN事务构成 , 用于大容量数据传输 , 没有固定的传输速率 , 也不占用带宽 , 当总线忙时 , USB会优先进行其他类型的数据传输 , 而暂时停止批量转输 。如U盘
3、同步传输:由OUT事务和IN事务构成 , 有两个特殊地方 , 第一 , 在同步传输的IN和OUT事务中是没有返回包阶段的;第二 , 在数据包阶段所有的数据包都为DATA0 , 如视频音频传输


推荐阅读