CH32V203C8T6使用SimulateCDC例程代码的一些问题

目前项目需求:实现CAN转串口(双向),串口使用USB模拟

所以使用SimulateCDC为基础进行修改,目前USB发送没有问题

问题:USB接收函数没找到

我依据USBD_ENDPx_DataUp函数,自己模仿着写了一个USBD_ENDTx_DataUp,代码如下

uint8_t USBD_ENDTx_DataUp( uint8_t endp, uint8_t *pbuf )
{
    if( endp == ENDP2 )
    {
        if (USBD_Endp2_Busy)
        {
            return USB_ERROR;
        }
        USB_SIL_Read( EP2_OUT, pbuf );
        USBD_Endp2_Busy = 1;
        SetEPRxStatus( ENDP2, EP_RX_VALID  );
    }
    else
    {
        return USB_ERROR;
    }
    return USB_SUCCESS;
}

测试不成功

我使用代码中自带的EP2_OUT_Callback函数,感觉像是USB接收函数,但任然没有效果,下图为我放在main.c的测试代码


image.png

望解决!!!

您好,USB接收函数为EP2_OUT_Callback,通过len = GetEPRxCount( EP2_OUT & 0x7F );获取接收数据的长度,通过PMAToUserBufferCopy( &UART1_Tx_Buf[ ( Uart.Tx_LoadNum * DEF_USB_FS_PACK_LEN ) ], GetEPRxAddr( EP2_OUT & 0x7F ), len );将接收缓冲区的数据拷贝到UART1_Tx_Buf中。image.png


使用EP2_OUT_Callback 函数 进行测试

测试结果:UART1_Tx_Buf里面没有数据,并且使用串口上位机发送给USB数据后,发送一次之后就直接卡死,发送不了了,拔下USB在插上,USB直接识别不了,系统弹出“无法识别的USB设备”,只能复位才能重新识别。

是因为我使用方式不对吗?下图为我的测试代码

image.png

while(1)里面只有这个截图里面的代码,其他的全部注释掉了,这个现象你们应该很好测试,感觉是UART1_Tx_Buf根本没有接收到数据,难道需要把DMA给关掉嘛


您好,首先测试EVT中的CDC例程需要将printf改为串口2否则测试收发时会出现卡死的情况原因是printf初始化与CDC串口初始化存在冲突,修改方式如图:

image.png

image.png

其次接收USB的数据时EP2_OUT_Callbac();为回调函数USB在收到数据后库会自动调用该函数,不需要在主函数中手动调用,如果想监控收到的数据,可在该函数中设置相应标志位,主函数检测标志位后打印接收到的数据。程序如下仅供参考。

icon_rar.gifV203_CDC.zip

image.png

image.png

测试结果如下:

image.pngimage.png


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