最近在做USB设备端,用st的usb库做起来挺简单的。想改用电脑圈圈的USB库来学习一下,结果因为设置的端点0的最大包长是16字节,而设备描述符是18字节,所以要分两次发送,就出现了如下的问题:
总线复位
USB端点0 Setup。
USB标准输入请求:获取描述符——设备描述符,要求64字节
写端点0缓冲区16字节:
0x12 0x01 0x10 0x01 0x00 0x00 0x00 0x10 0x88 0x88 0x06 0x00 0x00 0x01 0x01 0x02
USB端点0 IN中断。
写端点0缓冲区2字节:
0x03 0x01
EP0 OUT中断,数据包长度=0
总线复位
USB端点0 Setup。
USB标准输出请求:设置地址。地址为:30
写端点0缓冲区0字节:
USB端点0 IN中断。
改变本机地址
IN完成
USB端点0 Setup。
USB标准输入请求:获取描述符——设备描述符,要求18字节
写端点0缓冲区16字节:
0x12 0x01 0x10 0x01 0x00 0x00 0x00 0x10 0x88 0x88 0x06 0x00 0x00 0x01 0x01 0x02
USB端点0 IN中断。
写端点0缓冲区2字节:
0x03 0x01
EP0 OUT中断,数据包长度=0
USB端点0 IN中断。
IN完成
LCD ID:8989
SPI_FLASH_TYPE=ef14
总线复位
USB端点0 Setup。
USB标准输入请求:获取描述符——设备描述符,要求64字节
写端点0缓冲区16字节:
0x12 0x01 0x10 0x01 0x00 0x00 0x00 0x10 0x88 0x88 0x06 0x00 0x00 0x01 0x01 0x02
USB端点0 IN中断。
写端点0缓冲区2字节:
0x03 0x01
EP0 OUT中断,数据包长度=0
总线复位
USB端点0 Setup。
USB标准输出请求:设置地址。地址为:31
写端点0缓冲区0字节:
USB端点0 IN中断。
改变本机地址
IN完成
USB端点0 Setup。
USB标准输入请求:获取描述符——设备描述符,要求18字节
写端点0缓冲区16字节:
0x12 0x01 0x10 0x01 0x00 0x00 0x00 0x10 0x88 0x88 0x06 0x00 0x00 0x01 0x01 0x02
USB端点0 IN中断。
写端点0缓冲区2字节:
0x03 0x01
EP0 OUT中断,数据包长度=0
USB端点0 IN中断。
IN完成
挂起
可以看到,红色部分,在主机第二次请求设备描述符时,已经按照第一次读取的设备描述符的第一字节,获得了设备描述符总长度是18,所以第二次获得设备描述符要求了18字节。
18字节分成16+2 IN给主机的时候,发送完16字节,再发剩余2字节时,主机提前返回了状态阶段的0字节数据包,造成了剩余2字节主机读取错误。
请问主机为什么在读取剩余2字节之前,就返回了0字节数据包?应该怎么处理? |