USB通信学习-基础概念理解

USB通信

1、USB是轮询总线,USB主机发起所有数据交换。数据往返于USB设备中的端点。USB主机输出使用OUT端点,USB主机输入使用IN端点。USB主机中没有端点,数据存储于缓冲区中。从主机的FIFO到设备的端点,中间是Pipes。全速USB传输中,固定的1帧时间为1ms,在高速USB中有将一帧分为了8个微帧,每个125us。

USB数据层次

USB数据层次从小到大分为域(field),包(packet),事务(transaction),传输(transfer),管道(pipes)。

1、域

域是USB数据的最小单位,其实域就像我们CAN通信中,一个CAN帧内的帧起始,帧ID,RTR,IDE等等。一个USB数据包由7个域组成。分别位同步域、标识域、地址域、端点域、帧号域、数据域、校验域。数据发送低位在前,高位在后。

  • 同步域:用于本地时钟域输入同步,标志一个包的起始,全/低速为8位,高速为32位。
  • 标识域PID:由4位表示符和4位表示符反码组成,用于表明包的类型和格式,有令牌包,数据包,握手包。
  • 地址域ADDR:七位地址,表示设备在主机上的地址。复位和通电后默认为0,在枚举过程中由主机配置。
  • 端点域ENDP:4位,表示端点编号。端点0默认作为控制传输端点,且双向控制。
  • 帧号域:11位,帧号从0开始递增,到0x7FF后自动变为0。
  • 数据域:0~1023字节,不同传输类型中,数据域的长度不同。
  • 校验域:对令牌包(CRC5)和数据包(CRC16)中非PID域进行校验。

2、包

包是USB传输的基本单位。它分为四种类型,令牌包、数据包、握手包和特殊包。

令牌包

令牌包又可分为输出(OUT)、输入(IN)、帧起始(SOF)、建立(SETUP)。令牌包结构如下表所示

PIDADDRENDPCRC5
长度(bit)8745

令牌包说明

PID说明
OUT0001B用来通知设备将要输出数据包
IN1001B用来通知设备将要返回一个数据包
SOF0101B每帧开始时发送,EOP是每帧结束的标志
SETUP1101B只用在控制传输中,它跟输出令牌包作用一样,也是通知设备将要输出一个数据包。SETUP包后只使用DATA0数据包。
数据包

数据包用来传输数据。数据包结构如下表所示

PIDDATACRC16
长度(bit)80~819216

低速设备允许的最大有效数据载荷为8字节,全速设备的最大有效数据负载大小为1023字节,告诉设备的最大有效数据载荷为1024

数据包说明

PID说明
DATA00011数据包偶书包
DATA11011数据包奇数包
DATA20111高速同步事务的专用数据包
MDATA1111SPLIT事务专用数据包
握手包

握手包用来表示一个传输是否被对方确认。包结构如下表所示

PID
长度(bit)8

握手包说明

PID说明
ACK0010数据被正确接收
NAK1010数据未正确接收、设备内存不够无法接收数据或设备无数据可发送
STALL1110设备无法执行这个请求或者端点已经被挂起。
NYET0110在高速设备OUT事务中使用,表示设备本次数据接收成功,但是没有足够的空间接收下次数据。主机下次输出数据时,将先使用PING命令来探测设备是否有足够的空间

3、事务

每个事务都包含由三个包,分别是令牌包,数据包,握手包。根据令牌包中PID的不同,事务可以分为三种:SETUP事务,IN事务,OUT事务。

SETUP事务
方向组成
主机到设备令牌包SYNC+PID(SETUP)+ADDR+ENDP+CRC5
主机到设备数据包SYNC+PID(DATA0)+8字节数据+CRC16
设备到主机握手包SYNC+PID(ACK/NAK/STALL)
  1. 主机先发送一个SETUP令牌包给设备,通知令牌包中的所包含的地址的设备准备接收数据(寻址)。
  2. 主机发送8字节的DATA0数据包给设备,SETUP事务必须使用DATA0。这8字节的内容就是标准的USB设备请求命令。
  3. 设备接收指令后会返回一个握手包给主机。
IN事务
方向组成
主机到设备令牌包SYNC+PID(IN)+ADDR+ENDP+CRC5
设备到主机数据包SYNC+PID(DATA0/1)+(0~1023)字节数据+CRC16
主机到设备握手包SYNC+PID(ACK/NAK/STALL)
  1. 主机先发送一个IN令牌包给设备,通知令牌包中的所包含的地址的设备向主机发送数据(寻址)。
  2. 设备如果正常,则向主机发送数据,如果数据需多次发送,则交替使用DATA0和DATA1。如果设备异常,则发送NAK或STALL提前结束IN事务。
  3. 主机收到数据后发送一个握手包给设备。
