USB接口在周边的电子产品中非常普遍,其良好的统一性、广泛性等特点已成为电子产品的标配接口。所以越来越多的MCU上将其集成为外设便于产品应用开发。

下面我们来简单对比 2款常用的MCU产品自身USB资源差异:
(1) 中容量 STM32F103:
有1个USB全速设备接口。
具有USB设备功能,支持模拟各种USB全速设备;
硬件电路上:需要增加1.5K上拉电阻(UD+),推荐电路传输线路上串接22Ω电阻;
软件代码:提供了较好的USB库函数和框架,但是代码相比较大。

(2) 中容量 CH32F103:
有2个USB接口,一个为USB设备接口USBD,一个为USB主机和设备接口USBHD。
USBD,只有USB设备功能,支持模拟各种USB全速或者低速设备。
USBHD,具有设备和主机功能,设备功能下支持模拟各种USB全速或者低速设备,主机功能下支持操作各种USB设备。
硬件电路:内部接口做了阻抗匹配,外部无需任何电阻,芯片引脚直接连接通讯端子或信号线;
软件代码:USBD端口设计兼容STM32F103的USB,代码完全兼容。USBHD端口提供寄存器和函数库方式,相比代码结构简单,代码量小。

由此,可以看出CH32F103的USBD接口功能兼容了STM32F103的USB接口,而且额外还提供了一个USBHD接口。下面我将详细对USBD和USBHD接口使用进行对比。

概述

USBD:作为全速/低速的USB设备功能端口。硬件引脚位置和软件驱动上兼容同等容量的STM32F103芯片的USB设备全速设备接口。
USBHD:可以作为全速/低速的USB设备功能端口,也可以作为全速USB主机功能端口,支持操作Hub。使用沁恒电子传统的USB接口设计方法,与其其他USB产品保持软件一致性。

我们先了解几点关于USB的概念,这有助于了解USBD和USBHD各自设计应用的优缺点。
USB角色分为“设备”和“主机”,平时常见的PC就属于独立主机角色,而键盘、鼠标、U盘、打印机等就属于独立设备角色,而具有OTG功能的手机可以在主机和设备之间切换。我认为具有特定功能的基本上就是一个USB设备,而比较通用可以支持驱动安装的基本上就是一个USB主机(不绝对)。HUB比较特殊,我认为可以当成一个具有连接扩展功能的设备角色(分上游设备口和下游扩展口)
USB通讯就是在主机和设备两者之间发生的,主要分为4种传输类型:控制传输,中断传输,批量传输、等时传输。

  • 控制传输:必须支持,过程分为多个阶段。在应用中用作前期信息交换(枚举过程),一般还包括信息配置、功能切换、查询等。
  • 中断传输:可选,过程单一,数据传输具有周期性(速度固定),当数据量较小。在应用中一般做定时查询,常见的产品有键鼠、扫描枪、刷卡器之类通讯。
  • 批量传输:可选,过程单一,数据量大,速度可变(取决于当前带宽)。在应用中一般做批量数据传输,常见的产品有U盘、打印机、扫描仪之类通讯。
  • 等时传输:可选,过程单一,数据传输具有周期性(速度固定),数据量大于中断传输,正确率不保证。在应用中一般用作音视频方向,需要具备数据刷新率但可以允许有数据出错。

此外,USB2.0通讯之间,都是主机先发出请求,设备进行响应。即使设备要传输数据给主机,也需要主机发出上传包(IN)进行数据请求。任何数据的接收方都需给出应答包(等时传输除外)。还有一些总线状态、复位、挂起、唤醒信号时序等USB底层传输规范,有兴趣人的可以看相关的协议文档,这里不再细说。

控制器硬件设计对比

从我了解的USB接口控制设计上看,USBD控制器为应用场合设计考虑较多,例如设置了批量和同步传输可选择双缓冲和高优先级响应中断,用于保障数据传输速度;各种状态标志通知全面,不会因为用户层处理慢导致硬件传输问题。而USBHD控制器在设备功能上,采用简单易用的思路,给用户的控制位较少。无需区分传输和端点类别,用户只需关心上传还是下传即可,采用接口数据直通内存方式,减少数据拷贝工作,提升整体传输效率。

