usb

再谈USB CDC 实现USB bulk传输

    之前虽然弄过一次CDC实现USB bulk的传输也写成了文档在本网站中但当时弄的比较急且由于之后没有使用过USB开发项目所以就搁置,鉴于今天老板不再刚好boss直聘上有boss要求我去面试usb开发,一想就慌啊我对usb开发不懂所以鉴于此把之前弄的这个再弄下,一是之前MDK配色致使好多人说那个看不清,二是鉴于这次弄下自己突击看看USB的各种描述符之意思免得被面试官问的发懵。附件已经上传了相关源代码。


CDC_Bulk.rar


ST提供的USB开发的库,其实底层的开发不需要我们动手来写了,我们一般只需操作修改下他的描述符列表就能实现我们的功能,此实例采用cubeMX配置生成的CDC工程进行相关修改,至于工程生成这一块本处不再叙述

image.png

重点说下VID和PID就是相当于你这个USB设备的唯一识别码,USB驱动就是动过它来识别加载的,理论上你需要向联盟申请,但这里嘛做实验随便修改修改啦没问题

其实从CDC历程里面实现usb 的bulk传输只需要修改器设备描述符和配置描述符即可

USB的描述符详情可以见  https://blog.csdn.net/qq_16777 ... 22030

首先看设备描述符

image.png

针对代码来说其在usbd_des.c中的数组__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] 中

我们结合上面的设备描述符做以下修改

image.png

修改后面的备注结合上面的设备描述符来看,至于设备描述符,子描述符还有就是协议描述位置上为什么设置为0XFF 看设备描述符中介绍这些位如果是0xFF的话就有厂商自行指定其类型啊那些之类的,由于我们正需要一个USB bulk数据传输而不是一个一直定义好的HID Message设备啥的所以我们设置成0xff表示是自定义设备的即可,常见的已定以的设备类型如下,PC机就是通过设备类型来判定这是个啥的,比如键盘鼠标啥的就是HID,你把设备描述符中对应位置修改为0x03,那么上位机就说小子你是个HID设备(哈哈)

image.png

2、完成设备描述符的修改后,接下来需要修改配置信息,起始USB的配置信息有很多包括配置描述符 接口描述符、端点描述符等等,但属于其配置信息,故此ST将其全部放在数组中, 其位于usbd_cdc.c中其中有3处分别是USBD_CDC_CfgFSDesc 、USBD_CDC_CfgHSDesc、USBD_CDC_OtherSpeedCfgDesc数组中,分别对应不同USB操作速率下的配置,我们将3出修改成一样的,哈哈偷懒就是说我一锤子敲定你所有速率下的配置就是这么的傲娇,配置描述符的组成如下 我们按照这个对应的修改即可

image.png

配置描述符段修改成如下,由于我们只让他作为一个单独设备而不是负荷设备所以其支持的接口这些为1即可

image.png


已经修改了配置描述符了,接下来修改接口描述符,因为配置描述符中说我支持一个接口描述嘛,那么将接来下修改接口描述符
image.png

按照其格式将接口描述符修段修改为如下:

image.png

接口描述符中描述两个端点,我们使用的所以接下来就是修改端点描述符段

image.png

按照其格式就该端点描述符段

image.png

将数组类非上面描述的信息全部删掉,因为对我们来说以上的描述符就够了,然后可以得出数组类的描述信息一共有32个字节,故此将数据的大小更改为32

通过修改宏实现 #define USB_CDC_CONFIG_DESC_SIZ                     32

然后将另外两个数组的信息修改成和上面一样即可 至此自定义bulk传输设备就修改好,接下来就是数据之间的交互问题了


整个USB设备的大致相当于一个小子混社会加载过程是这样的:设备上电->PC机检测到D+上有电压说呵呵这儿有个USB设备(低速的是D-)->然后PC机说小子让我看看你有几斤几两啊(获取设备描述符)->USB设备怂啊,只能说大哥别杀我这是我的身份证(汇报设备描述符)->然后PC机就查看USB的身份证看看是那个门派的(HID 门派 ,CDC门派的等等) ->PC机说你小子有没有藏私啊->USB设备也是怂一吓全交代了->先是被找出了配置描述符这个点这可不得了里面一看还有接口描述符->接口描述符里面还有端点描述符啊)最后都搜光了->PC机说你不是我亲戚你得交保护费(要驱动)然后才能收到大哥的照顾->然后USB设备打电话让程序员亲戚筹齐了保护费->从此一个受到大哥保护的人,节操就再也没有。大哥要啥就得给啥了(通信)。


在本.c的最前面定义如下变量缓冲区        采用双缓冲区的好处可以形成乒乓操作这里只操作接受,这样可以提高数据的接受速度,应该我们接受到了数据需要时间处理如果使用单缓冲的话,在接受到数据后就得关闭端点否则数据会出现覆盖之类的问题,双缓冲则可以有效的避免这些问题,当然也可以使用缓冲缓冲的方式来实现并且节约空间血本处采用双缓冲的方式实现。

//定义数据双缓冲

image.png

修改CDC初始化函数如下

image.png

然后修改USBD_CDC_DataOut函数如下:

image.png

然后将main.c中的做如下修改

image.png

至此一个基于USB CDC实现usb bulk传输已经实现完毕

编译烧写代码后重新插入USB设备后观察PC端的设备管理器如下

image.png

出现如图所示是由于驱动没有,然后使用NI_VISA USB驱动制作好驱动后再次插入设备如下

image.png

以下进行数据回传测试,使用NI_

image.png

image.png

从上图中可知数据交换正常,双缓冲也已经起作用了,至此测试完成了


已邀请:

嗜洫

赞同来自:

admin

赞同来自:

阿里嘎多

温特

赞同来自:

用Benchmark测试 总是说  31:连到系统上的设备没有发挥作用,请指点一下大概问题在哪里 ?谢谢!!

liuzq

赞同来自: huxiao8360

楼主,设备描述符,配置描述符,接口描述符  都按你讲的配置时,用ni-visa driver wizard无法生成驱动程序,什么原因帮忙解决下呗?谢了image.png

zsh910j

赞同来自:

楼主好 最近在移植USB bulk 协议,参考了您的帖子,但是按步骤下来,计算机无法识别到硬件(插拔USB无反应),想请教楼主是不是CubeMX配置好了,还没有修改软件时直接烧录后,计算机设备管理器就能识别出一个USB设备?芯片用的是STM32F103VET6,和RCT6的移植区别除了CubeMX上面芯片的选型,还有没有别的地方的不同,望楼主不吝赐教,由衷感激!

zsh910j

赞同来自:

可以了,还是要谢谢楼主!

Variety ゞ

赞同来自:

你好,请问一下,我在最后回环验证的时候,报错超时,是因为我单片机程序这边回环有问题,还是ni_visa生成的驱动有问题呀?板子f407,原子的探索者,代码根据你得这个教程修改的

要回复问题请先登录注册