打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

现象:pc重启过程中,不断发送按键数据,导致pc未能应答,致使下位机数据出现卡包现象。
MCU发送’B’,PC显示’C’,MCU发送’E’,PC显示’B’

原因造成如下:

  1. 串口外设优先级大于USB中断(USBOTG_IRQn),导致串口数据打断USB,致使PC或MCU丢包。
    在这里插入图片描述
    在这里插入图片描述

  2. 当PC请求usb设备描述符字符串时,USB的其他通道不能发送数据,不然会导致通道0数据异常,导致PC丢包。
    在这里插入图片描述
    系统只会请求字符串0-2,所以在此设置标志位即可。

  3. USB整个发送逻辑

    // 此处解决PC开机过程中usb数据卡包问题。因为当pc请求字符串时,其他通道的数据发送会导致异常。
    if (get_usb_string_bus)
    {
        get_usb_string_bus = false;
        biz_usb_queue_init();
#if BS_BLE_SUPPORT
        biz_ble_queue_init();
#endif
        g_key_trigger_flag = false;
        g_combined_key_val = 0;
        g_usb_send_delay_tick = 0;
        LOG_D("<DEBUG> [USB] get_usb_string_bus\r\n");
        return;
    }
    // 按键数据发送
    if (g_key_trigger_flag)
    {
        g_free_tick = 0;
        g_key_trigger_flag = false;
        biz_prot_hwic_usb_send_key_data(g_combined_key_val);
        sys_time_reset();
    }
    if (g_usb_send_delay_tick % 1400 == 0 && g_usb_send_delay_tick != 0)
    {
        if (get_usb_device_status())
        {
            // 发送USB信息(将USB消息队列的内容,依次发送)
            if (biz_usb_data_dispose())
            {
                LOG_D("<DEBUG> [USB] send ok!!!\r\n");
                g_free_tick = 0;
                return;
            }
        }
    }
    g_free_tick++;
    if (g_free_tick % 10000 == 0 &&  g_free_tick != 0)
    {
        // 判断usb fifo是否卡包
        get_usb_fifo_state();
    }
/**
 * @brief  usb发送数据给usb自定义通道(消息入队,非实时发送)
 * @param  *data: 欲发送内容
 * @param  len: 内容长度(字节大小)
 */
void biz_usb_send_data(uint8_t *data, uint16_t len)
{
    if (get_usb_string_bus)
    {
        LOG_D("<DEBUG> [biz_usb_send_data] queue bus fail\r\n");
    }
    if (!queue_en(&m_usb_recv_q, data, len))
    {
        LOG_D("<DEBUG> [biz_usb_send_data] queue full fail\r\n");
    }
}
/**
 * @brief  处理消息队列中的消息,通过usb发送(放在空闲线程使用)
 */
bool biz_usb_data_dispose(void)
{
    if(!get_usb_device_is_free())
    {
        LOG_D("<DEBUG> [USB] send Fail not free\r\n");
        get_usb_fifo_state();
        biz_usb_queue_init();
        return false;
    }
    if(get_usb_tx_flag())
    {
        LOG_D("<DEBUG> [USB] send Fail send flag\r\n");
        return false;
    }
    if (!queue_de(&m_usb_drive_recv_q, g_usb_recv_data))
    {
        if (!queue_de(&m_usb_recv_q, g_usb_recv_data))
        {
            return false;
        }
    }
    if (usb_send(g_usb_recv_data, USB_RECV_Q_ITEM_SIZE) == false)
    {
        LOG_D("<DEBUG> [USB] send Fail BUS\r\n");
        biz_usb_send_data(g_usb_recv_data, USB_RECV_Q_ITEM_SIZE);
        return false;
    }
    return true;
}
posted on 2022-08-13 11:00  xuejianqiang  阅读(56)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033