CH375主機模式,枚舉正常。設(shè)備每4ms發(fā)送一幀數(shù)據(jù),數(shù)據(jù)的內(nèi)容每次自加1。主機判斷接收的內(nèi)容,發(fā)現(xiàn)丟幀。 主機的接收過程如下: 在定時器中斷里,用固定周期recv_signal; 在外部中斷里,讀取狀態(tài),如果成功則接收(中斷里接收),錯誤則clr_stall_recv_raw“復(fù)位設(shè)備端的指定端點到DATA0”。
上面所說的定時器周期用2ms時,丟包最小,用4ms和1ms周期丟包更多。是不是我的接收機制有問題?謝謝大家的指教
void recv_signal(void) { g_CH375_Status = CH375_RECV; toggle_recv(tog_recv); tog_recv = ~tog_recv; /* 切換DATA0和DATA1進行數(shù)據(jù)同步 */ issue_token_raw( ( endp_in_addr << 4 ) | DEF_USB_PID_IN ); /* 請求CH375輸出數(shù)據(jù) */ }
void issue_token_raw( unsigned char endp_and_pid ) { /* 執(zhí)行USB事務(wù) */ /* 執(zhí)行完成后, 將產(chǎn)生中斷通知單片機, 如果是USB_INT_SUCCESS就說明操作成功 */ CH375_Write_Cmd( CMD_ISSUE_TOKEN ); CH375_Write_Dat( endp_and_pid ); /* 高4位目的端點號, 低4位令牌PID */ }
unsigned char clr_stall_recv_raw( unsigned char endp_addr ) { /* USB通訊失敗后,復(fù)位設(shè)備端的指定端點到DATA0 */ CH375_Write_Cmd( CMD_CLR_STALL ); CH375_Write_Dat( endp_addr | 0x80 ); tog_recv = 0; //return( wait_interrupt() ); }
void toggle_recv( unsigned char tog ) { /* 主機接收同步控制:0=DATA0,1=DATA1 */ CH375_Write_Cmd( CMD_SET_ENDP6 ); CH375_Write_Dat( tog ? 0xC0 : 0x80 ); }