作者:qq236106303
转自:http://blog.csdn.net/qq236106303/article/details/8181336
前几篇介绍中,USB主机完成了获取设备的描述符,现在进入第二步,设置设备的地址阶段。
该阶段是一个无数据过程的控制传输。首先,在建立过程中USB主机往设备的端点0发出一个设置地址的请求,新地址在建立过程的数据包中。该事务的结构包括:SETUP0令牌包+SET_ADDRESS数据包+握手包。在建立过程之后直接进入到的状态过程,因为设置地址阶段是一个无数据过程的控制传输。在状态过程,设备等待主机请求状态返回(即等待主机发送一个IN令牌包),收到IN令牌包后,设备就返回一个0长度的数据包,如果主机确认该数据包已经正确收到,就会发送应答包ACK给设备,设备收到ACK之后,就要启动新的设备地址,这样设备就分配到了一个唯一的设备地址。
接下来将这段设置地址的过程通过USB分析仪捕捉分析如下
接着分析STM32 USB_HID例子中的枚举过程的设置地址阶段。同样在接收到主机的setup0令牌后,STM32 USB进入中断处理函数Setup0_Process(),由于是没有数据过程的控制传输,接着进入NoData_Setup0()函数,函数最后通过USB_StatusIn()等待主机的IN令牌,即状态阶段。主机发IN令牌进入到状态阶段,USB中断函数中执行In0_Process()函数,该函数把在建立过程函数Setup0_Process()中保存在pInformation的地址信息,通过SetDeviceAddress()函数,配置新的设备地址。串口的调试信息如下
至此,设备新的地址设置成功,这里设置成0x6,之后的过程将使用这个新地址。