關(guān)于CH376作HOST的問題請(qǐng)教

現(xiàn)在的問題又回到了發(fā)送的上面,在邏輯分析儀的抓包中,可以看到發(fā)送的端點(diǎn),地址和數(shù)據(jù)都是正常的。在進(jìn)入CDC設(shè)備的調(diào)試后,也在接收端點(diǎn)的回調(diào)函數(shù)中進(jìn)行調(diào)試,發(fā)現(xiàn)數(shù)據(jù)并未到達(dá)該設(shè)備接收端點(diǎn)的緩存區(qū)域。此問題得結(jié)合設(shè)備進(jìn)行排查。

最后,感謝技術(shù)大佬的解答。


@~~稻草人

你好,我仍一直在嘗試CH376的發(fā)送數(shù)據(jù)。目前就是在CDC設(shè)備仍不會(huì)進(jìn)行接收來(lái)自CH376數(shù)據(jù),用邏輯分析儀,USBLyzer等工具進(jìn)行抓包,在電腦PC下傳和CH376主機(jī)下傳的數(shù)據(jù)、地址、包格式等都一致 ,只有PC下傳CDC設(shè)備能夠響應(yīng)。CDC設(shè)備是STM32基于USB OTG的設(shè)備。在CDC的調(diào)試代碼調(diào)試中加入斷點(diǎn),PC下傳能夠正常進(jìn)入斷點(diǎn),CH376下傳則不去觸發(fā)。

數(shù)據(jù)接收已經(jīng)能夠正常進(jìn)行。

另外,我將CH376作為從機(jī)的時(shí)候,電腦能夠?qū)⒃O(shè)備枚舉,在設(shè)備管理器中出現(xiàn)了CH372_CDC設(shè)備的標(biāo)志。但顯示小黃標(biāo),點(diǎn)開顯示是驅(qū)動(dòng)無(wú)正常安裝。工程移植自CH376做CDC設(shè)備進(jìn)行通信的例程。


發(fā)送程序能夠正常下發(fā),貼上我的發(fā)送代碼。

/* 主機(jī)發(fā)送數(shù)據(jù)塊,一次最多64KB */
void send_data( uint8_t len, uint8_t *buf )
{ ?
?? ?uint8_t l, s;
?? ?
?? ?while( len ) /* 連續(xù)輸出數(shù)據(jù)塊給USB打印機(jī) */
?? ?{ ?
?? ??? ?if((send_mode &0x40) == 0x40)????????
?? ??? ?{
?? ??? ??? ?send_mode = 0x00;
?? ??? ?}
?? ??? ?else
?? ??? ??? ?send_mode = 0x40;

?? ??? ?toggle_send( tog_send ); ??? ?/* 數(shù)據(jù)同步 */?? ?
?? ??? ?l = len>endp_out_size?endp_out_size:len;? /* 單次發(fā)送不能超過端點(diǎn)尺寸 */
?? ??? ?WR_USB_DATA( l, buf ); ??? ?/* 將數(shù)據(jù)先復(fù)制到CH375芯片中 */
?? ??? ?issue_token(send_mode, ( endp_out_addr << 4 ) | DEF_USB_PID_OUT );
?? ??? ?s = wait_interrupt(); ??? ??? ?/* 請(qǐng)求CH375輸出數(shù)據(jù) */?? ? ?
?? ??? ?if ( s == USB_INT_SUCCESS ) /* CH375成功發(fā)出數(shù)據(jù) */
?? ??? ?{ ?
?? ??? ??? ?tog_send = ~ tog_send;? /* 切換DATA0和DATA1進(jìn)行數(shù)據(jù)同步 */
?? ??? ??? ?len-=l; ??? ??? ?/* 計(jì)數(shù) */
?? ??? ??? ?buf+=l; ??? ??? ?/* 操作成功 */
?? ??? ??? ?if(!len)
?? ??? ??? ?{
?? ??? ??? ??? ?printf("USB Send Data Success\r\n");
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{? /* 操作失敗,正常情況下不會(huì)失敗 */
?? ??? ?//?? ?clr_stall( endp_out_addr );? /* 清除打印機(jī)的數(shù)據(jù)接收端點(diǎn),或者 soft_reset_print() */
/*?? ??? ??? ?soft_reset_print();? 打印機(jī)出現(xiàn)意外錯(cuò)誤,軟復(fù)位 */
?? ??? ??? ?soft_reset_cdc( );
?? ??? ??? ?tog_send = 0;? /* 操作失敗 */
?? ??? ??? ?printf("USB never Back data, and over time\r\n");
?? ??? ??? ?return;
?? ??? ?}
?? ?}
}

接收函數(shù)仍有點(diǎn)小BUG,暫時(shí)不貼。


貼上接收代碼

//用中斷的方式去觸發(fā)中斷
uint8_t receive_data(uint8_t *buf)
{
?? ?uint8_t s,len;
?? ?for(uint8_t i=0; i!= 10; i++)
?? ?{
?? ??? ?toggle_recev(tog_recv);
?? ??? ?issue_token(0x80, (endp_in_addr << 4)| DEF_USB_PID_IN);?? ?//endp_in_addr 0x81
?? ??? ?s = wait_interrupt();?? ?
// ? ???? Delay_ms(100);?? ?
// ? ???? Delay_ms(100);?? ?
?? ??? ?printf("status is 0x%02x\r\n",s);
?? ??? ?if(s == USB_INT_SUCCESS)
?? ??? ?{
?? ??? ??? ?tog_recv = ~tog_recv;
?? ??? ??? ?len = RD_USB_DATA(buf);?? ??? ?

?? ??? ??? ?clr_stall( endp_in_addr );
?? ??? ??? ?return len;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?tog_recv = 0;
?? ??? ??? ?clr_stall( endp_in_addr );
?? ??? ??? ?return 0;
?? ??? ?}
?? ?}
}
代碼能夠接收來(lái)自設(shè)備的數(shù)據(jù),但當(dāng)設(shè)備發(fā)送數(shù)據(jù)過頻繁,導(dǎo)致接收緩存溢出,此函數(shù)接收的數(shù)據(jù)會(huì)錯(cuò)誤。


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

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