現(xiàn)在的問題又回到了發(fā)送的上面,在邏輯分析儀的抓包中,可以看到發(fā)送的端點,地址和數(shù)據(jù)都是正常的。在進入CDC設備的調(diào)試后,也在接收端點的回調(diào)函數(shù)中進行調(diào)試,發(fā)現(xiàn)數(shù)據(jù)并未到達該設備接收端點的緩存區(qū)域。此問題得結合設備進行排查。
最后,感謝技術大佬的解答。
現(xiàn)在的問題又回到了發(fā)送的上面,在邏輯分析儀的抓包中,可以看到發(fā)送的端點,地址和數(shù)據(jù)都是正常的。在進入CDC設備的調(diào)試后,也在接收端點的回調(diào)函數(shù)中進行調(diào)試,發(fā)現(xiàn)數(shù)據(jù)并未到達該設備接收端點的緩存區(qū)域。此問題得結合設備進行排查。
最后,感謝技術大佬的解答。
@~~稻草人
你好,我仍一直在嘗試CH376的發(fā)送數(shù)據(jù)。目前就是在CDC設備仍不會進行接收來自CH376數(shù)據(jù),用邏輯分析儀,USBLyzer等工具進行抓包,在電腦PC下傳和CH376主機下傳的數(shù)據(jù)、地址、包格式等都一致 ,只有PC下傳CDC設備能夠響應。CDC設備是STM32基于USB OTG的設備。在CDC的調(diào)試代碼調(diào)試中加入斷點,PC下傳能夠正常進入斷點,CH376下傳則不去觸發(fā)。
數(shù)據(jù)接收已經(jīng)能夠正常進行。
另外,我將CH376作為從機的時候,電腦能夠將設備枚舉,在設備管理器中出現(xiàn)了CH372_CDC設備的標志。但顯示小黃標,點開顯示是驅動無正常安裝。工程移植自CH376做CDC設備進行通信的例程。
發(fā)送程序能夠正常下發(fā),貼上我的發(fā)送代碼。
/* 主機發(fā)送數(shù)據(jù)塊,一次最多64KB */
void send_data( uint8_t len, uint8_t *buf )
{ ?
?? ?uint8_t l, s;
?? ?
?? ?while( len ) /* 連續(xù)輸出數(shù)據(jù)塊給USB打印機 */
?? ?{ ?
?? ??? ?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ā)送不能超過端點尺寸 */
?? ??? ?WR_USB_DATA( l, buf ); ??? ?/* 將數(shù)據(jù)先復制到CH375芯片中 */
?? ??? ?issue_token(send_mode, ( endp_out_addr << 4 ) | DEF_USB_PID_OUT );
?? ??? ?s = wait_interrupt(); ??? ??? ?/* 請求CH375輸出數(shù)據(jù) */?? ? ?
?? ??? ?if ( s == USB_INT_SUCCESS ) /* CH375成功發(fā)出數(shù)據(jù) */
?? ??? ?{ ?
?? ??? ??? ?tog_send = ~ tog_send;? /* 切換DATA0和DATA1進行數(shù)據(jù)同步 */
?? ??? ??? ?len-=l; ??? ??? ?/* 計數(shù) */
?? ??? ??? ?buf+=l; ??? ??? ?/* 操作成功 */
?? ??? ??? ?if(!len)
?? ??? ??? ?{
?? ??? ??? ??? ?printf("USB Send Data Success\r\n");
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{? /* 操作失敗,正常情況下不會失敗 */
?? ??? ?//?? ?clr_stall( endp_out_addr );? /* 清除打印機的數(shù)據(jù)接收端點,或者 soft_reset_print() */
/*?? ??? ??? ?soft_reset_print();? 打印機出現(xiàn)意外錯誤,軟復位 */
?? ??? ??? ?soft_reset_cdc( );
?? ??? ??? ?tog_send = 0;? /* 操作失敗 */
?? ??? ??? ?printf("USB never Back data, and over time\r\n");
?? ??? ??? ?return;
?? ??? ?}
?? ?}
}
接收函數(shù)仍有點小BUG,暫時不貼。
貼上接收代碼
//用中斷的方式去觸發(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;
?? ??? ?}
?? ?}
}
代碼能夠接收來自設備的數(shù)據(jù),但當設備發(fā)送數(shù)據(jù)過頻繁,導致接收緩存溢出,此函數(shù)接收的數(shù)據(jù)會錯誤。