[求助]利用GetDeviceDescr函数获取全速usb设备描述符失败,返回0x20

我利用GetDeviceDescr函数获取低速usb设备描述符成功,但获取全速usb设备的设备描述符时总是返回0x20,调试跟踪发现GetDeviceDescr里面的HostCtrlTransfer374返回0x20,继续跟踪发现 UINT8 HostCtrlTransfer374( PUINT8C ReqBuf, PUINT8 DatBuf, PUINT8 RetLen ) // 执行控制传输,ReqBuf指向8字节请求码,DatBuf为收发缓冲区 // 如果需要接收和发送数据,那么DatBuf需指向有效缓冲区用于存放后续数据,实际成功收发的总长度保存在ReqLen指向的字节变量中 { UINT8 s, len, count, total; BOOL tog; Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); Write374Byte( REG_USB_LENGTH, 8 ); Delay_Us( 10 ); s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, FALSE, 200 ); // SETUP阶段,200mS超时 if ( s == USB_INT_SUCCESS ) { // SETUP成功 tog = TRUE; // 默认DATA1,默认无数据故状态阶段为IN total = *( ReqBuf + 6 ); if ( total && DatBuf ) { // 需要收发数据 ......................... 函数中的第一个WaitHostTransact374返回0x20,没有进入if条件执行,即s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, FALSE, 200 ); // SETUP阶段,200mS超时 执行该语句是返回0x20,PID_SETUP失败 我利用该程序读取低俗usb时都成功没有问题,为什么读取全速usb时出现了问题呢?请技术人员和高手帮帮忙啊。

我又跟踪HostTransact374函数调试了下,发现低速usb设备在执行该函数时, UINT8 HostTransact374( UINT8 EndpointAddress, UINT8 pid, BOOL tog ) { // 本子程序着重于易理解,而在实际应用中,为了提供运行速度,应该对本子程序代码进行优化 UINT8 retry; UINT8 s, r; //主要是为了增加兼容性和提高速度,在控制传输部分和正常的数据传输时用的次数不一样。 for ( retry = 0; retry <3; retry ++ ) { Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( pid, EndpointAddress ) ); // 指定令牌PID和目的端点号 //Write374Byte( REG_USB_H_CTRL, BIT_HOST_START | ( tog ? ( BIT_HOST_TRAN_TOG | BIT_HOST_RECV_TOG ) : 0x00 ) ); // 设置同步标志并启动传输 Write374Byte( REG_USB_H_CTRL, ( tog ? ( BIT_HOST_START | BIT_HOST_TRAN_TOG | BIT_HOST_RECV_TOG ) : BIT_HOST_START ) ); // 设置同步标志并启动传输 //Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE ); // 取消暂停 //mDelayuS( 200 ); // 等待传输完成 s = Wait374Interrupt( ); if ( s == ERR_USB_UNKNOWN ) return( s ); // 中断超时,可能是硬件异常 s = Read374Byte( REG_INTER_FLAG ); // 获取中断状态 if ( s & BIT_IF_TRANSFER ) { // 传输完成 Delay_Us( 200 ); // 等待传输完成 Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); // 清中断标志 s = Read374Byte( REG_USB_STATUS ); // USB状态 r = s & BIT_STAT_DEV_RESP; // USB设备应答状态 switch ( pid ) { case DEF_USB_PID_SETUP: case DEF_USB_PID_OUT: ......................... 执行s = Read374Byte( REG_USB_STATUS ); // USB状态 获取usb状态时返回 s == 138 而全速usb设备返回 s == 136


应该就是这个地方出了问题,请问技术人员,这是什么原因造成的呢?应该不是延时的原因,因为我修改过延时实验过的,还是不行,是不是ch374内部自身电路对于usb2.0设备有啥特殊要求呢?希望技术人员和高手能够回答一下,谢谢


for ( retry = 0; retry <254; retry ++ ) 这样修改。这主要是因为低速芯片速度比较慢,如果操作过快,可能低速芯片本身没有准备好导致CH374发送SETUP令牌后,DEVICE芯片无应答 ,你参考main.c


行,我试一试


不行啊,结果还是一样,是读取低速usb时没有问题,高速usb时有问题


只有登录才能回复,可以选择微信账号登录