可以使用USB2.0接口进行全双工通讯么,双方都可以主动发送么?

USB 2.0协议要求设备必须一个是Host另一个是Device,所有的请求都必须由Host发起,Device自己决定是否要给予正确的回应。有一个特例就是OTG,理论上USB-OTG是允许Host和Device互相切换的,但驱动特别复杂,也没有明确的设备可以在连接的状态下动态切换。

所以你如果两块ARM芯片用USB通信,就必须要一个做Host,另一个做Device,Host负责供电和发起请求。Device不可以主动发起请求。不要被协议规范的字眼迷惑,Interrupt传输也是由Host发起的,不是Device发起的。

如果为了简单起见,建议用串口,RS232既简单由好用。一个简易的USB协议栈也要几十K的binary code,折合代码也得上千行了。

------------------------补充------------------------
USB2.0是半双工传输,总线上的信号可以理解为:主机发送请求->设备回应请求,这种模型。

USB2.0 EHCI控制器需要设置一堆控制器,需要设置伴侣芯片(1.1控制器)或者embinedTT(大概叫这个名字),要设置传输队列,USB协议栈不适合简单通信模型,USB驱动部分比网卡驱动复杂很多倍,虽然网络协议栈很大,但网卡驱动很简单,一个C源文件,几百行就可以搞定,但一个USB控制器驱动需要几个C源文件,上千行代码。

---------------------再次补充---------------------
不建议用USB协议栈的原因是:

1、传输距离短,USB协议规范是5米,5米的话RS232也是满足的,相比以太网100米来说5米简直太短了。

2、带宽一般,虽然2.0号称是480Mbps,实际能利用的带宽大概只有80%左右,并且还要进行封装,如果换成千兆以太网,性能会好很多。

3、协议栈太复杂,相关文档很难找到。对比而言网络控制器的开发就简单多了。

关于开发协议栈,我多说点:

USB开发分为3部分:控制器开发、协议栈开发、驱动开发。其中最难的部分是控制器开发,USB2.0是传输协议规范,并不是控制器技术规范。而控制器本身又需要大量代码,以EHCI控制器为例,仅仅这个驱动,写出来就够难受的了,无数的寄存器,还要在内存里建立复杂的数据结构才能完成传输。而激活了控制器是不够的,你需要在控制器驱动之上编写支持USB2.0规范的协议栈代码,包括URB支持、USBD支持、各种描述符的解析等等,这些比网络协议栈复杂多了。并且网络协议栈的RFC很好找,中文的也很好找,但USB的中文规范翻译的都不太好。

当你搞定了EHCI和USB2.0传输,那么你还要在你的协议栈之上增加设备驱动,这个驱动就简单多了,但要根据你的传输模型来设计,比设计一个TCP传输模型要复杂多了。

以上工作全完成,需要几万行代码,编译完成以后需要200K-1M左右的内存来运行。

然后,一切都完成了吗?不,你只完成了一半。

USB同网络协议栈的区别就是分host协议栈和device协议栈,二者是完全不同的,因为你是要互连,所以另外一个板子上就要开发device协议栈,device协议栈相对比较轻量级,但同样需要开发成本,一个标准的device协议栈需要50K-200K的运行内存,开发代码应该不少于一万行。

然后,你两个板子就可以互连通信了。

你以为这样就完事了?还没完。

支持device协议栈的板子很少,USB控制器不是对等的,两个EHCI控制器无法互连,而支持device协议栈的设备都不是标准的EHCI控制器,多数情况下这些板子就根本不带有EHCI控制器,这种板子开发USB2.0会更难,因为你根本找不到开发手册,比如一般的MHCI或者SHCI控制器,只有很少很少的资料。而且我就没见过中文的USB Device Stack规范。

那么你想想你的开发成本吧,先要学习标准的USB2.0规范,搞清楚EHCI是怎么回事,然后去研究一些偏门的设备,研究MHCI/SHCI是怎么回事,再在上面分别实现USB Host Stack和Device Stack,之后还要在这之上设计不同的两个通讯用的驱动,需要1M的运行内存,几万行代码,你觉得这样的开发成本可以接受吗?

