1.USB分类

 根据物理形态可以分为 USB-A、USB-B、USB-C 等;

   

       根据不同的传输协议可以分为 USB 1.x、USB 2.0、USB 3.x 等,最主要的区别就是传输速度不同。

2.USB介绍

USB2.0是半双工传输,总线上的信号可以理解为:主机发送请求->设备回应请求;

STM32F103 系列芯片都自带了 USB,不过 STM32F103 的 USB 都只能用来做设备,而不能用作主机。

STM32F103 的 MCU 自带 USB 从控制器,符合 USB 规范的通信连接; PC 主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被 USB 外设直接访问。这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用 512 字节缓冲区(专用的 512 字节,和 CAN 共用),最多可用于 16 个单向或 8 个双向端点。 USB 模块同 PC 主机通信,根据 USB 规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括 CRC 的生成和校验。

每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和需要传输的字节数。当 USB 模块识别出一个有效的功能/端点的令牌分组时, (如果需要传输数据并且端点已配置)随之发生相关的数据传输。 USB 模块通过一个内部的 16 位寄存器实现端口与专用缓冲区的数据交换。在所有的数据传输完成后,如果需要,则根据传输的方向,发送或接收适当的握手分组。在数据传输结束时, USB 模块将触发与端点相关的中断,通过读状态寄存器和/或者利用不同的中断来处理。

 3.USBAPI接口

1. 缓存数组

//USB接收缓存数组
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
//USB发送缓存数组
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];

2. CDC初始化中设置缓存数组

static int8_t CDC_Init_FS(void)
{
  /* USER CODE BEGIN 3 */
  /* Set Application Buffers */

  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);

  return (USBD_OK);
  /* USER CODE END 3 */
}

3.CDC接收回调函数

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */

  //处理好数据后,准备下次接收
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
  /* USER CODE END 6 */
}

当 CDC_Receive_FS被调用时,数据​​已经存在于 UserRxBufferFS中​​(即已被填充) ,函数static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)里的Buf参数指向UserRxBufferFS。

4.CDC发送函数 

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
  if (hcdc->TxState != 0){
    return USBD_BUSY;
  }

  //设置发送缓存数组
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
  //发送数据
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
  /* USER CODE END 7 */
  return result;
}

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