OUT事务
方向组成
主机到设备令牌包SYNC+PID(OUT)+ADDR+ENDP+CRC5
主机到设备数据包SYNC+PID(DATA0/1)+(0~1023)字节数据+CRC16
设备到主机握手包SYNC+PID(ACK/NAK/STALL)
  1. 主机先发送一个OUT令牌包给设备,通知令牌包中的所包含的地址的设备准备接收数据(寻址)。
  2. 主机发送数据包给设备,如果数据需多次发送,则交替使用DATA0和DATA1。
  3. 设备接收指令后会返回一个握手包给主机。

4、传输

传输时由事务构成的,有四种类型:中断传输、批量传输、同步传输、控制传输。传输的种类在端点描述符中确定。

中断传输

这里的中断并不是传统意义上的中断,它是主机通过固定时间对中断端点进行查询,轮询时间可以在端点描述符中设置(Interval)。它通常用于有一定实时性要求,但是数据量不大且数据不需要一直通信的传输中,就像我们的鼠标或键盘没有动作就不用传数据给主机。

低速全速高速
最大数据包长度8byte64byte1024byte
最大带宽占用90%90%80%
轮询间隔10~255ms1~255ms2^(interval-1)*125us

需要注意的是主机对中断端点的轮询间隔并不一定是按照我们设置的来,它的只会保证轮询的间隔小于我们设置的间隔。

对于低速和全速传输,一帧中最多只有一次中断传输。对于高速传输,在端点描述符中可以设置中断传输的额外通信次数,最多可以额外传输2次,也就是一微帧中总共传输2次。

中断传输包含了IN事务和OUT事务。如果传输的数据大于最大数据包长度,那么会分多个事务进行传输,直到传输的事务的数据长度小于最大数据包长度,则认为时最后一包数据,传输完成。在传输过程中会,PID会按照DATA0-DATA1-DATA0…来翻转传输。发送端只有在收到ACK的时候才会翻转PID。

批量传输

批量传输的实时性不高,相对来说它的传输优先级最低。只有当USB中有多余的带宽了,批量传输才会开始,但是当带宽比较紧张的时候,批量传输会把带宽让给其他传输。其端点描述符中的Interval不起作用。批量传输一般用于数据传输量大,但是对实时性要求不高的场合,例如打印机。

低速全速高速
最大数据包长度不支持8、16、32、64byte可选512byte

批量传输包含了IN事务和OUT事务,但是比中断传输多了一个PING事务,PING事务只在高速传输中存在。PING事务的用来查看端点的状态。在传输前先PING一下从机,看设备是否准备好接收数据,NYET表示没有准备好接收下一包数据,ACK表示已经准备好接收数据。如果传输的数据大于最大数据包长度,那么会分多个事务进行传输,直到传输的事务的数据长度小于最大数据包长度,则认为时最后一包数据,传输完成。在传输过程中会,PID会按照DATA0-DATA1-DATA0…来翻转传输。发送端只有在收到ACK的时候才会翻转PID。

同步传输

同步传输是一种实时的但是不可靠的传输,不支持错误重发机制。同步传输有固定的时间间隔,端点描述符中的Interval固定为1。对于全速传输,一帧中最多只有一次中断传输(个人理解是对某个端点的中断传输只有一次)。对于高速传输,在端点描述符中可以设置中断传输的额外通信次数,最多可以额外传输2次,也就是一微帧中总共传输2次。同步传输一般用于数据量大,实时性要求高,数据产生连续的场合,例如音视频的传输。

低速全速高速
最大数据包长度不支持1023byte1024byte
最大带宽占用不支持80%90%
轮询间隔不支持1~255ms2^(interval-1)*125us

同步传输包含了IN事务和OUT事务,同步数据的IN和OUT事务没有包握手阶段,数据包的PID都是DATA0。

控制传输

控制传输使用端点0,进行双向传输,一般用于设备配置,枚举。控制传输一般在总线中没有进行同步与中断传输的时候,如果需要进行控制传输,才会启动。

低速全速高速
最大数据包长度8byte8、16、32、64byte可选512byte

