打印

stm32f103 usb使用电脑圈圈的库时枚举的问题

[复制链接]
1765|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sdwuyawen|  楼主 | 2013-10-22 18:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近在做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字节数据包?应该怎么处理?
沙发
sdwuyawen|  楼主 | 2013-10-23 12:17 | 只看该作者
自己来回答吧。由于发送16字节之后,串口打印信息,占用了很长时间,所以主机过了很长时间也没有收到剩余的2字节,主机就OUT 0字节,退出本次IN事务。把串口打印去掉,或者先打印,再使能发送16字节,就能正确传输剩余的2字节了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

6

帖子

0

粉丝