为什么我建议用网络或者RS232,因为这是对等的协议,两个设备的驱动开发完全一致,区别只是上层的部分的一点点内容,并且资料很多,很容易找到可以移植的代码。

----------------------------------------------------
USB各种规范的规模(全英文):
《Universal Serial Bus Specification Revision 2.0》- USB2.0协议规范,650页
《Enhanced Host Controller Interface Specification for Universal Serial Bus》 - EHCI规范,155页
《Universal Host Controller Interface (UHCI) Design Guide》 - USB UHCI(1.1)规范,47页
《On-The-Go Supplement to the USB 2.0 Specification》 - OTG规范,53页

还有若干class device规范我就不列出来了,MHCI的规范我没有找到,应该也不会太少,相比网络协议栈的RFC,这方面的中文资料实在是太少了。

(0)

相关推荐

  • 首款USB4产品预计明年四月发布

    据外媒报道,Linux 5.6 将正式支持 USB4,预计在2020年4月发布,另外,工程师还提供了 22 个 USB4 补丁,用以对Linux 5.6 kernel 的最初支持同时包括主机和设备支持 ...

  • 简要介绍USB2.0、USB3.0、USB3.1、Type-C接口含义与区别

    电子汇 20篇原创内容公众号不管是做产品还是买产品,USB接口繁杂多样,对于各位菜鸟和老鸟如何来区分呢?外观能看出来一样,实际上最终本质不仅仅有外观,还有内在的协议.这篇文章我们先看看表象的一些内容. ...

  • DP2.0接口即将正式登场

    HDMI 2.1接口协议于2017年就公布了,从去年开始逐渐普及,高达48Gbps的带宽成为了次时代主机和高端游戏电视的标配,可以有效的提升画面质量.(GRL发布HDMI2.1通过认证企业名册),但是 ...

  • 拆解报告:公牛USB2.0 C TO C 数据线

    Type-C接口面世之后,随之而来的是USB3.1传输标准的公布,带来的结果就是很多人把这两个概念弄混淆了,误以为这是相同的一个东西,其实并不是,这里先来讲讲USB3.1,这货目前的最高速率达到10G ...

  • USB的前世今生 - USB2.0、USB3.0、USB3.1、USB3.2、USB4.0区别是什么

    说到USB,特别是最近发布更新的USB3.2,更有USB4等,发现市场上此种线材的命名方法各成一家,关键是看工程师有没有经常关注行业动态和USB协会的更新说明了,市场上有多少种类的TypeC,而我们又 ...

  • 三星超薄本:两个USB3.0接口、HDMI接口、microSD卡卡槽、Type C等一应俱全

    最近两年,各种类别的拓展坞是雨后春笋,大家都大量的上产品线,Type-C扩展坞,今天你跟了吗?当然确有厂商分到一杯羹,但更多的仍然是深陷其中,今天我们带来的讯息,可能是雪上加霜,不是个好消息,目前去三 ...

  • UC头条:高云半导体宣布发布USB 2.0接口解决方案

    广东高云半导体科技股份有限公司(如下简称:高云半导体)近日宣布发布其USB 2.0接口解决方案,此方案能够使FPGA设计人员轻松的集成USB 2.0功能,无需外挂PHY芯片. 高云半导体USB2.0解 ...

  • 小米最新顶配旗舰机配备USB2.0这件事

    关于这一次小米11 Pro.小米11 Ultra包括小米 MIX FOLD配备USB2.0这件事,我觉得小米并不是为了缩减成本而不配备USB3.1. 因为我查了一下C口USB2.0和USB3.1的母座 ...

  • PCIE2.0/PCIE3.0/PCIE4.0/PCIE5.0接口的带宽、速率计算

    一.PCIE接口速率: 二.PCIE相关概念: 传输速率为每秒传输量GT/s,而不是每秒位数Gbps,因为传输量包括不提供额外吞吐量的开销位: 比如 PCIe 1.x和PCIe 2.x使用8b / 1 ...

  • USB2.0和USB3.0的区别是什么?

    现在USB接口一般有两种,USB2.0和3.0,对于不了解这两种USB类型的,可以参考一下一起来探讨一下USB2.0与USB3.0的区别及辨别方法. USB具有传输速度快,使用方便,支持热插拔,连接灵 ...