应用软件结构

使用CH32F103EVT中的USBD和USBHD例子。
(1)USBD示例中相关USB文件如下

上图左侧“USBLIB-src”中的6个文件中,包含了USB底层的数据传输函数及框架接结构,一般无需用户参与,由上层传递参数进行数据收发。

  • usb_core.c:控制传输下,各阶段处理(setup阶段,数据下传/上传阶段,状态阶段。
  • usb_init.c:低优先级中的处理(控制传输即其他)和高优先级中断处理(批量传输和同步传输)。
  • usb_int.c:USB模块初始化,USB设备信息结构表初始化。
  • usb_regs.c:封装了底层USB寄存器的各个控制位的控制。
  • usb_sil.c:端点通道上,上传和下传接口(包含收发数据和长度)。
  • usb_mem.c:512字节分组缓冲区和用户待收发SRAM数据之间的拷贝。

上图右侧“USBLIB-Cfg”中6个文件,包含了USB设备具体的信息结构,包括身份信息、支持的命令信息等。需要用户的按模拟的usb设备需求修改。

  • hw_config.c:usb功能启用、挂起(低功耗)、中断服务、端口等入口及状态。
  • usb_desc.c:usb设备描述符信息。
  • usb_endp.c:非0端点通道的数据处理回调函数。
  • usb_istr.c:usb中断标志通知各部分处理入口,回调进行底层事件处理。
  • usb_prop.c:设备本身结构属性赋初值:基本枚举信息,标准请求支持,类请求支持等。
  • usb_pwr.c:关于usb功耗几种状态处理函数:正常供电、断电、挂起(低功耗)、恢复(从挂起态)。

程序结构上多半采用函数指针方式,由用户配置在相应函数中配置好端点类别、支持的标准命令和类名请求、数据分析处理过程等,而底层usb传输框架中将配置内容在usb主机命令中完成数据收发。虽然USBD外设接口上的驱动写的较为复杂,不易于理解,但是使用上还是非常方便的。

(2)USBHD设备功能示例中相关USB文件
只有一个“ch32f10x_usb.c”,以及“Main.c”中的一个中断函数。代码非常简单,程序结构也很好理解。

  • USB_DeviceInit():初始化USBHD外设的设备功能,包含各个端点收发缓冲区、应答默认状态等。
  • USB_DevTransProcess():完整的USB设备和主机通讯传输命令解析及数据响应。

USBHD模块驱动没有像USBD模块驱动采用多层次的函数传递,而是一目了然的打通底层到上游,用户操作更加透明化,控制简洁。USBHD模块控制器皆可8位寻址访问,一次写操作即可完成数据的上传或下传工作,驱动效率比之USBD模块更高。

实际应用效果
下面针对2种实际应用实例,给出USBD和USBHD接口软件驱动效果。
测试条件:

  • 模拟CH372厂商设备:批量传输,使用厂家驱动。通过上位机测速软件,成功下传2M数据,统计下传速度;请求上传2M数据,统计上传速度。
  • 模拟CDC设备:批量传输,PC电脑自带驱动。通过PC端普通串口软件的文件传输功能,测试下传速度和上传速度。

从上表的测试结果分析:
资源上:USBD和USBHD的SRAM消耗差不多,主要用于存储传输数据以及本身设备的信息内容,属于功能必要需求。而Flash差异比较大,主要原因在于USBD接口软件驱动按照USB处理层次进行拆分,不但函数非常多,而且分类的文件也很多,带来的好处就是层次分明,修改独立。而USBHD接口软件驱动直接使用了相关寄存器读写,一步完成收发工作,结构简单,效率更高。
效率上:

  1. USBD和USBHD接口传输效率几乎差别不大,但是由于USBD接口通道数据在独立的512字节分组缓冲区,应用时需要执行用户SRAM到分组缓冲区的拷贝,所以效率会下降40%左右(SRAM拷入/拷出)。而USBHD设计上采用直接送入用户SRAM,所以没有此情况。
  2. 作为全速USB接口(12Mbps),USBD和USBHD都可以达到约9Mbps的传输效率,但是在实际的应用中,会存在数据拷贝、数据处理、短包传输等情况导致不能充分使用USB带宽。所以建议,第一,使用USBHD接口,如果数据已在SRAM中,通过修改端点的DAM地址来减少数据拷贝可直接传输,而USBD接口,可以在空闲时间提前将数据送入分组缓冲区。第二,采用双缓冲功能,将USB传输和数据准备时间进行复用(类似数据地址切换),第三,尽量使用满包来传输数据,这样可以提升USB带宽利用率。
  3. 厂商设备和CDC设备,都是批量传输应用(大数据传输),但是实测上下传速度上有很大差别,其主要原因在于测试软件上,厂家测试工具目标针对测试速度而不在数据内容,所以上位机工具中采用固定数据内容循环收发测试。而CDC使用普通串口工具传输文件,在下传环节需要一个线程去读取文件内容到缓存区内(类似数据拷贝),而增加了下传数据帧间隔,而上传通道接收数据,测试中没有开串口显示或者保存数据功能,所以上传速度比较接近厂家驱动上传测试。由此,我们也应该认识到,传输速度是和传输双方有关的,不仅仅要提升USB设备的处理响应能力,同时USB主机也需要有足够的速度来请求,毕竟在USB2.0中,所有的传输都是由USB主机发起的。
  4. 综合分析,在实际功能应用中,USBD和USBHD接口传输数据,如果使用批量传输通道,可以达到的速度范围在400KB/s~800KB/s,就看用户代码数据转移和优化了;而中断传输不会超过64KB/s;等时传输不超过400KB/s。

总结

CH32F103芯片的主频默认72MHz,在使用USBD和USBHD全速端口上,注意软件写法,两个端口传输效率相差不大,只是操作方法及现有软件驱动存在差异,选择哪个使用按自己的喜好和习惯即可。真正到了高速USB(480Mbps)及以上的接口时,其控制器的应用设计才能更加影响实际效率。
USBHD除了设备功能还具有USB主机功能,如果和USBD搭配起来一起使用,那么CH32F103芯片将可以实现双USB设备,一主机一设备功能应用。

其实,USB的传输过程从方向上看就是简单的上传和下传,我认为看成普通的串口收发都可以,只是它的发送是需要主机先来请求才可以发出。此外,就是对收发的数据进行解析按照情况传输不同的数据内容。在我看来USB区别于一般的传输接口,除了本身USB硬件设计(信号、编解码等)差异,在使用上主要感受还是附加的USB规范,所以在软件编写上,不能直接收发自定义数据,需要配合现有USB规范,来使用。USB作为一种通用接口,能这么广泛的使用,也得益于其统一的规范,大家都标准走,才能各司其职又能相互连通。

CH32F103与STM32F103在USB接口上的差异与使用相关推荐

  1. 计算机硬盘有usb借口吗,为什么移动硬盘不建议插在台式机前置USB接口上

    为什么移动硬盘不建议插在台式机前置USB接口上?移动硬盘不建议插在台式电脑前置的USB接口上,主要是因为前置USB接口供电不稳定,有可能会损坏移动硬盘. 在探讨这个问题前,我们先了解一下移动硬盘的工作 ...

  2. 为什么移动硬盘不建议插在台式机前置USB接口上?

    移动硬盘使用说明书第一页往往都写着:不能插在台式电脑前置的USB插口上,只能插在台式电脑后置的USB插口,否则移动硬盘将损毁.很多人都疑惑为什么不能将移动硬盘插在电脑前置USB接口,下面我就为大家进行 ...

  3. USB接口上各种小标签的含义

  4. 路由器上的usb接口有什么用_路由器的USB接口,非常强大的功能,教您轻轻松松玩转,太实用了...

    新一代出来的路由器后面基本上都会有一个或者是两个以上的有USB接口.居然还有很多人都不知道这些,要是比接口的用处.只是把它当做普通的无线路由器用.这样子太可惜了. 其实路由器后面的usb接口呀,它有非 ...

  5. 关于笔记本电脑上HDMI、VGA、USB接口的小知识, 另外别想着用笔记本当树莓派显示器了!

    HDMI: High Definition Multimedia Interface, 高清晰度多媒体接口,其可同时传送音频和影音信号,最高数据传输速度为5Gbps VGA: Video Graphi ...

  6. 基于FPGA的USB接口控制器设计(VHDL)(上)

    今天给大侠带来基于 FPGA 的 USB 接口控制器设计(VHDL),由于篇幅较长,分三篇.今天带来第一篇,上篇,USB 接口简介 以及 USB 体系结构.话不多说,上货. 之前有关于 Verilio ...

  7. LCUSB-13xB/M 系列高性能 USB 接口 CAN 卡在医疗体外诊断仪上的应用

    1,LCUSB -13xB/M 系列高性能 USB 接口 CAN 卡的功能介绍 LCUSB -13xB/M 系列高性能 USB 接口 CAN 卡,坚固 金属外壳,具有更佳 EMC 性能,插到用户设备 ...

  8. USB接口不能用了,提示一个接口上的电涌(收藏)

    这是供电问题,USB 设备为每个连接最多可以消耗 500 毫安 (mA) 的电流.如果某个设备试图消耗比这更多的电流,操作规范将调用相应的功能禁用该特定端口,直到系统电源关闭再打开为止(这叫" ...

  9. 路由器上的usb接口有什么用_USB接口上的小标签有啥用?从“+”号到闪电的奥秘...

    你有注意过自己PC,尤其是笔记本USB接口上面的小符号了吗?从"+"号到闪电,小狮子前几天移动硬盘接驳始终没反应的时候,各种切换完毕发现这似乎是一个平时很少注意的细节啊-- 从&q ...

  10. 路由器上的usb接口有什么用_路由器USB接口的用处居然这么多!现在知道还来得及...

    原标题:路由器USB接口的用处居然这么多!现在知道还来得及 最近,小智身边有个朋友买了一个新的路由器,他发现这个路由器带了一个USB接口,心中不禁疑惑起来,这个USB接口是用来干什么呢?今天小智就跟大 ...

最新文章

  1. Android 异常: failed to connect to localhost/127.0.0.1
  2. 凸包Graham Scan算法实现
  3. R语言应用实战-OLS模型算法原理及应用示例
  4. java 页面换行处理
  5. Linux的Nginx二:代理
  6. Golang二进制转换十进制代码
  7. Mac下Nginx、PHP、MySQL 和 PHP-fpm安装配置
  8. 鼠标手势识别 [Flash]
  9. Linux 2.6.39.1 Hello world 驱动总结
  10. 最近找到了一个免费的python教程,两周学会了python开发
  11. 创业负债累累 | 失败了的我还如何翻盘?是天台见! 我的故事还只是从这件事开始...
  12. CNode社区——React实现
  13. 如何画 软件工程 流程图
  14. linux选择填空题
  15. Thinkphp3.2.3安全开发须知
  16. 内网 centos7 离线安装rpm包的三种方法
  17. 微信公众号数据2019_数据丨2019年微信公众号文章数据报告!
  18. python多行显示_设置图例以多行显示(在python中) - python
  19. 面试 -- 操作系统与计算机网络
  20. 信号量Semaphore了解过吗?

热门文章

  1. Go语言安装与环境配置(基于Windows)
  2. calib matlab,toolbox_calib 这是matlab版本的摄像机标定工具箱,由斯坦福大学开发,具有很高的 精度,很好 238万源代码下载- www.pudn.com...
  3. c语言pow的作用,c语言中pow函数的用法是什么?
  4. 开发你的第一个BLE应用程序—Blinky
  5. script标签中的 defer 和 async 属性
  6. 万物皆可编码:聊聊1~10这十个数字
  7. 几个常用的后台管理系统
  8. python中flag=1什么意思_001_flag包详解
  9. Win10系统打开共享文件提示没有权限使用网络资源怎么处理
  10. 浅谈显著性检测!真的很浅