初涉USB,初学者USB入门总结(3) 数据包阐述

2024-03-15 08:18

本文主要是介绍初涉USB,初学者USB入门总结(3) 数据包阐述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于USB传输大体有个概念,下一步就来看看到底USB上传的什么东西,以什么格式传数据,先不涉及端点的概念。
各种总线的数据传输都是以固定的层次协议进行的,USB当然也不例外。所谓的层次也只是个抽象的概念罢了,就是表达一种依附关系,上层要依赖与底层,上层以底层为基础,上层只需要关心自己的东西就行了,如果你还不明白,那就继续看,学习一个东西不可能一两句话说的明白一个点,需要全面了解后才能清楚各个点。
要实现两个机器(机器的范围比较广,可以是电脑,交换机,单片机)的通信总是要有一个载体才可以,对于机器当然是电平高低为载体,具体的说机器甲要告诉机器乙一件事情(比如说一条指令),那么机器甲可以通过一根线(串行数据总线)连到机器乙的一个IO口上,甲发送一个个的高低电平,乙固定时间检测自己的这个 IO口,然后逐个记录下放到自己的缓冲里,这样乙就收到甲送的数据了。上述就是一个简单的数据链路层(计算机网络里这么叫)的描述,这一层要保证的就是甲发的每一位数据,乙都可以正确及时的接受,并且对在传输过程中出错的数据做出反应。其实比数据连路更底层的还有物理层,这就是真正的物理介质,对于机器就是电线了,数据就是电线上传输的电压,USB是用的四线,两个电源,两个数据线。
这里也打个比方,比如人与人进行交流,我们当然是通过说话了,物理层就是空气和传输的声波,数据链路层就是我们说的每一个字,物理层就是空气,负责把我们说的话转换成声波传给对方,数据链路层负责让对方能正确的听到每个字,如果听的不清可以告诉对方重新说一遍。
经过上述的两个底层,就可以保证每一位数据可以正确的传到对方那里去。下一步的工作当然是解析数据代表了什么,一般来说,数据都是以一串数为单位,一般称为一个包,机器间传输都是以一个包为单位传出,就像人们说话都是以一句话为单位输出一样。每一个包包含有许多位数据,这些数据又分段表示不同的意义,如图一,这是一个USB令牌阶段的包,Sync是同步数据(相当于说话时先打个招呼,告诉对方要跟他说话了),PID是包标示(告诉对方这个包是干什么用的),ADDR是对方的地址(叫对方的名字),ENDP是用端点几通讯(先不介绍这个),CRC5是校验位(判断这个包是否在传输中出错),EOP是包结束。
|--------------------------------------------------------|
|   Sync  |  PID  |  ADDR  |  ENDP  |  CRC5  |  EOP      |
|________________________________________________________|

                      图一
USB 的数据包又分为三种,一个是令牌包,一个是数据包,另一个是握手包。每一次的USB通讯事务处理都是以令牌包开头,告诉对方要跟谁说话,这句话是用来干嘛的。如果要求有数据传输,则下一步就是数据包,另外如果要求对方要有反馈,则会发出握手包。令牌包又简单的包括OUT,IN,STEP三种类型,OUT是用于主机告诉设备主机要向USB设备发送数据,IN是用于主机告诉设备要上传数据,而STEUP是用于主机向USB设备发送配置信息,在枚举过程中会用到。另外数据包和握手包的具体格式什么的,可以参照详细的协议。
可以看到在所以的通讯过程中,主机都是发起者,不管是主机发送数据到USB设备还是USB设备发送数据到主机,都必须收主机控制。图二为一次事务的过程
   
        令牌阶段   ——》        数据阶段     ——》     握手阶段

                                图二
这个过程可以这样描述,甲和乙对话,甲是老板,乙是职员。第一节已经讲过了,乙面试就是枚举,在这个过程中,甲多段的发送STEP令牌包给乙,乙收到后如果要反馈数据,就发数据包给甲,甲正确接收后,跟甲握握手,表示这次对话成功。
乙被正式录取后,甲会分派任务(OUT),这时甲对乙说有任务给你(令牌阶段),然后乙就开始听,甲说你的任务就是记录数据并且上报(这段话就是数据包),乙说好的(握手包)。
乙开始正式工作,并且记录数据。过了一段时间,甲开始要求提交数据(IN),乙把数据报告给甲(数据阶段),甲说好(握手成功)。这里乙不能主动的去向老板汇报,只能被动的干活。
上面已经讲USB主机和设备间数据传输的过程,都是我个人理解,有不正确和不到位的大家提出,方便初学者理解,谢谢··

这篇关于初涉USB,初学者USB入门总结(3) 数据包阐述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/811332

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres