1. 关键概念

1.1 IN和OUT

这两个参数的主对象都是主机。IN和OUT都是主机发起的(通过令牌包)。

IN:主机发送IN令牌包告诉设备要取数据。然后从机将发送数据放到IN缓冲区,主机从IN缓冲区接收数据;

OUT:主机发送OUT令牌包告诉设备要发送数据。然后主机将数据放到OUT缓冲区,从机在OUT缓冲区取数据;

1.2 NRZI编码

NRZI:No Return Zero-Inverse 非归零反相编码。

编码后电平只有正负电平之分,没有零电平,是不归零编码。

在传输中,同步头SYNC为00 01H,15个翻转信号。

但是当传输连续的逻辑1位时,NRZ-I编码后,将保持上一次翻转后的状态。这使得接收端无法从中得到同步信号。为此,USB协议规定:如果要发送的数据中出现有连续的6个1,则在进行NRZI编码前,在这6个连续的1后面会插入1个0,然后再进行NRZI编码。接收端收到连续6个1,将自动去掉后面的1个0。从而恢复原数据。包数据传送多个1的处理。这样就使得USB通信的接收同步更加可靠。

2. usb枚举过程

2.1 控制传输

枚举过程都是用的控制传输,可以保证数据的正确性。 控制传输可以分为三个步骤。

  • 建立过程:开始于一个SETUP令牌包,后面跟一个DATA0数据包,然后就是数据过程;
  • 数据过程:分为控制读传输(输入数据)和控制写过程(输出数据);建立过程指定数据长度为0则没有数据过程;
  • 状态过程:数据传输方向与数据过程相反;

2.2 枚举详细过程

  • 检测到设备插入,复位设备;然后主机往地址0的设备端点0请求设备描述符(标准是18个字节),如果设备的端点0不够18个字节,主机只获取第一包(至少8字节)数据即可;
  • 主机对设备再次复位,进入设置地址阶段;地址由主机管理,每个设备会有一个唯一的地址;
  • 主机再次获取设备描述符,这次使用设备地址访问设备,并且需要获取完整的设备描述符(即18个字节);
  • 主机获取配置描述符,配置描述符总共9个字节;配置描述符主要记录信息:配置所包含的接口数,配置的编号,供电方式,是否支持远程唤醒,电流需求量等;

3. USB包结构及传输过程

USB数据发送到总线上时,先经过位填充,再经过NRZI编码。

传输数据时:电平翻转表示0,电平不翻转表示1;

全速或低速设备的包结束符EOP——SE0,D+和D-都保持为低电平,用来表示特殊的意义(如包结束,复位信号等)。 包标识符PID表示一个包的类型。总共8位,后4位(PID4~7)是对前4位取反,用来校验前4位(PID0~PID3)。

3.1 令牌包(token packet,PID1~0为01)

用来启动一次usb传输。有4种。

  • 输出OUT——OUT包的结构:同步域-8位包标识PID-7位地址-4位端点号-5位CRC5校验-EOP。
  • 输入IN——IN包的结构与OUT包一样。
  • 建立SETUP——SETUP包结构与OUT包一样。
  • 帧起始包SOF(start of frame)——SOP的结构:同步域-8位包标识PID-11位帧号-5位CRC5校验-EOP。

3.2 数据包(data packet,PID1~0为11)

  • USB1.1协议中只有DATA0和DATA1两种包。
  • USB2.0增加了DATA2和MDATA包,主要用在高速分裂事务和高速高带宽同步传输中。
  • 数据包结构:同步域-8位包标识PID-字节0~字节N-16位CRC16校验值-EOP。
  • 不同的数据包(DATA0,DATA1...)用在当握手包出错时纠错。

3.3 握手包(handshake packet,PID1~0为10)

握手包用来表示一个传输是否被对方确认。

握手包结构:同步域-PID-EOP

