USB概述
读《圈圈教你玩USB 第二版》,笔记。
USB
USB——Universal Serial Bus 通用串行总线
出现目的:简化个人计算机与外围设备连接,支持热插拔。
特点
协议 | 速度 |
---|---|
USB1.0 | 1.5Mb/s低速 / 12Mb/s全速 |
USB1.0 | 1.5Mb/s低速 / 12Mb/s全速 |
USB2.0 | 1.5Mb/s低速 / 12Mb/s全速 / 480Mb/s高速 |
USB的开发难度大,调试难度大,传输的距离短。
USB的开发者网站:
USB logo
拓扑结构
插入检测
描述符
描述符
设备描述符
USB设备的枚举过程
枚举过程是调试USB的重要一环。枚举就是主机从设备读取各种描述符信息,通过这些信息来加载合适的驱动程序,从而知道设备是什么类型的,如何进行通信等。
枚举过程:
-
主机对设备复位,获取设备描述符。
-
主机对设备复位,设置设备地址。
-
主机对设备复位,获取新的设备描述符。
-
主句获取配置描述符。
USB包结构和传输过程
USB是串行总线,LSB方式传输。即先出来的是数据的最低位,最后是最高位。
USB总线数据要经过位填充,接着经过NRZI编码,才能输出到总线上。下面说的码没有说明都是位填充码,即NRZI编码前的数据。
一个USB的包,被分为了多个域(field),域的开头和结尾分别为LSB和MSB。
在传输数据时,USB主机到设备的数据称为输出,设备到主机的数据称为输入。(主体为USB主机)
域的共同点:以同步域开始,紧跟一个包标识符PID(Packet Idetifier),最终以包结束符结束。
同步域
同步域分类
设备 | 同步域码 |
---|---|
全速/低速设备 | 00000001(8bit 2进制) |
高速设备 | 00000000 00000000 00000000 00000001(32bit 2进制) |
包标识符
令牌包
令牌包用于启动一次USB传输。
令牌包的最后有一个CRC5校验,它只校验PID之后的数据,不包括PID本身。
数据包
数据包用于传输数据。
协议 | 数据包 |
---|---|
USB1.1 | DATA0包 DATA1包 |
USB2.0 | DATA0包 DATA1包 DATA2包 MDATA包 |
包结构是统一的:一个同步域,后面跟整数字节的数据,然后是CRC16校验,最后是包结束符。
握手包
握手包用来标识一个传输是否被对方确认。
握手包结构:同步域、PID和EOP。
特殊包
用到的时候再看吧。这里先放一下。
四种传输类型
在传输数据时,要将包组织成事务(Transaction)。
USB事务
USB协议规定了4种传输类型:批量、等时、中断和控制。
批量、等时、中断每传输一次就是一个事务;但控制不是,它的建立和状态过程分别是一个事务,而数据过程则可能包括多个事务。
批量
批量传输使用批量事务(bulk transaction)传输数据。
一次批量事务有三个阶段:令牌包阶段,数据包阶段和握手包阶段。
批量传输分为批量读和批量写,批量读使用批量输入事务,批量写使用批量输出事务。
中断
中断用于时间要求严格的设备中,保证查询频率。
等时
用于数据量大、实时性要求高的场合。
控制
端点类型和传输类型的关系
一个具体的端点,只能工作在一种传输模式下。
端点0是默认控制端点,所有的USB设备都有、非0端点只有在set config之后才能使用。