ch374T操作usb鼠標碰到的問題

我現在用arm通過ch374T的spi接口來采集鼠標的數據?,F在的問題是有的鼠標可以正常工作,mcu能夠正常接收。但是有的鼠標不行。我的mcu這邊每1ms定時的發(fā)出一個發(fā)送中斷端點的令牌IN,同時在中斷處理程序里面處理從374里接收鼠標傳過來的數據。現在經過跟蹤測試,發(fā)現MCU發(fā)起每次令牌IN,中斷INT腳變低,MCU能進入中斷CALLBACK函數執(zhí)行,并且讀取REG_INTER_FLAG寄存器返回的狀態(tài)信息( status & BIT_IF_TRANSFER )值為真,表示374已經接收到鼠標下傳的數據,但是在發(fā)現清除中斷標志后: Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); status = Read374Byte( REG_USB_STATUS ); 讀到的狀態(tài)信息卻為0X80,請問這到底是什么回事,麻煩貴司技術人員給我分析一下。為什么有的鼠標可以,但是有的鼠標在傳輸完成( status & BIT_IF_TRANSFER )==1,繼續(xù)讀 REG_USB_STATUS 狀態(tài)怎么變成0X80?沒有接收到鼠標數據呢?

下面是我的部分代碼:

//MCU定時發(fā)送獲取鼠標數據的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發(fā)送一次 { TokenInPidSend(); }

//然后中斷CALLBACK函數在每次IN令牌發(fā)出后都能進入 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函數又發(fā)了一次令牌PID IN后,產生了新的中斷將374原來的接收緩沖區(qū)中的數據給清除掉了嗎?

這個可能和時序有關,可以把你的主機發(fā)送PID函數貼出來看看.在硬件上,USB外殼要接地,保證供電穩(wěn)定


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频