CH375主機接收丟幀

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

設(shè)備端的程序測試過,用它來發(fā)送PC,是沒丟幀的。設(shè)備描述符的輪詢周期是1ms.


理論上來應(yīng)該不丟數(shù)據(jù),1MS計算機最多取15包64字節(jié)的數(shù)據(jù),單片機也可以取這么多。所以建議你看下你的取程序上面,還有一個就是設(shè)備端程序是不是傳輸成功之后在傳輸?shù)诙?/p>


更新一下, 設(shè)備用4ms發(fā)送時,主機定時發(fā)送接收令牌的周期用4ms(小了基本上都不正確),此時丟包最小,大概100個包丟一個,丟包的次數(shù)大約clr_stall_recv_raw的三分之二; 設(shè)備用2ms發(fā)送時,主機定時發(fā)送接收令牌的周期用2ms(小了基本上都不正確),此時丟包最小,大概100個包丟一個,丟包的次數(shù)大約clr_stall_recv_raw的一半。 設(shè)備端是不等主機端應(yīng)答,一直發(fā)數(shù)據(jù)的。


主機中斷接收程序 u32 test_err_count=0;//這個變量觀察有沒有丟包 u8 test_start=0; vu8 rbuf[64]; vu8 rdata[4096];//觀察前4K數(shù)據(jù) 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]; } }


按照你描述的現(xiàn)象,問題的根本不是出現(xiàn)在主機取的問題,而在于你設(shè)備傳輸?shù)臅r候有問題。按照USB傳輸來說,計算機主機來取數(shù)據(jù)需要不停的發(fā)生IN的令牌包,才能保證數(shù)據(jù)的不丟失,而如果設(shè)備端沒有數(shù)據(jù)的話,那么應(yīng)該給主機返回NAK。但是你描述的現(xiàn)象是你的設(shè)備一直有設(shè)備。只要主機來取就能取到設(shè)備。這個明顯是存在問題的。


正常的工作方式的是一問一答制,主機和設(shè)備都是收到對方的返回,或者超過通信周期一定時間,如30ms才發(fā)下一幀的。現(xiàn)在在測試CH375的接收,所以設(shè)備才不斷發(fā)送數(shù)據(jù)。 在PC上寫了個上位機程序,測試設(shè)備的發(fā)送,設(shè)備的是EP_TX_NAK才發(fā)送的,是沒有丟幀的。用CH375作主機時,在CH375中斷接收里面,將MCU的某只管腳置1和清0,再用示波器測試,發(fā)現(xiàn)一段時間有脈沖一段時間沒的。將CH375的接收改為在while(1)里面查詢接收也無效。再測試CH375的發(fā)送,基本上沒成功發(fā)送。 現(xiàn)在,將問題的焦點放到枚舉過程和讀寫時序。坊寫時序打算用CMD_CHECK_EXIST來測試,寫入后回讀,不知這種思路有沒有錯


另,CH375是設(shè)置了不重發(fā)的,每幀通信數(shù)據(jù)大小為32字節(jié)


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

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