握手包有4种。

  • ACK 表示正确接收数据,并且有足够的空间来容纳数据。主机和设备都可以用ACK来确认。 其它三个握手包只能只能设备返回。
  • NAK 表示没有数据需要返回。或者数据正确接收但没有足够空间容纳它们。 主机收到NAK,会在以后合适时机重试传输。
  • STALL 表示设备无法执行这个请求,或者端点已经被挂起,表示一种错误的状态。 设备返回STALL后,需要主机干预才能接触这种状态。
  • NYET 只在USB2.0高速设备输出事务中使用,表示设备本次数据成功接收,但没有足够空间接收下一次数据。 主机在下一次输出数据前,先用PING令牌包试探设备是否有足够空间,避免不必要的带宽浪费。

注意点返回NAK并不表示数据出错,只是说明设备暂时没有数据传输或者暂时没有能力接收数据。 当usb主机或者设备检测到数据出错时(如CRC错误,PID校验错误,位填充错误等),将什么都不返回。 这时等待接收握手包的一方就会收不到握手包从而等待超时

3.4 特殊包(special packet,PID1~0为00)

总共有4种。

  • PRE令牌包 通知集线器打开其低速端口的一种前导包。只使用在全速模式。 与握手包结构一样:同步域-PID-EOP
  • ERR握手包 在分裂事务中表示错误使用。
  • SPLIT令牌包 高速事务分裂令牌包。通知集线器将高速数据包转换为全速或低速数据包发送给下面的端口。 高速分裂事务属于集线器功能,在USB2.0协议中有描述。
  • PING令牌包 与OUT令牌包结构一样:同步域-8位包标识PID-7位地址-4位端点号-5位CRC5校验-EOP。 后面不发送数据。只是为了设备返回ACK或NAK,以确定设备是否能够传输数据。 USB2.0以后才加入PING包。 只用在批量传输和控制传输的输出事务中。 只在高速设备中使用。

4. USB的四种传输类型

USB的传输必须按照一定的关系组织成事务才能传输数据。

USB的事务由两个或三个包组成:令牌包、数据包和握手包。

4.1 批量传输

使用批量事务(bulk transaction)传输数据。分三个阶段:令牌包阶段,数据包阶段,握手包阶段。 批量传输通常用在数据量大,对数据实时性要求不高的的场合。如usb打印机、大容量存储设备。

 

4.2 中断传输

中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于这个时间间隔的范围内安排一次传输。
这里说的中断与硬件的中断不一样,不是设备主动的发生一个中断请求,而是由主机保证不大于某个时间间隔内安排一次传输。

4.3 等时传输(又叫同步传输)

  • 通常用在数据量大,对实时性要求高的场合。如音视频数据。
  • 没有应答包,因为数据少量错误无所谓,也不需进行重传。

4.4 控制传输

目前所知的使用控制传输的场景就是枚举过程。

控制传输分三个过程:建立过程,可选的数据过程,状态过程。

建立过程使用了一个建立事务,流程图如下:

