可以使用USB2.0接口进行全双工通讯么,双方都可以主动发送么?
来源:互联网 发布:淘宝图片保护怎么破解 编辑:程序博客网 时间:2024/09/21 08:53
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页
找不到用USB的理由。
同一块board上的芯片吗?
还不如直接用GPIO自己写一个协议来得快。
或者GPIO模拟IIC。
不同board,走Ethernet,你要传得远可以把报文发到交换机上,然后电转光,选择太多。
就算是不带系统,IP栈也比USB栈要高效。
需要供电?PoE走起。
抗干扰?USB太不给力了。- 可以使用USB2.0接口进行全双工通讯么,双方都可以主动发送么?
- 用socketpair()进行进程间的全双工通讯
- 用socketpair()进行进程间的全双工通讯
- 通讯传输,全双工、半双工、单向
- C#中使用SendMessage进行进程通信,可以发送字符串。
- USB2.0通讯协议
- 看看,你都可以做到么
- 做企业:什么都可以外包么
- 串行通讯 -----单工、半双工和全双工
- 通讯概念(一)单工,半双工,全双工
- USB2.0接口定义
- Java实现串口全双工通讯
- 利用Java实现串口全双工通讯
- 利用Java实现串口全双工通讯
- 利用Java实现串口全双工通讯
- 利用Java实现串口全双工通讯
- 利用Java实现串口全双工通讯
- 利用Java实现串口全双工通讯
- css中position元素
- Linux 防火墙配置
- blender里不认识的单词(2)
- caffe源码阅读遇到的问题
- 一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。
- 可以使用USB2.0接口进行全双工通讯么,双方都可以主动发送么?
- JQuery_基础
- JAVA知识点概述
- 371. Sum of Two Integers
- 矩阵乘以它的转置
- 5、ModelAndView——处理模型数据
- OC学习篇之---类的初始化方法和点语法的使用
- 从零开始前端学习[52]:js中的数据类型以及没有数据类型的数据类型typeof
- 利用Openssl制作自签名证书