CH375主机接收丢帧

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 ); }

设备端的程序测试过,用它来发送PC,是没丢帧的。设备描述符的轮询周期是1ms.


理论上来应该不丢数据,1MS计算机最多取15包64字节的数据,单片机也可以取这么多。所以建议你看下你的取程序上面,还有一个就是设备端程序是不是传输成功之后在传输第二包?


更新一下, 设备用4ms发送时,主机定时发送接收令牌的周期用4ms(小了基本上都不正确),此时丢包最小,大概100个包丢一个,丢包的次数大约clr_stall_recv_raw的三分之二; 设备用2ms发送时,主机定时发送接收令牌的周期用2ms(小了基本上都不正确),此时丢包最小,大概100个包丢一个,丢包的次数大约clr_stall_recv_raw的一半。 设备端是不等主机端应答,一直发数据的。


主机中断接收程序 u32 test_err_count=0;//这个变量观察有没有丢包 u8 test_start=0; vu8 rbuf[64]; vu8 rdata[4096];//观察前4K数据 vu16 rdata_count=0; void Handle_CH375Recv(void) { u16 len; u8 i;

len = CH375_ReadUSBDat(rbuf); if(len==0) {

} else if(len<=32) { test_ch375rx += len; if((test_start+1)!=rbuf[0]) { test_err_count++; }

for(i=0;i<16;i++) rdata[rdata_count++] = rbuf[i]; if(rdata_count>=sizeof(rdata)) { rdata_count = sizeof(rdata)-1; }

test_start = rbuf[0]; } }


按照你描述的现象,问题的根本不是出现在主机取的问题,而在于你设备传输的时候有问题。按照USB传输来说,计算机主机来取数据需要不停的发生IN的令牌包,才能保证数据的不丢失,而如果设备端没有数据的话,那么应该给主机返回NAK。但是你描述的现象是你的设备一直有设备。只要主机来取就能取到设备。这个明显是存在问题的。


正常的工作方式的是一问一答制,主机和设备都是收到对方的返回,或者超过通信周期一定时间,如30ms才发下一帧的。现在在测试CH375的接收,所以设备才不断发送数据。 在PC上写了个上位机程序,测试设备的发送,设备的是EP_TX_NAK才发送的,是没有丢帧的。用CH375作主机时,在CH375中断接收里面,将MCU的某只管脚置1和清0,再用示波器测试,发现一段时间有脉冲一段时间没的。将CH375的接收改为在while(1)里面查询接收也无效。再测试CH375的发送,基本上没成功发送。 现在,将问题的焦点放到枚举过程和读写时序。坊写时序打算用CMD_CHECK_EXIST来测试,写入后回读,不知这种思路有没有错


另,CH375是设置了不重发的,每帧通信数据大小为32字节


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