USB 协议学习:000-有关概念

背景

USB作为一种串行接口,应用非常广泛。掌握usb也是作为嵌入式工程师的一项具体要求。

概述

USB( Universal Serial Bus, 通用串行总线 )属于一种轮询式总线,主机控制端口初始化所有的数据传输。每一总线动作最多传送三个数据包,包括令牌(Token)、数据(Data)、联络(HandShake)

按照传输前制定好的原则,在每次传送开始时,主机送一个描述传输动作的种类、方向、USB设备地址和终端号的USB数据包,这个数据包通常被称为令牌包(TokenPacket)。USB设备从解码后的数据包的适当位置取出属于自己的数据。数据传输方向不是从主机)到设备就是从设备到主机。

在传输开始时,由标志包来标志数据的传输方向,然后发送端开始发送包含信息的数据包或表明没有数据传送。接收端也要相应发送一个握手的数据包表明是否传送成功。发送端和接收端之间的USB数据传输,在主机和设备的端口之间,可视为一个通道。USB中有一个特殊的通道一缺省控制通道,它属于消息通道,设备一启动即存在,从而为设备的设置、状态查询和输入控制信息提供一个入口。

由于USB是主从模式的结构,设备与设备之间、主机与主机之间不能互连,为解决这个问题,扩大USB的应用范围,出现了USB OTG(ON The Go)。USB OTG 同一个设备,在不同的场合下可行在主机和从机之间切换。

USB 的 3种工作模式:低速(low speed)、全速(full speed)、高速(high speed)

在USB的通讯中,有传输(transfer),事务(Transaction),包(packet)三级。包是最基础的传输单元,与TCP/IP协议中的MAC层协议作用相同。

USB数据是由二进制数字串构成的,数字串构成,域再构成,包再构成事务(IN、OUT、SETUP),事务最后构成传输( 中断 interrupt 传输、并行传输、批量传输和控制 control 传输)。

域:若干个二进制数据组在一起叫做‘域’ 。

USB的域就是放在USB包中某小段某小段的数据。实际上我们以前的学习已经遇到了,只是没有这么叫。将域单独拎出来总结我认为对于初学者来说是比较混乱的。

  1. 在USB的通讯中,有传输(transfer),事务(Transaction),包(packet)三级。包是最基础的传输单元,与TCP/IP协议中的MAC层协议作用相同。
  2. 在一次传输中,由多次事务组成,每次的事务又由多个包组成
  3. 与众多协议相同,较高级别的协议的报文是基于/内嵌在低级协议的报文当中的,在USB中也不例外,例如,包中预留了DATA位,其目的就是填写报文

通信有关

一个设备有多个配置,一个配置有多个接口,一个接口有多个端点。(一个device有多个configuration,一个configuration有多个interface,一个interface有多个endpoint)

同一时刻只有一个配置有效;当我们需要不同的功能,只要选择不同的配置即可。同一个端点号不能出现在多个不同的接口中。

端点: 位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有唯一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点)

帧: 时间概念,在USB中,一帧就是1MS,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份是一个USB的传输动作。

upstream、downstream(上行、下行):设备到主机为上行,主机到设备为下行

USB接口一般是4根线,VCC GND DM(D-) DP(D+) ;差分传输,3.3v 电压

传送方式: 数据在usb线里由地位到高位传送

枚举:USB主机检测到USB设备以后,读取设备的各种描述符的过程。

通过枚举,USB主机可以知道设备是什么样的设备,以对应加载合适的驱动程序。

调试USB设备,很重要的一点就是USB的枚举过程;只要枚举成功了,剩下的工作就不多了。

获取设备描述符的传输过程

设置事务:主机向设备下发 -> 80 06 00 01 00 00 40 00

  • 令牌包 --> :SETUP类型
  • 数据包 --> :由于令牌是SETUP类型,所以主机紧接着下发数据包,DATA0类型
  • 握手包 <-- :设备收到数据包,回复应答

