ch374T操作usb鼠标碰到的问题

我现在用arm通过ch374T的spi接口来采集鼠标的数据。现在的问题是有的鼠标可以正常工作,mcu能够正常接收。但是有的鼠标不行。我的mcu这边每1ms定时的发出一个发送中断端点的令牌IN,同时在中断处理程序里面处理从374里接收鼠标传过来的数据。现在经过跟踪测试,发现MCU发起每次令牌IN,中断INT脚变低,MCU能进入中断CALLBACK函数执行,并且读取REG_INTER_FLAG寄存器返回的状态信息( status & BIT_IF_TRANSFER )值为真,表示374已经接收到鼠标下传的数据,但是在发现清除中断标志后: Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); status = Read374Byte( REG_USB_STATUS ); 读到的状态信息却为0X80,请问这到底是什么回事,麻烦贵司技术人员给我分析一下。为什么有的鼠标可以,但是有的鼠标在传输完成( status & BIT_IF_TRANSFER )==1,继续读 REG_USB_STATUS 状态怎么变成0X80?没有接收到鼠标数据呢?

下面是我的部分代码:

//MCU定时发送获取鼠标数据的IN令牌 T_VOID TokenInPidSend(T_VOID) { Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( pid, endp_addr ) ); // 指定令牌PID和目的端点号 Write374Byte( REG_USB_H_CTRL, ( tog ? ( BIT_HOST_START | BIT_HOST_TRAN_TOG | BIT_HOST_RECV_TOG ) : BIT_HOST_START ) ); // 设置同步标志并启动传输 }

T_VOID TokenCmdTimer(T_VOID)//定时1MS发送一次 { TokenInPidSend(); }

//然后中断CALLBACK函数在每次IN令牌发出后都能进入 T_fGPIO_CALLBACK Ch374GetKeyCallback(T_U32 pin, T_U8 polarity) { T_U8 buff[60]; T_U8 index,s,u,respond; T_U8 status=0;

//printf( "\nI am in receive data int \n"); gpio_int_control(pin, GPIO_INTERRUPT_DISABLE); status = Read374Byte( REG_INTER_FLAG ); if ( status & BIT_IF_TRANSFER )//transfer complete { T_U8 retstus;

Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); status = Read374Byte( REG_USB_STATUS ); respond = status & BIT_STAT_DEV_RESP;//USB device respond state //printf("%02x ", (T_U16)status); if ( M_IS_HOST_IN_DATA( status ) )//DEF_USB_PID_DATA0 or DEF_USB_PID_DATA1 { if ( status & BIT_STAT_TOG_MATCH ) retstus = ( USB_INT_SUCCESS ); } else if ( respond == DEF_USB_PID_STALL || respond == DEF_USB_PID_NAK ) retstus = ( respond | 0x20 ); else if ( ! M_IS_HOST_TIMEOUT( status ) ) retstus = ( respond | 0x20 );//unexpected ACK

if(retstus = USB_INT_SUCCESS) { T_U8 count,cnt,buffer[4];

count = Read374Byte( REG_USB_LENGTH ); if(count != 4) goto WaitDeviceOut; Read374Block( RAM_HOST_RECV, count, buffer ); gUDevInf.tog1 = gUDevInf.tog1 ? 0 : 1;

for(cnt=0;cnt!=4;cnt++) printf("%02x ", (T_U16)buffer[cnt]); printf("\n");

//UsbMouseSendEvent(buffer); MouseIconDisplay(buffer[1], buffer[2]); }

麻烦贵司的工程技术人员帮我分析一下,不胜感激! 是不是在374已经接收到了鼠标下传的数据后,我的定时TokenCmdTimer函数又发了一次令牌PID IN后,产生了新的中断将374原来的接收缓冲区中的数据给清除掉了吗?

这个可能和时序有关,可以把你的主机发送PID函数贴出来看看.在硬件上,USB外壳要接地,保证供电稳定


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