您好,
我在使用CH32V307 提供的例程学习使用这个高速usb的外设。在使用例程时我碰到了几个问题。
1)在端点初始化 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;
这里是不是应该吧TX_LEN设为0,并且用将TX设为NAK呢?初始化时并没有数据才对?
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应该为UEP2_RX_CTRL吧,这是单纯打错了吧。抓个小虫
3)我试着把这个例程里EP1,EP2的TX全部设为NAK,并且把原本把EP1 RX 数据转到TX数据的代码注释掉后,发现我如果从主机请求数据,每两次中一次是
timeout(正确的),但是另一次会返回空字符或者不定的字符。请问这是什么原因?在端点终端过后硬件会把之前设置的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或者这个芯片理解不够。麻烦解答一下谢谢。