GD32 CDC_ACM分包发送超过64Bytes数据

[复制链接]
1395|0
 楼主| gaonaiweng 发表于 2023-5-27 13:02 | 显示全部楼层 |阅读模式
AC, ACM, CD, TE, dc
Demo

移植GD32官方的USB CDC_ACM例程:

GD32F4xx_Firmware_Library_V1.4\GD32F4xx_Firmware_Library_V1.4\Project\USB\GD32F450i\USB_Device\CDC_ACM
数据传输

官方的例程只是简单的的将接收到的数据直接发出去,数据量比较少,但是由于现在我需要传输图片数据,一帧大概有4K,而例程里说了包数据最大为64B,那就要将数据分包发出去。

**注意:**这个64B实际上是包括了1ByteACK包的,所以如果按正常流程发的话,就是每次只能发63B。但是有些强迫症的人怎能忍,按照一些论坛的说法就是发完64B包后,再发一个长度为0B的包,我试过是可以的,但是为什么我的代码不是这样的呢,因为我没有强迫症。

  1. //此处发送用的是EP1,所以endp_num = 1
  2. void ClearTxFiFO(void)
  3. {
  4.     uint8_t endp_num = 1;
  5.    
  6.     usb_txfifo_flush(&usbhs_core_dev, endp_num);
  7.    
  8.     /* disable the fifo empty interrupt for the endpoint */
  9.     USB_DIEPFEINTEN &= ~(0x1U << endp_num);

  10.     USB_DIEPxINTF((uint16_t)endp_num) = DIEPINTF_TF;

  11.     /* data transmittion is completed */
  12.     usbd_in_transaction(&usbhs_core_dev, endp_num);

  13. }

  14. //发送用的是端点1
  15. #define USBTXTIMEOUTMAX (300000U)
  16. void USBSendData(uint32_t *pauSendBuf, uint32_t uSendSize)
  17. {
  18.     volatile int ii;
  19.     uint32_t uTimeout = 0;
  20.     static uint8_t uFlag = 0;
  21.    
  22.     // USB最大只能发 CDC_ACM_DATA_PACKET_SIZE-1 个字节数据,如果想发CDC_ACM_DATA_PACKET_SIZE的整数倍
  23.     // 那么就要在发完一个 CDC_ACM_DATA_PACKET_SIZE 大小的包后再发一个空包。
  24.     if (uSendSize < CDC_ACM_DATA_PACKET_SIZE)
  25.     {
  26.         uTimeout = 0;
  27.         //设置等待超时,超时则清空FIFO,置位标志位。
  28.         while(1 != packet_sent)
  29.         {
  30.             if (++uTimeout > USBTXTIMEOUTMAX)
  31.             {
  32.                 ClearTxFiFO();
  33.                 return;
  34.             }
  35.         }
  36.         usbd_ep_tx(&usbhs_core_dev, CDC_ACM_DATA_IN_EP, (uint8_t*)(pauSendBuf), uSendSize);
  37.         packet_sent = 0;
  38.         
  39.     }
  40.     else
  41.     {
  42.         uint16_t uCount  = uSendSize / (CDC_ACM_DATA_PACKET_SIZE - 1);
  43.         uint16_t uRemain = uSendSize % (CDC_ACM_DATA_PACKET_SIZE - 1);

  44.         //先发整数倍部分
  45.         for(ii=0; ii<uCount; ii++)
  46.         {
  47.             uTimeout = 0;
  48.             while(1 != packet_sent)
  49.             {
  50.                 if (++uTimeout > USBTXTIMEOUTMAX)
  51.                 {
  52.                     ClearTxFiFO();
  53.                     return;
  54.                 }
  55.             }
  56.             
  57.             usbd_ep_tx(&usbhs_core_dev, CDC_ACM_DATA_IN_EP, \
  58.                         ((uint8_t*)(pauSendBuf)+ii*(CDC_ACM_DATA_PACKET_SIZE - 1)), CDC_ACM_DATA_PACKET_SIZE - 1 );

  59.             packet_sent = 0;

  60.         }

  61.         //再发Remain部分
  62.         uTimeout = 0;
  63.         while(1 != packet_sent)
  64.         {
  65.             if (++uTimeout > USBTXTIMEOUTMAX)
  66.             {
  67.                 ClearTxFiFO();
  68.                 return;
  69.             }
  70.         }

  71.         usbd_ep_tx(&usbhs_core_dev, CDC_ACM_DATA_IN_EP, \
  72.                     ((uint8_t*)(pauSendBuf)+ii*(CDC_ACM_DATA_PACKET_SIZE-1)), uRemain);
  73.         packet_sent = 0;
  74.         
  75.     }
  76.    
  77. }




————————————————
版权声明:本文为CSDN博主「Chet、」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37846927/article/details/106033208
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

875

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部