输入事务:设备向主机上发 -> 12 01 00 01 DC 00 00 10 71 04 F0 FF 00 01 00 00

  • 令牌包 --> :IN类型,主机准备好,设备可以上发数据
  • 数据包 <-- :DATA1类型:DATA0与DATA1在发送数据时需要交替,DATA中夹带设备描述符
  • 握手包 --> :主机收到回复,向设备应答

输出事务:无

  • 令牌包 --> :OUT类型
  • 数据包 --> :DATA0类型,再一次切换为DATA0,没有需要发送给设备的
  • 握手包 <-- :设备收到数据包,回复应答

USB的包

包:有四种类型,分别是令牌包数据包握手包和特殊包,不同的包的域结构不同,介绍如下:

1、令牌包:可分为输令牌入包(IN)、输出令牌包(OUT)、设置令牌包(SETUP)和帧起始包(SOF)(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放据数的)其中输入包、输出包和设置包的格式都是一样的:SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)

  • 输出令牌包:用来通知设备将要输出一个数据包。
  • 输入令牌包:用来通知设备符合一个数据包。
  • 建立令牌包:只用在控制传输中,与输出令牌包作用相同。区别在于:SETUP令牌包以后只使用DATA0数据包,且只能发送到设备的控制端点且设备必须要接收;而OUT令牌包没有这些限制。
  • 帧起始包:在每一帧/微帧开始时发送,以广播的形式发送给总线,所有的USB全速设备和高速设备都可以接收到(全速设备每毫秒发一个帧;高速设备每125us产生一个微帧);USB主机会对当前帧号进行计数,在每一帧开始时(或者微帧开始时,因为每毫秒有8个微帧,所以这8个微帧的帧号相同);帧号为11位。在4个令牌包中,只有SOF包之后不跟随数据传输(其他都有数据传输)。每一个令牌包都会有一个CRC5的校验。(只校验PID之后的数据,因为PID已经有4位反码进行校验了)

帧起始包的格式:SYNC+PID+11位FRAM+CRC5(五位的校验码)+EOP

2、数据包:分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是 DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0,格式如下:

SYNC+PID+0~1023字节+CRC16

3、握手包:结构最为简单的包,格式:SYNC+PID

4、特殊包:根据不同的通讯而有不同的行为。schips

USB的事务

分别有IN(输入)、OUT(输出)和SETUP(设置)三大事务,每一种事务都由令牌包、数据包、握手包三个阶段构成。

USB事务的特点:

  • 不能中断:USB的每次事务是“堵塞”,必须该事务完整后才能做其他事务

  • 状态判断:之前的举例当中,每次传输都是成功的回复了ACK,可以看到,上图中,事务发起了三次IN的Token包,设备才发送了下一帧数据。不会因为设备忙就退出事务。

  • 流程控制: 下发/接收数据、控制进出方向、确认回复

事务的三个阶段:

这里用阶段的意思是因为这些包的发送是有一定的时间先后顺序的。因为USB是半双工,DM DP并非独立工作,所以采用"三段式"通讯,保证总线不会冲突

1、令牌包阶段:主机发起,启动一个输入、输出或设置的事务。

2、数据包阶段:根据令牌包中的方向,由主机发起(OUT/SETUP)或者设备发起(IN)数据包。

3、握手包阶段:数据包接收方发起握手包,返回状态,包含ACK NAK STALL状态等。(在同步传输的IN和OUT事务中没有这个阶段)

事务的三种类型如下(以下按三个阶段来说明一个事务)

IN事务

令牌包阶段:主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据;

数据包阶段:设备根据情况会作出三种反应(要注意:数据包阶段也不总是传送数据的,根据传输情况还会提前进入握手包阶段)。

  1. 设备端点正常:设备往主机里面发出数据包(DATA0与DATA1交替);

  2. 设备正在忙:无法往主机发出数据包就发送NAK无效包,IN事务提前结束,到了下一个IN事务才继续;

  3. 相应设备端点被禁止:发送错误包STALL包,事务也就提前结束了,总线进入空闲状态。

