2 wValue 2 数值 该域的意义有具体的请求决定
4 wIndex 2 索引 该域的意义有具体的请求决定
6 wLength 2 字节数 数据过程所需传输的字节数
表2 标准请求及其代码
brequeest 代码(value) brequest 代码(value)
GET_STATUES 0 GET_CONFIGUATION 8
CLEAR_FEATURE 1 SET_CONFIGUATION 9
SET_FEATURE 3 SET_INTRFECT 10
SET_ADDRESS 5 GET_INTERFACT 11
GET_DESCRIPTOR 6 SYNCH_FRAME 12
SET_DESCRIPTOR 7
将标准请求结构和从端点0读出的8位数据信息核对,可以知道,该请求是设备描述符的标准请求。接下来要在数据过程中返回设备的设备描述符。每个设备都有唯一的一个描述符,其结构在USB的协议中都有具体详细的定义。依据USB协议中设备描述符的结构构造一个设备描述符。接下来要将设备描述符返回给主机。
在USB中断处理的端点0的中断处理散转移函数中,判断接收的建立过程的数据,若请求是获取设备描述符,那么将设备描述符数据写入端点0输入缓冲区中,之后立即使能端点发送,在下一次发送输入令牌后,PDIUSBD12将会将端点0缓冲区中的数据返回给主机,于是设备描述符被主机获取。具体做法是先写一个写数据到端点输入缓冲区的函数,再写一个将端点缓冲区设置为有效的函数。这样写数据函数就准备完毕[11]。
分析建立过程数据包的内容,以便确定在什么时候返回设备描述符。编写判断具体请求的函数,对不同的请求做相应的散转移处理。在获取描述符的处理中增加对具体描述符散转移处理。至此设备描述符代码编写完成,进行调试,可以发现设备描述符成功返回,并且发送了设置地址请求。设备描述符请求及返回流程图如图8所示。
图8 设备描述符请求及返回流程图
4.2.3 地址请求处理函数
在主机与USB设备通信之前,主机必须为该设备分配一个地址,为设备重新分配地址的过程比较简单。主机在设置地址请求时分配给每个USB设备唯一的一个地址,该地址为7位数据,在wValued的低字节中。设置地址命令后跟一字节数据写入操作,该字节的第7位用来控制设备是否使能,只有该位使能后,PDIUSBD12的普通端点才能通过使能端点命令启用。设备收到地址请求之后返回一个0长度的状态数据包。设备正确接收主机的应答信号之后就开始启用新的地址。利用PDIUSBD12提供的设置地址命令:0xD0 来编写设置地址函数。地址请求处理函数写好后,需要修改端点0输出中断设置地址的处理。在这里要等主机返回应答包之后新地址才会生效。编译下载后用串口调试工具调试,发现地址变成了0x31,说明地址操作成功。地址请求处理流程图如图9所示。
图9 地址请求处理流程图
4.2.4 配置描述符集合及其向主机的返回
USB设备至少要有一个配置描述符,在设备描述符中规定了该设备有多少种配置,每种配置都有一个描述符。本USB鼠标只有一个配置描述符。但是在配置描述符之后,依次是接口描述符,端点描述符,HID描述符,它们不能单独返回,必须跟着配置描述符一起返回。以上各种描述符的结构在USB协议中都有详细的定义,根据定义构造各种描述符,通过微控制器发送到接口芯片的相应缓冲器或者寄存器中。在启用新的地址后,主机又一次发送设备描述符请求,并且会完整获取设备描述符。接着主机又会发送获取配置描述符的请求,成功之后,主机会将端点描述符、类特殊描述符、配置描述符、接口描述符一并读回。编写程序代码,实现配置描述符集合并返回给主机。编译程序代码,在串口调试中可以看到返回了配置描述符。配置描述符集合流程图如图10所示。 通用串行总线及外设开发+电路图+流程图(6):http://www.751com.cn/tongxin/lunwen_1525.html