usb通讯——读《圈圈教你玩usb》相关推荐

  1. 圈圈教你玩USB学习总结

    前言 最近想学习一下USB的相关知识,然后看大家都比较推荐<圈圈教你玩USB>这本书作为入门资料,看了一个礼拜看到了USB键盘实现章节.因为USB的内容比较多也比较复杂,特写下此文进行梳理 ...

  2. 计算机硬件驱动的安装,usb驱动安装,手把手教你电脑usb驱动怎么安装

    其实USB移动能够在电脑上实现一些操作,原因是因为有usb驱动去带动,说安装和更新usb驱动的工作很重要,它能够帮助用户解决USB设备接上电脑之后无法识别等一些常见的USB设备驱动问题.下面,小编就来 ...

  3. 圈圈教你玩转USB第三版 光盘资料

    下载官网: http://service.buaapress.com.cn/mzs/file/detail/id/2199/key/b2fec916cc9fa216abe6fc836e3f7e35

  4. 计算机无法识别读卡器怎么办,usb读卡器读不出来怎么办,教您解决的办法

    如今的读卡器功能上已经非常的齐全,目前主流的一些内存卡都能适用.对于读卡器的情况,有些朋友还是会反应一些问题,那就是会遇到读卡器读不出来的情况.如果说遇到了这种情况,那就可以看下是读卡器的问题还是电脑 ...

  5. 计算机无法识别读卡器怎么办,usb读卡器读不出来怎么办,详细教您解决的办法...

    随着许多电子产品的普及,目前例如像智能手机.数码照相机.笔记本电脑等等,都在我们生活越来越广泛.而这些产品的共通性,那就是信息都是以数据形式存在的,照片.音乐等等.因此,一个额外的小工具就出现在我们的 ...

  6. Android 串口开发,发送串口命令,读卡,反扫码,USB通讯,实现demo。——持续更新

    应用场景:APP发送串口命令到打印机,打印相应数据小票 // 串口 implementation 'com.github.licheedev.Android-SerialPort-API:serial ...

  7. 不用USBASP芯片也可用USB,纯AVR实现USB通讯:AVRUSB

    转载:不用USBASP芯片也可用USB,纯AVR实现USB通讯:AVRUSB    作者:codexy AVR的速度刚好可以跟得上USB1.0的通讯速度,所以可以模拟和USB通讯.USBASP就是这么 ...

  8. 计算机usb端口没反应,技术编辑教您电脑usb接口没反应怎么办

    近来,有好多小伙伴反应有电脑USB接口不能使用的情况,鼠标键盘通通没反应.针对电脑usb接口没反应的问题,小编整理了常见的原因以及解决方法,希望能帮助你们解决问题 USB是一个外部总线标准,用于规范电 ...

  9. 计算机usb口不识别读卡器,windows7系统下usb读卡器读不出来如何解决

    最近有windows7系统用户到本站反馈说碰到这样一个情况,就是在使用读卡器传输文件的时候,发现插入到电脑出现无法识别读卡器的情况,该怎么办呢,针对windows7系统下usb读卡器读不出来这个问题, ...

  10. android usb通讯波特率,USB串口的特殊波特率通信

    USB串口的特殊波特率通信是指波特率为非标准数值的任意波特率.由于这些波特率是非标的,所以从硬件到软件都有特殊要求和方法才可以实现.本文以最新2015款的波仕USB232ET转换器为例从硬件和软件两方 ...

最新文章

  1. 读书笔记--《机器人时代》
  2. Verdi GUI技能操作-Application Tutorials部分
  3. Django中管理并发操作
  4. CSS学习笔记 display属性
  5. 集合python_python集合访问的方法
  6. asp.net C#实现下载文件的六种方法实例
  7. Win7下安装Flash低版本
  8. 群晖NAS与Windows系统实现共享文件夹同步方案
  9. 如何优化深度学习模型
  10. mysql切换数据库命令_MySQL数据库的基础使用命令大全
  11. 计算机基础知识好学吗,计算机编程好学吗 需要什么基础知识?
  12. android EditText 设置弹出数字输入法键盘
  13. 面试题:查询字符串中出现次数最多的字符以及出现次数
  14. 如何把很多照片拼成一张照片_怎样用手机将多张照片拼成一张组合图
  15. 线性规划Matlab程序(小白向)
  16. 且看一个IT女孩的求职之路
  17. IDEA 2020版 创建第一个WEB网站——教程
  18. 『津津乐道播客』#134. 不是纹个皮皮虾你就能叫黑涩会了(嘉宾:索大)
  19. 北交大计算机在职非全考研初试心得
  20. String...str是什么?

热门文章

  1. html中多个网页的跳转页面,Html --- Footer 多页面应用跳转
  2. socket通信需要网线连接吗_socket方式实现网络通信
  3. 关于linux内核版本说法,关于Linux内核版本的说法,以下错误的是( )
  4. linux产生大量随机数据,linux产生随机数与随机字符
  5. php 后端服务错误定义,【后端开发】php常见的错误类型有哪四种
  6. Dart教程(一):dart安装
  7. ASP.Net七大内置对象 (整理的不错,转过来参考)
  8. springboot @Configuration配置类里面使用@Value获取不到.yml配置文件属性的值
  9. 2016级算法第一次练习赛-D.AlvinZH的儿时回忆——跳房子
  10. 高级java面试宝典