握手包阶段:主机正确接收到数据之后就会向设备发送ACK包。

OUT事务

令牌包阶段:主机发送一个PID为OUT的输出包给设备,通知设备要接收数据;

数据包阶段:比较简单,就是主机会往设备送数据,DATA0与DATA1交替

握手包阶段:设备根据情况会作出三种反应

  1. 设备端点接收正确,设备给主机返回ACK,通知主机可以发送新的数据,如果数据包发生了CRC校验错误,将不返回任何握手信息;

  2. 设备正在忙,无法给主机返回ACK,就发送NAK无效包,通知主机再次发送数据;

  3. 相应设备端点被禁止,发送错误包STALL包,事务提前结束,总线直接进入空闲状态。

SETUT事务

令牌包阶段:主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据;

数据包阶段:比较简单,就是主机往设备送数据,注意,这里只有一个固定为8个字节的DATA0包,这8个字节的内容就是标准的USB设备请求命令,详见2.4。

握手包阶段:设备接收到主机的命令信息后,返回ACK,此后总线进入空闲状态,并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输)。

枚举过程

  1. 等待稳定:主机通过电平差检测到设备,等待100ms让设备电平趋于稳定
  2. 首次复位:HUB发起复位,让设备进入初始的地址0模式
  3. 首次查询设备描述符:GET_DESCRIPTOR 主机查询设备描述符,只要前8字节 ==> 80 06 01 00 00 00 12 00
  4. 二次复位:在接收到设备描述符前8个字节后,再次重启设备
  5. 设置地址:SET_ADDRESS 主机下发设置地址命令,设备获取新地址 ==> 00 05 01 00 00 00 00 00
  6. 二次查询设备描述符:GET_DEVICE_DESCRPTOR获取整个18字节的设备描述符 ==> 80 06 01 00 00 00 12 00
  7. 获取配置描述符:GET_CONFIGURATION 获取9字节配置描述符 ==> 80 06 02 00 00 00 09 00
  8. 完成配置:SET_CONFIGURATION,

附录: USB插入检测

  • A:USB是如何检测到设备插入的
  • Q:主机端将DM DP接入下拉电阻;设备端根据不同速度,将DM DP的某一根接上拉电阻,插入时通过压差即可判定是否插入
    • 低速设备:在DM线上接入上拉
    • 全速设备:在DP线上接入上拉
    • 高速设备:在DP线上接入上拉,在主机对设备进行复位后进一步的确认

主机在要和设备通信之前会发送Reset信号(拉低两根信号线并保持10ms )来把设备设置到默认的未配置状态。

USB 协议学习:000-有关概念的更多相关文章

  1. USB2.0协议学习笔记---基本概念

    概念  USB是一种串行通信总线(Universal Serial Bus),经历的版本有USB1.0,USB1.1.USB2.0等.USB是一种主从模式的结构,因此它无法在设备与设备.主机与主机之间 ...

  2. USB协议学习

    URB:USB 请求块(USB request block,urb)是USB 设备驱动中用来描述与USB 设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff 结构体.

  3. 接口与协议学习笔记-USB协议_USB2.0_USB3.0不同版本(三)

    USB(Universal Serial Bus)全称通用串口总线,USB为解决即插即用需求而诞生,支持热插拔.USB协议版本有USB1.0.USB1.1.USB2.0.USB3.1等,USB2.0目 ...

  4. USB2.0协议学习笔记---USB数据包结构

    USB包类型和传输过程  USB是一种串行总线,因此数据都是一位一位传输的,如同串口那样,但是USB在真实物理电路上却不是TTL电平,而是一种差分信号采用NRZI编码,就是用变化表示0,不变表示1,同 ...

  5. USB协议基础知识

    ref : https://blog.csdn.net/u010142953/article/details/82627591 USB 基本知识  USB的重要关键概念:  1. 端点:位于USB设备 ...

  6. USB协议[转]_基本上涵盖了所有最基础的USB协议相关知识。

    背景: 需要使用到USB协议,我一直尝试着去强记这个流程,现在看来,其实不用.看多了,把这个过程具象出来,就牢牢记住了. 正文: 正文转自:http://fangjian0518.blog.163.c ...

  7. (转)USB协议简介

    USB协议简介     USB是一种协议总线,即主机与设备之间的通信需要遵循一系列约定.协议内容较多,这里仅作一些简单介绍,深入学习,可参看USB规范(WWW.usb.org).     为了理解协议 ...

  8. usb入门学习

    1.学习资源: usb org.http://www.beyondlogic.org/usbnutshell/usb3.shtml http://wenku.baidu.com/view/028231 ...

  9. USB协议[转]__总结得很好

    一 枚举过程:◆ 用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态.◆主机检测设备.◆集线器使用中断通道将事件报告给主机.◆主机发送Get_Port_Status(读端口状态) ...

  10. USB2.0协议学习笔记---描述符

     USB设备描述符 字段名 长  度(字节)  地址偏移 含           义 bLenth   1  0  描述符长度 bDescriptorType   1  1 描述符类型 (这里为 1) ...

