STM32F105 实现USB BULK传输

时间:2024-04-10 21:04:09

基于STM32F105 实现USB-BULK传输

 

由于项目需要,需要USB来传输,之前试的HID模式是已经调通,HID基于中断传输,一毫秒侦测一次,每次的传输量为64字节,一般传输量小的可以采用这种模式,实时性也高,并且开发上位机也方便,不用自己再搞驱动什么的,但是满足不了我的需求,后面查资料开始采用bulk模式

 

 

  1. 基于CUBEMX配置USB工程

1.1:时钟

   我的芯片采用外部8M的晶振,超频到72M,配置USB时钟48M

STM32F105 实现USB BULK传输

 

1.2:USB配置

USB的模式选择device模式,作为从机。

STM32F105 实现USB BULK传输

 

 

然后选择Middleware-USB_DEVICE,选择模式为CDC。

USB2.0标准下定义了很多子类,有音频类,CDC类,HID,打印,大容量存储类,HUB,智能卡等等,USB CDC类的通信部分主要包含三部分:枚举过程、虚拟操作和数据通信。CDC具体研究的话,可以查看USB官网资料,以及ST关于CDC的介绍

STM32F105 实现USB BULK传输

 

 

  PID和VID是USB设备的唯一识别码,默认的CUBEMX生成的,插入电脑会显示ST Virtual Port,ST官网对应的也有相关的驱动。用户可以根据自己选择定义PID和VID,以及修改描述符,驱动的话自己开发。

   然后生成工程代码。

 

 

  1. 工程代码修改

 2.1:usbd_desc.c 设备描述符的修改

配置如下

        STM32F105 实现USB BULK传输

 

2.2:usbd_cdc.c 修改配置信息

   USB的配置信息有很多包括配置描述符 接口描述符、端点描述符等等,但属于其配置信息, 其位于usbd_cdc.c文件中,对应有三处

  1. USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ]
  2. USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ]
  3. USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ]

配置信息采用数组来存储。HS代表的是high speed高速USB的配置信息,FS代表full speed信息,然后还有other speed,我目前采用的是F105的芯片,支持full speed而不支持high speed。

STM32F105 实现USB BULK传输

 

如果怕出什么问题,可以将三个配置信息默认配置一样。

数组的长度对应做下修改

USB_CDC_CONFIG_DESC_SIZ  长度为32

#define USB_CDC_CONFIG_DESC_SIZ                     32U

2.3:usbd_cdc.c USB初始化以及发送和接收

2.3.1 USB初始换函数

  1. CDC_IN_EP  对应的发送数据的端点

         0x81U  /* EP1 for data IN */

  1. CDC_OUT_EP 对应接收数据的端点

         0x01U  /* EP1 for data OUT */

  1. CDC_CMD_EP  对应的CDC 命令端点

          0x82U   /* EP2 for CDC commands */枚举工程中会用到

        STM32F105 实现USB BULK传输

 

 

      1. USB发送函数

                        USBD_LL_Transmit(&hUsbDeviceFS, CDC_IN_EP,USBD_RXBuffer2,USBD_RxCnt2);

                         函数定义在usbd_conf.c文件中。

                        STM32F105 实现USB BULK传输

      1. USB接收函数

      接收函数的话会在中断里面调用。

    STM32F105 实现USB BULK传输

网上看到好多使用双缓冲用来接收的用来提高速度。

定义两个数组用来接收

uint8_t USBD_RXBuffer1[CDC_DATA_FS_MAX_PACKET_SIZE];

uint8_t USBD_RXBuffer2[CDC_DATA_FS_MAX_PACKET_SIZE];

uint8_t  BufFlag = 0x01;        //用于判断两个缓冲区是否有数据

 

具体速度有没有提高,没怎么试过

2.4:MAIN函数

  Main函数主要实现的就是,接收PC端发送的数据,然后同样的数据在发送的PC端。

        STM32F105 实现USB BULK传输