设备枚举获取配置描述符时报错返回0x2E错误,USB_PID_STALL 请问如何解决
调整复位后端口使能时间试试看,
这个10改成20,30试试看。
请问,我也是在使用官网下载的最新的 CH559操作扫马枪直接字符输出 这个例程时,也是在插入条码枪的时候提示错误 2E ,我修改了延时200ms,也是有这个问题,这能解决吗?
Start @ChipID=59
Wait Device In
HUB 1 dev in
0000 5465
EnumAllRootDev01
Reset root hub 1# port
GetDevDescr: A00003 1
A00003 1
A00004 1
endp_pid=90
USB_INT_FG=2E
USB_INT_ST=2E
USB_MIS_ST=AA
USB_RX_LEN=7E
UH_TX_LEN=01
UH_RX_CTRL=50
UH_TX_CTRL=50
UHUB0_CTRL=08
UHUB1_CTRL=09
A00222 E09
A00004 3593
endp_pid=90
USB_INT_FG=2E
USB_INT_ST=2E
USB_MIS_ST=2A
USB_RX_LEN=7E
UH_TX_LEN=01
UH_RX_CTRL=50
UH_TX_CTRL=50
UHUB0_CTRL=08
UHUB1_CTRL=09
A00222 E09
A00004 3593
endp_pid=90
USB_INT_FG=2E
USB_INT_ST=2E
USB_MIS_ST=2A
USB_RX_LEN=7E
UH_TX_LEN=01
UH_RX_CTRL=50
UH_TX_CTRL=50
UHUB0_CTRL=08
UHUB1_CTRL=09
A00222 E09
00014 20
00011 20
InitRootDev Err = 20
EnumAllRootDev err = 20
HUB 1 dev out
使用CH559EVT进行测试:/downloads/CH559EVT_ZIP.html
注意一下USB_HOST例程中的延时函数,增加下延时函数mDelayuS的延时时常,特别是高主频的时候。
测试一下相同环境下是否能够操作键盘鼠标。
还有不能排除特定扫码枪不支持USB全速功能。
用EVT里面的USBHOST,只能连接U盘,鼠标和条码枪都连不上, 而用那个条码枪直接输出字符那个例程,可以连接u盘和鼠标,不能连接条码枪,是在数据传输事务中出错
继续查找问题点
插入条码枪的时候,通讯数据第二段的时候,USB_INT_FG 的值是 2E, U_TOG_OK=0 ,所以结果就是 接收出错 我已经把前面的 延时加大了 WAIT_USB_TOUT_200US1000 // 等待USB中断超时时间200uS@Fsys=12MHz 请问要怎么处理呢
well its my expieriance that delays often just mask bugs.
your device uses EP0MaxLen=0x40. (shown in byte7 of the Dev Descriptor)
for some reason you just get 8 bytes which may be legal if you request 8 bytes (linux for example does enum this way)
your vars show that you are still expect more which does violates the spec, your device might or might not respond correctly.
并不是64字节的问题,从该条码枪插在电脑USB上,和电脑之间的通讯看出,条码枪也是返回18个字节的数据,
USB主机常见的行为是先获取8字节长度描述符,然后复位一次设备,之后再获取完整的设备描述符。
有可能设备的相应不是特别完善,第一次只能够回复前8字节描述符,需要复位后才会继续响应。
所以尝试一下第一次只获取8字节设备描述符,然后进行总线复位,之后再正常的走枚举流程。
s初始化的时候已经复位过一次了,这里在获取设备描述符的时候,前面8个获得正确,后面的就出错了,你意思是在这里8个以后,直接再复位一次?再重新获取?
尝试一下
What does the GetDevDescriptor() request send to your device? (wLength field)
Remember the CH559 is host so it can send anything. All OS have more or less tests to handle faulty devices.
Example: A Host can decite to cancel a pending request. Often this not correctly implemented in device firmware
Here is a short list how Win since the early times does the enum
UsbReset
USBGetDescriptor(Device); wLength=0x40
UsbReset
USBGetDescriptor(Device); wLength=sizeof(UsbDeviceDescriptor)
USBGetDescriptor(Config); wLength=sizeof(UsbConfigDescriptor)
USBGetDescriptor(Config); wLength=wtotalLength
UsbSetAddress()
here some more requests may occur depending on WinVer and descripors
Parse the Config Descriptor to learn about the device functions
UsbSetConfig(); this is actually not part of the enum
Now the device is in working state and can be used as intented.
Note: the CH559 hostfirmware is responsible for dividing the descriptors into Ep0MaxSize packets.
Linux and Mac OS just issue a USbGetDescriptor(Device) with wLength=0x08 to read Ep0MaxSize and omit the extra reset.
I have used the CH559 in the past to enum various devices for differnt classes. It might be a good idea to put the enum code in an extra function.
类似电脑软件的抓包工具和实际USB物理层的数据传输还有有着不小的差距。
尝试一下在首次获取8字节设备描述符之后复位一次总线,再开始系列操作。
如此尝试之后若还是无法正常通讯,可以直接联系025-52632854,也可将设备寄过来,我们使用USB分析仪来看一下实际的传输情况。
我这里有2个品牌的条码枪,其中一个报2E错误,另一个能正常工作,我先进行后面的工作。这个问题先放一下。
谢谢大家的指导。