控制传输时可靠传输。分为三个过程:

  • 建立过程:一个SETUP事务,用来告诉设备我们主机的请求时什么,数据为8个字节,可以参考标准请求介绍。
  • 数据过程:数据过程不是必须的,数据过程用来读取或者设置请求内容,0个或多个IN/OUT事务。
  • 状态过程:一个IN/OUT 事务,表明请求时否成功了。
标准请求代码表
bRequestValue
GET_STATUS0
CLEAR_FEATURE1
SET_FEATURE3
SET_ADDRESS5
GET_DESCRIPTOR6
SET_DESCRIPTOR7
GET_CONFIGURATION8
SET_CONFIGURATION9
GET_INTERFACE10
SET_INTERFACE11
SYNCH_FRAME12
SET_ENCRYPTION13 (USB2.0以后)
GET_ENCRYPTION14
SET_HANDSHAKE15
GET_HANDSHAKE16
SET_CONNECTION17
SET_SECURITY_DATA18
GET_SECURITY_DATA19
SET_WUSB_DATA20
LOOPBACKDATAWRITE21
LOOPBACK_DATA_READ22
SET_INTERFACE_DS23
SET_SEL48
SET_ISOCH_DELAY49
SETUP 8字节数据格式
OffsetFieldSizeDesc
0bmRequestType1bit7: 0,数据由主机到设备SET请求 1:数据由设备到主机GET请求 bit[6:5]:00,标准请求;01:特定类请求;10:用户定义的请求命令;11:保留
1bRequest1标准请求代码,见标准请求表
2wValue2根据请求的不同,该含义会由变化
4wIndex2根据请求的不同,该含义会由变化
6wLenght2指定第二阶段传输数据的长度,0表示没有数据传输阶段
bmRequestType(1)bRequest(1)wValue(2)wIndex(2)wLength(2)数据过程
0x00CLEAR_FEATURE(1)特性选择00没有数据
0x01CLEAR_FEATURE(1)特性选择接口号0没有数据
0x02CLEAR_FEATURE(1)特性选择端点号0没有数据
0x80GET_CONFIGURATION(8)001配置制
0x80GET_DESCRIPTOR(6)描述符类型(高字节)和描述符索引(低字节)0或语言ID(字符串描述符)描述符的长度描述符
0x81GET_INTERFACE(10)0接口号1备用(转换)接口
0x80GET_STATUS(0)002设备状态
0x81GET_STATUS(0)0接口号2接口状态
0x82GET_STATUS(0)0端点号2端点状态
0x00SET_ADDRESS(5)设备地址00没有数据
0x00SET_CONFIGURATION(9)配置值00没有数据
0x00SET_DESCRIPTOR(7)描述符类型(高字节)和描述符索引(低字节)0或语言ID(字符串描述符)描述符的长度描述符
0x00SET_FEATURE(3)特性选择00没有数据
0x01SET_FEATURE(3)特性选择接口号0没有数据
0x02SET_FEATURE(3)特性选择端点号0没有数据
0x01SET_INTERFACE(11)备用接口号(转换接口号)接口号0没有数据
0x82SYNCH_FRAME(12)0端点号2帧号

参考

USB 标准请求 - USB中文网 (usbzh.com)

USB初学 – 入门篇 (USB基础知识速览) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决.gitignore无效的问题

git 总提交乱七八糟的文件,改了gitignore无效,是git 缓存问题 清空git缓存 git rm -r --cached . git add . git commit -m ‘update .gitignore’ 读了下git文档,才发现,这些东西其实很简单,很容易理解。cached其实…

java八股文面试[JVM]——JVM内存结构2

知识来源: 【2023年面试】JVM内存模型如何分配的_哔哩哔哩_bilibili

Python文本终端GUI框架详解

今天笔者带大家,梳理几个常见的基于文本终端的 UI 框架,一睹为快! Curses 首先出场的是 Curses。 Curses 是一个能提供基于文本终端窗口功能的动态库,它可以: 使用整个屏幕 创建和管理一个窗口 使用 8 种不同的彩色 为程序提供…

计算机竞赛 基于Django与深度学习的股票预测系统

文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于Django与深度学习的股票预测系统 ** 该项目较为新颖,适合作为竞赛课题方向&#xff…

TypeScript配置-- 1. 新手处理TS文件红色波浪线的几种方式

Typescript 规范化了JS的项目开发,但是对一些项目的一些新手来说,确实是不怎么优好,譬如我:将我之前珍藏的封装JS代码,拿进了配置了tsconfig.json的vue3项目,在vscode下,出现了满屏的红色 &…

HTML总结2 [转]

