请技术帮助:关于CH32V30x USB2.0 HS 端点接收与发送数据包
else if( end_num == 2 )
        {
            if( rx_token == PID_IN )
            {

            }
            else if( rx_token == PID_OUT )
            {
                rx_len = USBHS->RX_LEN;
                for( i=0; iUEP2_CTRL &= 0xffff0000;
                USBHS->UEP2_CTRL |= rx_len; // IN -DATAx-ACK( len =rx_len )
            }
        }
        USBHS->STATUS = USBHS_ACT_FLAG;

在中端服务程序中,实例端口2, 接收到OUT数据包后,对接收到的数据取反,后发回给主机。有几个问题想请教。


  1. 设备向主机传回数据的发送启动指令是否就是 USBHS->UEP2_CTRL |= rx_len,向EP2控制寄存器写入发送长度就自动启动发送?

  2. 如果我暂时不想让EP2接收OUT 数据。如何禁止?

  3. 当前实例,EP2接收到OUT数据后,不做任何处理,不清 USBHS_ACT_FLAG标志,主机如果再次发送,会覆盖上次的数据吗?


您好,

关于问题1:

并不是向EP2控制寄存器写入发送长度就自动启动发送,在此处只配置端点2发送长度主要是由于在USB2.0高速设备端点初始化函数(USBHS_Device_Endp_Init)中已对端点2控制寄存器进行配置;

关于问题2:

如果不想让EP2接收OUT数据,需要在USBHS_Device_Endp_Init函数中将端点2 USBHS_EP_R_RES_ACK改成USBHS_EP_R_RES_NAK,具体如下图:

Snipaste_2021-11-11_16-50-17.jpg

关于问题3:

若不清USBHS_ACT_FLAG标志,主机再次发送会覆盖上次数据

补充说明:

UEP2_CTRL寄存器主要由以下三个寄存器组合而成:

Snipaste_2021-11-11_16-59-16.jpg


谢谢回复。

另有一个问题:PC上位机 WINUSB 发送OUT数据

使用: WinUsb_WritePipe(hWinusb, 0x01, pBuffer, DataLen, &length, NULL); //EP1 (OUT) 

发送长度是不限止的,可以是xMB. 发送时,WINUSB自动分成多个512字节的数据包。

下位机接收时,应如何应答及重组?(重组需要时间,如果重组完成前,第2个512字节开始发送,有没有可能产生数据错误 )

if( end_num == 2 )
        {
            if( rx_token == PID_IN )
            {
 
            }
            else if( rx_token == PID_OUT )
            {

                rx_len += USBHS->RX_LEN;


                    //1,此处是否该暂停接收


                    //2.比喻写入到U盘,时间比较长.

                      writetodisk(rxbuf,USBHS->RX_LEN)


                    //3.重新开始端点2接收数据

          

                if(rx_len==MyPkt_LEN)

                {

                    //接收全部数据完成

                }

                

             //   USBHS->UEP2_CTRL &= 0xffff0000;
             //   USBHS->UEP2_CTRL |= rx_len; // IN -DATAx-ACK( len =rx_len )
            }
        }
        USBHS->STATUS = USBHS_ACT_FLAG;



你好,可以做协议握手处理,收到主机下发数据并重组完成后,给应答信号,通知上位机可以下发下一包。依次类推,完成所有数据的发送。


试了好久,终于搞明白了,实例代码有个错误,反向回转数据到主机,实际USB设备没有启动发送。



 USBHS->UEP1_CTRL  = USBHS_EP_R_AUTOTOG | USBHS_EP_R_RES_ACK | USBHS_EP_R_TOG_0 | USBHS_EP_T_AUTOTOG | USBHS_EP_T_RES_ACK | USBHS_EP_T_TOG_0 | Len;


设置长度时直接敷值了一下,发送正常



只有登录才能回复,可以选择微信账号登录