CH375主机模式,枚举正常。设备每4ms发送一帧数据,数据的内容每次自加1。主机判断接收的内容,发现丢帧。 主机的接收过程如下: 在定时器中断里,用固定周期recv_signal; 在外部中断里,读取状态,如果成功则接收(中断里接收),错误则clr_stall_recv_raw“复位设备端的指定端点到DATA0”。
上面所说的定时器周期用2ms时,丢包最小,用4ms和1ms周期丢包更多。是不是我的接收机制有问题?谢谢大家的指教
void recv_signal(void) { g_CH375_Status = CH375_RECV; toggle_recv(tog_recv); tog_recv = ~tog_recv; /* 切换DATA0和DATA1进行数据同步 */ issue_token_raw( ( endp_in_addr << 4 ) | DEF_USB_PID_IN ); /* 请求CH375输出数据 */ }
void issue_token_raw( unsigned char endp_and_pid ) { /* 执行USB事务 */ /* 执行完成后, 将产生中断通知单片机, 如果是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通讯失败后,复位设备端的指定端点到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 ); }