sseeker
驱动牛犊
驱动牛犊
  • 注册日期2004-06-21
  • 最后登录2004-09-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:6308回复:8

USB通讯协议入门问题 ( 给分 )

楼主#
更多 发布于:2004-09-21 10:15
在USB设备枚举完成后,DEVICE 和 HOST 是如何通讯的.
比如说: HOST 有数据要发送到 DEVICE , 它怎么通知 DEVICE 接收.这里HOST 向 DEVICE 发送什么包, DEVICE 如何动作.
反之 DEVICE-->HOST 也一样. 我翻遍了手边的资料也没有说明.

请告诉我具体过程, 或者告诉我具体去看什么资料.

谢谢了

这个问题我在论坛的 <USB驱动开发>版 上问过了,他们给的答案还是让我一头的雾水. 帅哥,美女们,能不能回答的稍微具体一点啊,给点专业精神. 谢谢了

harris
驱动牛犊
驱动牛犊
  • 注册日期2001-06-01
  • 最后登录2004-12-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-22 17:27
这是USB总线的协议:
USB的每次传输都按启动->数据->状态三阶段
启动阶段HOST和DEVICE 决定本次的传输的方向(H->D or D->H), 以及传输的数据长度
数据阶段HOST/DEVICE 就按约定进行数据的传输
状态阶段双方交换本次传输的结果--成功/失败

一般USB的接口芯片实现该协议, 对于FW编程人员只是看到的是本次传输的结果: Control-IN/OUT, Bulk-in/out, 从而作出相应的收发数据的动作!

(以上是本人研究USB的一点心得, 请高手指正  ) :D
kunasen
驱动牛犊
驱动牛犊
  • 注册日期2003-04-29
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-30 15:06

   要看你实现的usb的什么profile
   这个profile要求的end point的个数和类型
   int、bulk、iso的end point的数据传输各有各的方式
   但dev都是被动的,需要host来init传输,dev来响应
   细说就太多了,你看看usb的规范吧
talkxyj
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2009-08-16
  • 粉丝1
  • 关注1
  • 积分12分
  • 威望21点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-10 21:14

这里涉及到usb之外的东西。
我们仍用host和device这两个词,以下的讨论以usb为例子但并不仅仅局限于USB,且并不保证所作描述的精确性。

1.进入待命状态
对deivce来讲,host是一个直运行的命令发送者,只要建立起了有效的数据通道,host会不确定的发送命令;这里device需要解决的第一个问题,就是如何做好接收命令的准备。

那么系统状态流程中device的第一个状态,便是:待命。
以cypress encore的单片机为例,
如果用Bulk OUT(or Interrupt OUT) 管道来接收命令,那么除了一切必要的初始化外,这个管道对应的模式应当被设置为ack out,此后程序应该以某种方式(如循环)等待host命令的到来。
grimreaper
驱动牛犊
驱动牛犊
  • 注册日期2004-10-13
  • 最后登录2006-08-25
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-10-15 16:44
最顶上那个兄弟说的只是控制传输。例如,如果是中断IN传输,HOST发出的第一个包就是IN包(PID,设备地址和端点地址),DEVICE负责回应NAK,ACK或者STALL。。。

我的理解:固件只管中断程序和寄存器的设置,设备列举好以后,主机知道了设备可以执行的功能,就发一些相关的包,就可以开始传输了,所以才说USB是主从式的

资料很多的,我看的每本USB的书都有,但是还是不懂。。。。。
p_y_h
驱动牛犊
驱动牛犊
  • 注册日期2004-04-27
  • 最后登录2006-04-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-10-18 13:59
USB的一个基本原则:所有通信建立、状态查询、数据发送和接收请求是HOST发起的,DEVICE不向HOST发请求。
OTG设备具有HOST 和DEVICE 两个角色,两个OTG设备间当一个是HOST,一个是DEVICE时,两者之间可以通过HNP协议互相请求的,不在讨论这次讨论之内。

USB DEVICE FIRMWARE所在的层次:USB2.0SPEC里(第8章)所描述的传输协议一般的由USB的接口芯片实现该协议,不需要我们固件去实现这些协议,当然需要了解,并在具体的ENDPOINT和HOST 间指定传输类型。FIRMWARE需要是对更上一层协议的解析(如DEVICE作为MASS STORAGE 设备,需要能解析指定的SCSI命令),可以用网络分层模型去理解(如物理层、链路层、传输层等等)。

一般USB有两个过程:
1、USB HOST 和 DEVICE建立通信链路过程,也就是你说的“USB设备枚举完成”,在DEVICE 插入HOST后,HOST和DEVICE 的EP0之间使用CONTROL 传输建立通信链路,HOST获取DEVICE的相关信息,并为DEVICE分配地址。
2、数据传输(或其他,这里把DEVICE作为MASS STORAGE设备),HOST和DEVICE某个ENDPOINT间可以建立传输通道,如果通道的传输类型是IN,则说明HOST想从DEVICE读数据,如果是OUT则说明HOST想写数据到DEVICE中。HOST知道读(READ10)/写(WRITE10)多少长度数据。至于DEVICE怎么知道HOST已经发完数据了,是由USB接口芯片完成了,一般DEVICE端的USB接口芯片成功接收数据后,会向MCU请求中断,找一个USB控制芯片的SPEC就可以了解了。

3、几篇资料:USB2.0 SPEC,SCSI 命令,某一种USB控制芯片SPEC
firmerliu
驱动牛犊
驱动牛犊
  • 注册日期2003-02-19
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望206点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-10-28 11:48
以键盘为例来说,当有键按下时,就将新的数据写入相应endport的Buffer中,再查看其他特殊寄存器的内容,看Host是否处于空闲状态,如是的话,就修改某些寄存器的内容,告知IC内部的USB SIE Device有数据要传输;USB SIE会自动将数据取走,再自动传给Host,同时设置相关寄存器的内容。这些动作与Firmware都没有关系,Firmware只要丢数据与查看、修改寄存器的内容就行了。
冰冻三尺非一日之寒
junki
驱动牛犊
驱动牛犊
  • 注册日期2004-09-02
  • 最后登录2007-11-30
  • 粉丝0
  • 关注0
  • 积分124分
  • 威望13点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-03-30 16:02
  有没有实现PC与USB设备通讯的VB源程序,可进行实时数据的传输与接收,一定要是可以实现通讯的。
  谢谢!
  如果你有什么需要,我将十分乐意提供给你资料,
希望多多合作。
E-Mail:wangkai1314_2000@163.com
wwsxxz
驱动牛犊
驱动牛犊
  • 注册日期2002-01-14
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望9点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-08-04 16:16
回答的不错!!!!!
游客

返回顶部