×
嵌入式 > 嵌入式开发 > 详情

USB学习系列之三——USB设备的枚举

发布时间:2022-07-18 发布时间:
|
1.枚举就是从设备读取各种描述符信息,主机根据读取的描述符信息来决定加载什么驱动,确定是什么样的设备以及如何通信等。

2.在USB设备的枚举过程中使用了控制传输,这种传输保证数据传输的正确性。控制传输分为:建立过程(主机发起)、可选的数据过程和状态过程。

3.控制传输解析:

(1)主机发起建立过程,建立过程开始于一个SETUP令牌包,后面紧跟一个DATA0数据包,接着就是数据过程。

(2)如果是控制读传输,那么数据过程就是输入数据(相对于USB主机来说的);如果是控制写传输,那么数据过程就是输出数据。如果在建立过程中指定了数据长度为0,那么就没有数据过程。数据过程之后是状态过程。

(3)状态过程刚好与数据过程的数据传输方向相反:如果是控制读传输,则状态过程是一个输出数据包(相对于USB主机来说的);如果是控制写传输,则状态过程是一个输入数据包。状态过程是用来确认所有的数据是否都已经正确传输完成。

4.枚举过程的解析:

(1)复位并读取端点0最大包长度:

主机监测到设备插入后,首先对设备进行复位(也就是将差分数据线同时拉低一段时间,因为差分数据线正常状态是一高一低)。USB设备复位之后地址为0,USB主机往地址为0的设备的端点0发送获取设备描述符的标准请求(这是一个控制传输的建立过程)。设备收到请求后,在数据过程将设备描述符返回给主机。主机在成功获取到一个数据包的设备描述符并且确认没有错误后,就会返回一个0长度的确认数据包(状态过程)。然后就会进入到设置地址的阶段。

注意:标准的设备描述符有18个字节,但是有些USB设备端点0大小不足18字节,理论上说USB主机只有通过多次读取才能读取到18字节的数据,但是在此阶段USB主机仍然只读取一次,这一次读取的数据大小最小为8字节(USB协议规定端点0至少为8字节),在这8字节的数据中已经包含了USB主机在这个阶段需要知道的信息,也就是端点0的最大包长度。端点0的最大包长度存放于设备描述符的第8字节处。

(2)地址设置

USB主机往地址为0的设备的端点0发送一个设置地址的请求(建立过程),新的设备地址包含在建立过程的数据包中。具体的地址由USB主机负责管理,主机会分配一个唯一的地址给刚接入的设备。USB设备在收到这个建立过程之后就直接进入到状态过程,因为这里数据过程是不需要的。设备等待主机请求状态返回(一个输入令牌包),收到输入令牌包后,设备就返回0长度的状态数据包。如果主机成功接收到该状态包,就会发送应答包ACK(确认字符)给设备,设备收到ACK之后,就要启用新的地址,以后主机就通过这个地址来访问该设备。

注意:D12USB接口芯片会自动等待ACK之后才启用新的地址,所以要在返回0长度的状态包之前,将地址写到D12芯片的地址寄存器中。

(3)获取设备描述符

使用新的地址,获取完整的18字节的设备描述符。如果端点0的最大包长小于18字节,那么就会有多多次请求数据输入。

(4)主机获取配置描述符和配置集合

配置描述符总共为9字节。主机在获取到配置描述符之后就获取配置集合。

(5)获取字符串描述符等其他的描述符。

注意:设备返回的数据长度可以小于主机请求的长度。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
五大标准轻松搞定4K超高清电视选购