以下转载和参考自&#xff1a;HTML 表单。 1、表格 可以通过 CSS 设置表格的样式&#xff1a; 如下为将上面table.lamp th,td样式中的padding注释掉&#xff0c;开启table.lamp中的padding的效果&#xff1a; 2、列表 3、导航栏 导航栏使用<ul>列表实现&#xff0c;…

iptables教程

iptables netfilter/iptables&#xff08;简称iptables&#xff09;是与2.4.x和2.6.x系列版本Linux内核集成的IP信息包过滤系统。 Iptables Tutorial 1、表和链 1.1、表 iptables会根据不同的数据包处理功能使用不同的规则表。它包括如下五个表&#xff1a;filter、nat和m…

table,设置 数据相同时, 合并列

<el-table :data"tableData" :span-method"objectSpanMethod" border style"width: 100%" show-summary><el-table-column type"index" label"序号" width"100" /><el-table-column prop"dat…

C语言练习题解析:挑战与突破,开启编程新篇章!(2)

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言刷题专栏&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

加密的PDF文件,如何解密?

PDF文件带有打开密码、限制编辑&#xff0c;这两种密码设置了之后如何解密&#xff1f; 不管是打开密码或者是限制编辑&#xff0c;在知道密码的情况下&#xff0c;解密PDF密码&#xff0c;我们只需要在PDF编辑器中打开文件 – 属性 – 安全&#xff0c;将权限状态修改为无保护…

JDBC连接

JDBC连接 加载JDBC驱动程序打开JDBC连接 打开带有URL的连接使用URL、用户和密码打开连接使用URL和属性打开连接 关闭JDBC连接 通过Try With Resources关闭连接 setAutoCommit()commit()rollback()createStatement()prepareStatement()getMetaData() JDBC连接类java.sql.Conne…

100天精通Golang(基础入门篇)——第19天:深入剖析Go语言中方法(Method)的妙用与实践

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to Golang Language.✨✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1…

【SQL】关系模型与查询和更新数据

一、关系模型 1.1 主键 主键是关系表中记录的唯一标识。主键的选取非常重要&#xff1a;主键不要带有业务含义&#xff0c;而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。 可以使用多个列作为联合主键&#xff0c;但联合主键并不常用。 1.2 外键 FOREIGN KEY …

剪绳子c、c++实现

给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长的 m 段&#xff08; m 、 n 都是整数&#xff0c; n > 1 并且 m > 1 &#xff0c; m < n &#xff09;&#xff0c;每段绳子的长度记为 k[1],...,k[m] 。请问 k[1]*k[2]*...*k[m] 可能的最大乘积是多少&#x…

函数(个人学习笔记黑马学习)

1、函数定义 #include <iostream> using namespace std;int add(int num1, int num2) {int sum num1 num2;return sum; }int main() {system("pause");return 0; } 2、函数的调用 #include <iostream> using namespace std;int add(int num1, int num2…

【DRONECAN】(三)WSL2 及 ubuntu20.04 CAN 驱动安装

【DRONECAN】&#xff08;三&#xff09;WSL2 及 ubuntu20.04 CAN 驱动安装 前言 这一篇文章主要介绍一下 WSL2 及 ubuntu20.04 CAN 驱动的安装&#xff0c;首先说一下介绍本文的目的。 大家肯定都接触过 ubuntu 系统&#xff0c;但是我们常用的操作系统都是 Windows&#x…

C++------map和set的使用

文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器 什么是关联式容器&#xff1f;它与序列式容器有什么区别&#xff1f; 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key&#xff0c;value>结…

【拾枝杂谈】从游戏开发的角度来谈谈原神4.0更新

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;结合最近的学习内容和以后自己的目标&#xff0c;今天又开了杂谈这个新坑&#xff0c;分享一下我在学习游戏开发的成长和自己的游戏理解&#xff0c;当然现在还是一枚…

【LeetCode75】第三十九题 二叉树的右视图

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一棵二叉树&#xff0c;让我们返回站在二叉树右边从上到下看到的节点。 那实际上就是要我们对二叉树进行层序遍历&#xff0c…

js判断对象是否为空对象的方法总结

js判断对象是否为空对象的方法总结 方法1&#xff1a;JSON.stringify()方法方法2&#xff1a;for in方法方法3&#xff1a;Object.keys()方法方法4&#xff1a;Object.getOwnPropertyNames()方法方法5&#xff1a;jquery 的 isEmptyObject()方法 在面试或者开发过程中&#xff…