最近幾天正在學(xué)習(xí)CH376T模塊,因任務(wù)需要,要實現(xiàn)作為HOST需要和CDC類設(shè)備進(jìn)行通信;作為Device能和電腦進(jìn)行數(shù)據(jù)往來。使用硬件SPI與CH376進(jìn)行控制。首先,在進(jìn)行驗證CH376作為HOST時,設(shè)置的為主機(jī)模式6,已經(jīng)能夠正常通過EP0端點收到并成功分析和保存了各種描述符信息,也將CDC設(shè)備的數(shù)據(jù)收/發(fā)接口的端點進(jìn)行保存。然后是嘗試進(jìn)行往CDC設(shè)備發(fā)送數(shù)據(jù),發(fā)送函數(shù)摘自打印機(jī)例程,代碼如下
void send_data( uint8_t len, uint8_t *buf )
{ ?
?? ?uint8_t l, s;
?? ?while( len ) ???????? /* 連續(xù)輸出數(shù)據(jù)塊給USB打印機(jī) */
????{
?? ??? ?toggle_send( tog_send );? ????????? /* 數(shù)據(jù)同步 */
?? ??? ?l = len>endp_out_size?endp_out_size:len;????? /* 單次發(fā)送不能超過端點尺寸 */
?? ??? ?WR_USB_DATA( l, buf );? ????????????/* 將數(shù)據(jù)先復(fù)制到CH375芯片中 */
?? ??? ?issue_token( 0X40, ( endp_out_addr << 4 ) | DEF_USB_PID_OUT );?? //endp_out_addr = 0x03 ???
?? ??? ?s = wait_interrupt();? ??????????????? ? /* 請求CH375輸出數(shù)據(jù) */
?? ??? ?if ( s == USB_INT_SUCCESS )????? /* CH375成功發(fā)出數(shù)據(jù) */
?? ??? ?{ ?
?? ??? ??? ?tog_send = ~ tog_send;???????? /* 切換DATA0和DATA1進(jìn)行數(shù)據(jù)同步 */
?? ??? ??? ?len-=l;? ?????????????????????????????????? /* 計數(shù) */
?? ??? ??? ?buf+=l;? ????????????????????????????????? /* 操作成功 */
?? ??? ?}
?? ??? ?else if ( s== 0x2A)
?? ??? ?{? /* USB打印機(jī)正忙,如果未執(zhí)行SET_RETRY命令則CH375自動重試,所以不會返回USB_INT_RET_NAK狀態(tài) */
?? ??? ??? ?/* USB打印機(jī)正忙,正常情況下應(yīng)該稍后重試 */
?? ??? ??? ?/* s=get_port_status( );? 如果有必要,可以檢查是什么原因?qū)е麓蛴C(jī)忙 */
?? ??? ??? ?printf("USB is Busy\r\n");
?? ??? ?}
?? ??? ?else ????????????????/* 操作失敗,正常情況下不會失敗 */
?? ??? ?{?
?? ??? ??? ?clr_stall( endp_out_addr );????????? /* 清除打印機(jī)的數(shù)據(jù)接收端點,或者 soft_reset_print() */
/*?? ??? ??? ?soft_reset_print();? 打印機(jī)出現(xiàn)意外錯誤,軟復(fù)位 */
????????????tog_send = 0;? ????????????????????????????/* 操作失敗 */
?? ??? ???? CH376_WriteCmd(CMD_UNLOCK_USB);??????? //此行為我自行添加,猜測當(dāng)前端點的緩存區(qū)未被釋放?
?? ??? ????
?? ??? ?//?? ?printf("USB never Back data, and over time\r\n");
?? ??? ?}
/* 如果數(shù)據(jù)量較大,可以定期調(diào)用get_port_status()檢查打印機(jī)狀態(tài) */
?? ?}
}
遇到的問題:
1、往發(fā)送端點發(fā)送數(shù)據(jù),中斷查詢返回一直為0x28的數(shù)據(jù),請問通常遇到此類通信錯誤的問題,解決的點在哪?
2、另外的疑惑,在命令列表中,有看到端點0、端點1和端點2的相關(guān)設(shè)置命令,對于其他端點的操作該如何進(jìn)行?
3、對于端點的發(fā)送數(shù)據(jù),都提到了端點數(shù)據(jù)同步的命令操作,但對于命令,也僅設(shè)計涉及到端點0、端點1、端點2,對設(shè)備其他的端點,如端點3,該怎么進(jìn)行數(shù)據(jù)同步?