ESP32S3 USB CDC TinyUsb TX卡死

HuangFeng
Posts: 1
Joined: Sat Feb 24, 2024 7:08 am

ESP32S3 USB CDC TinyUsb TX卡死

Postby HuangFeng » Mon Feb 26, 2024 10:30 am

问题描述:
我使用tinyusb_cdcacm_write_queue()函数发送数据,每150ms调用一次,每次发送10256个数据。
一开始能正常发送,大概5分钟之后,tinyusb_cdcacm_write_queue()无法再发送数据,一直返回0。但电脑端发送过来的数据还能正常接收。跳转进入函数内部,发现const uint32_t size_available = tud_cdc_n_write_available(itf);//Get remaining space in FIFO.(获取FIFO中的剩余空间。)
的结果一直为0。

我尝试在tinyusb_cdcacm_write_queue()后增加 tinyusb_cdcacm_write_flush(acm_cfg.cdc_port, 0); 这句代码也没用
尝试使用tud_cdc_n_write_clear()函数清空FIFO内存再发送,也无法解决问题。

发送函数的代码如下:

Code: Select all

void usb_usart_write(uint8_t* buf, size_t size)
{
        TickType_t t = xTaskGetTickCount();//单位10ms
        /* write back */
        for (size_t i = 0; i < size;) {
            size_t sendbytes = size - i;
            if (sendbytes > 64)
                sendbytes = 64;

            size_t wbytes = tinyusb_cdcacm_write_queue(acm_cfg.cdc_port, buf + i, sendbytes);
            tinyusb_cdcacm_write_flush(acm_cfg.cdc_port, 0);

            if (wbytes == 0) {
                TickType_t def = xTaskGetTickCount() - t;
                if (def > 1) // 超时退出
                { 
                    ESP_LOGW(TAG, "usb_usart_write-> def:%ld break", def);
                    break;     
                }
            } else {
                t = xTaskGetTickCount();
                i += wbytes;
            }
        }            
}
请问这个问题可能的原因是什么?我该从哪里进行排查和解决?或者怎么才能在不重启的情况下,让TX功能恢复过来?

Who is online

Users browsing this forum: No registered users and 202 guests