基于STM32F105 实现USB-BULK传输
由于项目需要,需要USB来传输,之前试的HID模式是已经调通,HID基于中断传输,一毫秒侦测一次,每次的传输量为64字节,一般传输量小的可以采用这种模式,实时性也高,并且开发上位机也方便,不用自己再搞驱动什么的,但是满足不了我的需求,后面查资料开始采用bulk模式
- 基于CUBEMX配置USB工程
1.1:时钟
我的芯片采用外部8M的晶振,超频到72M,配置USB时钟48M
1.2:USB配置
USB的模式选择device模式,作为从机。
然后选择Middleware-USB_DEVICE,选择模式为CDC。
USB2.0标准下定义了很多子类,有音频类,CDC类,HID,打印,大容量存储类,HUB,智能卡等等,USB CDC类的通信部分主要包含三部分:枚举过程、虚拟操作和数据通信。CDC具体研究的话,可以查看USB官网资料,以及ST关于CDC的介绍
PID和VID是USB设备的唯一识别码,默认的CUBEMX生成的,插入电脑会显示ST Virtual Port,ST官网对应的也有相关的驱动。用户可以根据自己选择定义PID和VID,以及修改描述符,驱动的话自己开发。
然后生成工程代码。
- 工程代码修改
2.1:usbd_desc.c 设备描述符的修改
配置如下
2.2:usbd_cdc.c 修改配置信息
USB的配置信息有很多包括配置描述符 接口描述符、端点描述符等等,但属于其配置信息, 其位于usbd_cdc.c文件中,对应有三处
- USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ]
- USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ]
- USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ]
配置信息采用数组来存储。HS代表的是high speed高速USB的配置信息,FS代表full speed信息,然后还有other speed,我目前采用的是F105的芯片,支持full speed而不支持high speed。
如果怕出什么问题,可以将三个配置信息默认配置一样。
数组的长度对应做下修改
USB_CDC_CONFIG_DESC_SIZ 长度为32
#define USB_CDC_CONFIG_DESC_SIZ 32U
2.3:usbd_cdc.c USB初始化以及发送和接收
2.3.1 USB初始换函数
- CDC_IN_EP 对应的发送数据的端点
0x81U /* EP1 for data IN */
- CDC_OUT_EP 对应接收数据的端点
0x01U /* EP1 for data OUT */
- CDC_CMD_EP 对应的CDC 命令端点
0x82U /* EP2 for CDC commands */枚举工程中会用到
-
-
- USB发送函数
-
USBD_LL_Transmit(&hUsbDeviceFS, CDC_IN_EP,USBD_RXBuffer2,USBD_RxCnt2);
函数定义在usbd_conf.c文件中。
-
-
- USB接收函数
-
接收函数的话会在中断里面调用。
网上看到好多使用双缓冲用来接收的用来提高速度。
定义两个数组用来接收
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端。