STM32
登录
直播中
吴湛
9年用户
947经验值
擅长:可编程逻辑
私信
关注
[问答]
请问STM32F105如何实现USB BULK传输?
开启该帖子的消息推送
STM32F105
请问
STM32
F105如何实现USB BULK传输?
回帖
(1)
高文利
2021-11-23 11:20:26
由于项目需要,需要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:u***d_desc.c 设备描述符的修改
配置如下
2.2:u***d_cdc.c 修改配置信息
USB的配置信息有很多包括配置描述符 接口描述符、端点描述符等等,但属于其配置信息, 其位于u***d_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:u***d_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(&hU***DeviceFS, CDC_IN_EP,USBD_RXBuffer2,USBD_RxCnt2);
函数定义在u***d_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端。
由于项目需要,需要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:u***d_desc.c 设备描述符的修改
配置如下
2.2:u***d_cdc.c 修改配置信息
USB的配置信息有很多包括配置描述符 接口描述符、端点描述符等等,但属于其配置信息, 其位于u***d_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:u***d_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(&hU***DeviceFS, CDC_IN_EP,USBD_RXBuffer2,USBD_RxCnt2);
函数定义在u***d_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端。
举报
更多回帖
rotate(-90deg);
回复
相关问答
STM32F105
请问
V2.0.3的库函数完全支持
STM32F105
吗?
2019-03-08
2673
求教
STM32F105
USB
模拟串口PA9与串口1复用问题
2015-11-19
8238
STM32F105
USBHostdemo
2017-06-08
5348
stm32f105
串口有规律乱码
2016-12-27
4027
请问
STM32F105
OTG驱动CH340T转串口如何配置CH340T?
2019-01-17
3297
STM32F105
怎么修改EP0最大长度?
2024-05-06
268
STM32F105
/107系列以太网PHY的设计资料分享
2021-10-28
1679
STM32F105
USART IAP问题
2017-04-17
3064
请问
如何在
STM32F
407的
USB
_MSC例程上
实现
USB
_OTG_FS与PC之间的
bulk
模式
传输
数据
2019-02-14
7045
如何对
STM32F105
/107时钟进行配置?
2021-12-02
700
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分