随机推荐

  1. 将字节数组输入流拷贝成字节数组输出流,将ByteArrayInputStream转成ByteArrayOutputStream

    /** 将 ByteArrayInputStream 拷贝成 ByteArrayOutputStream * 将 字节数组输入流 拷贝成 字节数组输出流 */ public static ByteAr ...

  2. Google高精度的搜索技巧

    利用"关键字",完全匹配搜索(双引号精准搜索). 利用"关键字:档案类型",搜寻特定档案类型. 例如:"简历:doc"."钢铁侠: ...

  3. WSL2使用桥接网络,并指定IP

    前言 微软终于解决了宇宙级难题了,一直以来的WSL2每次启动IP都是动态分配的,并且是NAT的网络.当然网上对此也有一些解决方案,编写脚本在启动时修改,但是太麻烦了,这次很完美的解决了这个难题. 检查 ...

  4. 七、Doris Colocation Join

    Colocation Join 是在 Doris 0.9 版本中引入的新功能.旨在为某些 Join 查询提供本地性优化,来减少数据在节点间的传输耗时,加速查询. 1.基本理论 Join 的常见连接类型 ...

  5. WEB服务与NGINX(4)-NGINX实现虚拟主机

    目录 1 http基础配置参数详解 2 搭建虚拟主机 2.1 基于ip的虚拟主机 2.2 基于端口的虚拟主机 2.3 基于域名的虚拟主机 1 http基础配置参数详解 [root@nginx01 ~] ...

  6. Java简单实现MQ架构和思路01

    实现一个 MQ(消息队列)架构可以涉及到很多方面,包括消息的生产和消费.消息的存储和传输.消息的格式和协议等等.下面是一个简单的 MQ 架构的实现示例,仅供参考: 定义消息格式和协议:我们可以定义一个 ...

  7. 给公众号接入`FastWiki`智能AI知识库,让您的公众号加入智能行列

    最近由于公众号用户太多,我就在思考有啥方式能给微信公众号的粉丝提供更多的更好的服务?这个时候我就想是否可以给公众号接入一下AI?让用户跟微信公众号对话,然后还能回到用户的问题,并且我提供一些资料让AI ...

  8. kubernetes 之二进制方式部署

    我的资料链接:https://pan.baidu.com/s/18g0sar1N-FMhzY-FCMqOog 两种集群架构图 多master需要在集群上面加个lb,所有的node都需要连接lb,lb帮 ...

  9. handsontable多选下拉框编辑器扩展

    一.效果截图 二.文件引用 多选下拉框扩展自handsontable的BaseEditor. 多选下拉框组件由两个文件构成, 一个下拉框样式表MultiSelect.css 一个组件实现脚本Multi ...

  10. Dapper升级SqlSugar问题汇总

    最近群里有个小伙伴把Dapper迁移SqlSugar几个不能解决的问题进行一个汇总,我正好写一篇文章来讲解一下 一.sql where in传参问题: SELECT * FROM users wher ...