首页 > 其他分享 >[单片机][at32][填坑日记] [USB卡包] usb上电过程中快速发包导致卡包(终章)

[单片机][at32][填坑日记] [USB卡包] usb上电过程中快速发包导致卡包(终章)

时间:2022-10-31 18:04:43浏览次数:58  
标签:卡包 USB get send 发包 biz data usb


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

原因造成如下:

  1. 串口外设优先级大于USB中断(USBOTG_IRQn),导致串口数据打断USB,致使PC或MCU丢包。
  2. [单片机][at32][填坑日记] [USB卡包] usb上电过程中快速发包导致卡包(终章)_嵌入式硬件


  3. [单片机][at32][填坑日记] [USB卡包] usb上电过程中快速发包导致卡包(终章)_USB_02

  4. 当PC请求usb设备描述符字符串时,USB的其他通道不能发送数据,不然会导致通道0数据异常,导致PC丢包。
  5. [单片机][at32][填坑日记] [USB卡包] usb上电过程中快速发包导致卡包(终章)_嵌入式硬件_03

  6. 系统只会请求字符串0-2,所以在此设置标志位即可。
  7. 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;
}


标签:卡包,USB,get,send,发包,biz,data,usb
From: https://blog.51cto.com/xuejianqiang/5810723

相关文章