与RS-232和类似的串行接口不同,USB没有定义发送数据的格式,而是由几层协议组成。虽然这听起来很复杂,但现在不要放弃。一旦你明白了是怎么回事,你真的只需要担心更高层的问题。事实上,大多数USB控制器I.C.s将负责较低层,从而使最终设计者几乎看不见它。
每个USB事务由一个
令牌包(定义它期望的后续内容的头),一个
可选数据包(包含有效载荷)和
状态包(用于确认事务并提供纠错方法)
正如我们已经讨论过的,USB是一种以主机为中心的总线。主机启动所有事务。第一个包,也称为令牌,由主机生成,用于描述要遵循的内容、数据事务是读还是写以及设备的地址和指定的端点是什么。下一个包通常是承载有效载荷的数据包,后面是握手包,报告数据或令牌是否成功接收,或者端点是否暂停或无法接受数据。
通用USB数据包字段USBus上的数据首先传输LSBit。USB数据包由以下字段组成:,
同步
所有数据包必须以同步字段开头。同步字段在低速和全速时为8位,高速时为32位长,用于使接收器的时钟与****机的时钟同步。最后两位表示PID字段的起始位置。PIDPID代表数据包ID。此字段用于标识正在发送的数据包的类型。下表显示了可能的值。集团PID值包标识代币0001输出令牌one thousand and one象征性地0101SOF代币one thousand one hundred and one安装令牌数据0011数据0one thousand and eleven数据10111数据2one thousand one hundred and eleven数据握手0010ACK握手one thousand and ten握手one thousand one hundred and ten拖延握手0110奈特(目前还没有回应)特别的one thousand and one hundred序言one thousand and one hundred错误one thousand分裂0100发出砰的声响PID有4个位,但是为了确保它被正确地接收,4个位被补充和重复,使一个8位的PID。结果格式如下所示。PID zeroPID onePID twoPID threenPID公司 zeronPID公司 onenPID公司 twonPID公司 three地址指定指定设备地址的字段。长度为7位,可以支持127个设备。地址0无效,因为任何尚未分配地址的设备都必须响应发送到地址0的数据包。终点端点字段由4位组成,允许16个可能的端点。但是,低速设备在默认管道的顶部只能有两个附加端点。(最多4个端点)CRC公司对分组有效载荷内的数据执行循环冗余检查。所有的令牌包都有一个5位的CRC,而数据包有一个16位的CRC。EOP公司数据包结束。由单端零(SE0)发出信号,持续约2位时间,然后用J表示1位时间。
USB有四种不同的数据包类型。令牌包指示要遵循的事务类型,数据包包含有效载荷,握手包用于确认数据或报告错误,帧开始包指示新帧的开始。
标记数据包
令牌包有三种类型,
在-通知USB设备主机希望读取信息。
出去-通知USB设备主机希望发送信息。
安装程序-用于开始控制传输
令牌包必须符合以下格式,同步PID地址终点CRC5EOP公司数据包有两种类型的数据包,每种类型的数据包最多可以传输1024字节的数据。
数据0
数据1
高速模式定义了另外两个数据PID,DATA2和MDATA。数据包的格式如下:,同步PID数据CRC16型EOP公司
低速设备的最大数据负载大小为8字节。
全速设备的最大数据负载大小为1023字节。
高速设备的最大数据负载大小为1024字节。
数据必须以字节的倍数发送。
握手包
有三种类型的握手包,它们只由PID组成
确认-确认已成功接收数据包。
纳克-报告设备临时无法发送或接收数据。也可以在中断事务期间用来通知主机没有要发送的数据。
失速-设备发现其处于需要主机干预的状态。
握手数据包的格式如下:,同步PIDEOP公司帧包开始主机每1ms发送一次由11位帧号组成的SOF包 ±在全速总线上为500ns或每125µs ±高速总线上为0.0625µs。同步PID帧编号CRC5EOP公司
当我们想到USB设备时,我们想到的是USB外围设备,但USB设备可能是指在主机或外围设备上使用的USB收发器设备、USBHub或主机控制器IC设备或USB外围设备。因此,本标准引用了USB功能,这些功能可以被视为提供诸如打印机、Zip驱动器、扫描仪、调制解调器或其他外围设备等功能的USB设备。
所以现在我们应该知道什么东西组成了一个USB包。不?你忘了一个PID字段已经有多少位了?好吧,别惊慌失措。幸运的是,大多数USB功能都处理silicon中的低层USB协议,直到事务层(我们将在下一章讨论)。我们之所以要覆盖这些信息,是因为大多数USB功能控制器都会报告诸如PID编码错误之类的错误。一个没有编码的PID能简单地问什么?如果你认为PID的最后四位与前四位的倒数不匹配,那么你是对的。
大多数函数都有一系列缓冲区,通常为8字节长。每个缓冲区都属于一个端点-ep0in,EP0 OUT等等。例如,主机发送一个设备描述符请求。功能硬件将读取设置数据包并从地址字段确定该数据包是否为其自身,如果是,则将把以下数据包的有效负载复制到由设置令牌的端点字段中的值指定的适当的端点缓冲区。然后,它将发送一个握手包来确认字节的接收,并在半导体/微控制器内为适当的端点生成一个内部中断,表示它已经接收到包。这通常都是在硬件上完成的。
软件现在得到一个中断,应该读取端点缓冲区的内容并解析设备描述符请求。
端点端点可以描述为数据的源或汇。由于总线以主机为中心,端点出现在USB功能的通信通道的末端。例如,在软件层,您的设备驱动程序可以向您的设备EP1发送数据包。当数据从主机流出时,它将最终进入ep1out缓冲区。你的固件将在空闲时读取这些数据。如果要返回数据,函数不能简单地写入总线,因为总线由主机控制。因此,它将数据写入位于缓冲区中的EP1,直到主机向请求数据的端点发送IN包为止。Endpointscan也可以看作是功能设备的硬件和在功能设备上运行的固件之间的接口。
所有设备都必须支持终结点零。这是一个端点,当设备在总线上运行时,它在枚举期间和整个持续时间内接收所有设备的控制和状态请求。
管当设备在一系列端点上发送和接收数据时,客户端软件通过管道传输数据。管道是主机和端点之间的逻辑连接。管道还将有一组与之相关的参数,如分配给它的带宽、它使用的传输类型(控制、批量、Iso或中断)、数据流的方向和最大包/缓冲区大小。例如,默认管道是由端点zeroin和端点zero out组成的双向管道,具有控制传输类型。
USB定义了两种类型的管道
溪流管道另一种类型的数据流可以被定义为USB类型,并且没有其他类型的数据。数据按顺序流动,并有一个预定义的方向,即输入或输出。流管道将支持批量、同步和中断传输类型。流管道可以由主机或设备控制。
消息管道有一个定义的USB格式。它们由主机控制,由主机发送的请求启动。然后,根据请求的指示,向所需的方向传输数据。因此,消息管道允许数据双向流动,但只支持控制传输。