您好,
我在使用CH32V307 提供的例程學(xué)習(xí)使用這個高速usb的外設(shè)。在使用例程時我碰到了幾個問題。
1)在端點(diǎn)初始化 USBHS_Device_Endp_Init 的時候有
????USBHSD->UEP1_TX_LEN??=?512; ????USBHSD->UEP1_TX_CTRL?=?USBHS_EP_T_AUTOTOG?|?USBHS_EP_T_RES_ACK; ????USBHSD->UEP1_RX_CTRL?=?USBHS_EP_R_AUTOTOG?|?USBHS_EP_R_RES_ACK;
這里是不是應(yīng)該吧TX_LEN設(shè)為0,并且用將TX設(shè)為NAK呢?初始化時并沒有數(shù)據(jù)才對?
2)在USB_CLEAR_FEATURE這段代碼中我看到了
case?0x02: ????????????????????????????????/*?SET?Endp2?Rx?to?USBHS_EP_R_RES_ACK;USBHS_EP_R_TOG_0?*/ ????????????????????????????????USBHSD->UEP2_TX_CTRL?=?USBHS_EP_R_RES_ACK?|?USBHS_EP_R_TOG_0; ????????????????????????????????break;
這里的UEP2_TX_CTRL應(yīng)該為UEP2_RX_CTRL吧,這是單純打錯了吧。抓個小蟲
3)我試著把這個例程里EP1,EP2的TX全部設(shè)為NAK,并且把原本把EP1 RX 數(shù)據(jù)轉(zhuǎn)到TX數(shù)據(jù)的代碼注釋掉后,發(fā)現(xiàn)我如果從主機(jī)請求數(shù)據(jù),每兩次中一次是timeout(正確的),但是另一次會返回空字符或者不定的字符。請問這是什么原因?在端點(diǎn)終端過后硬件會把之前設(shè)置的NAK清零成ACK嗎?代碼如下:
else?if(?end_num?==?1?) ????????{ ????????????if(?rx_token?==?PID_IN?) ????????????{ ????????????????USBHSD->UEP1_TX_CTRL?&=?~USBHS_EP_T_RES_MASK; ????????????????USBHSD->UEP1_TX_CTRL?|=?USBHS_EP_T_RES_NAK; ????????????} ????????????else?if(?rx_token?==?PID_OUT?) ????????????{ ????????????????rx_len?=?USBHSD->RX_LEN; ????????????????for(?i=0;?iUEP1_TX_LEN??=?rx_len; ????????????????//USBHSD->UEP1_TX_CTRL?&=?~USBHS_EP_T_RES_MASK; ????????????????//USBHSD->UEP1_TX_CTRL?|=?USBHS_EP_T_RES_ACK; ????????????????USBHSD->UEP1_RX_CTRL?&=?~?USBHS_EP_R_RES_MASK; ????????????????USBHSD->UEP1_RX_CTRL?|=?USBHS_EP_R_RES_NAK; ????????????} ????????}
這部分可能是我對USB或者這個芯片理解不夠。麻煩解答一下謝謝。