stm32 USB知识分析(二)——通信协议的基础概念

stm32 USB知识和代码分析(二)——通信协议的基础概念

  • 如果知乎和CSDN无法查看图片,欢迎来到我的博客
  • 本系列是查看大佬帖子,再结合自身理解所写
  • 大佬帖子(https://blog.csdn.net/qq_40088639/article/details/109462408)
  • 承接上一帖stm32 USB知识和代码分析(一)

1.包,事务,传输总述—今天的主角

  • 开始学习时一直摸不清他们之间的关系,又到底是啥一头雾水。
  • USB中,在通信协议上有以下划分,分为包,事务,传输。包是传输的基本单元,多个包构成一个事务,多个事务构成一个传输,也就是说:包<事务<传输
  • 如下图:一个传输分为了三个事务,一个事务又分为三个包。
    stm32 USB知识分析(二)——通信协议的基础概念_第1张图片
  • 博客中的这种图也是一样的,如下:多个包构成事务,多个事务构成传输
    stm32 USB知识分析(二)——通信协议的基础概念_第2张图片

2.包相关知识

  • 包是USB中通信的基本单元,最小的构成单位,其又分为三种类型的包:令牌(Token)包、数据(DATAx)包、握手(Ack)包每一种类型包里有几个字段表示信息,但所有的包都以同步域SYNC开始,以包结束信号EOP作为结束作为标记。包的结构如下:
  • 虽然每种包里的字段信息都不太相同,但都主要包含以下几种信息
  1. 包标识符(PID):用于标记包的类型
  2. 包目标地址(ADDR): USB下的每个设备都有自己地址,主机发送包时会在USB总线上广播,设备会检查该包的目标地址是否是发给自己的,暂可理解为网络中的IP地址。
  3. 包目标端点(ENDP):USB设备和USB主机之间是通过端点来发送数据的。因此在总线上传输的每一个数据包都要指定,发送数据包的目标端点(数据包要发到哪一个设备的哪一个端点上),暂可类比网络中的端口,IP+端口
  4. 数据域:包中携带的数据咯,支持0~1024字节,但在不同情况下,最大长度可能小于1024字节,由很多因素决定的
  5. 循环冗余校验码(CRC):USB协议规定,只有令牌包和数据包有循环冗余校验码,令牌包使用5位的CRC5,数据包使用的是16位的CRC16校验。

2.1 令牌包(三种类型包的一种)

  • 令牌包又分为四种:SETUP令牌包、IN令牌包、OUT令牌包、SOF令牌包先别晕!先看着,我后面画张图将这些概念都串起来就一目了然了,其中SETUP、IN、OUT令牌包的结构是一样的,共有6个字段格式如下:
    stm32 USB知识分析(二)——通信协议的基础概念_第3张图片
  • SOF令牌包的功能比较特殊,其名为帧起始包(Start Of Frame),在USB的拓扑结构中,主机每隔一段时间就向总线上广播SOF包,所有的连到总线上的全速设备和高速设备都能收到SOF包。在STM32中,SOF的感知不强,我也不懂~
  • SOF

说明:
(这个看不懂先不管没关系,先往后看,知识点穿插交错,以后回来看就懂了)

① 设备枚举阶段使用的是控制传输,控制传输的建立事务(建立过程)使用的是SETUP令牌包(只有控制传输才会有SETUP令牌包),设备的端点0是专门用于控制传输的,所以包目标端点ENDP为0,包目标地址ADDR可以是0或者非0值[1~127]。
② 设备使用地址0时,CRC5的值是0x08;设置地址阶段过后,CRC5的值根据具体的地址值来进行计算,CRC5的计算由USB控制器自动完成。
③ SETUP令牌包中包含了紧跟在其后面的数据包的目标地址和包目标端点信息。
④ 4个令牌包中,只有SOF令牌包之后不跟随数据传输。
⑤ 对于低速/全速设备,SYNC为:0000 0001;而对于高速设备,SYNC中有31个0,最后一个位是1。

2.2 数据包

  • USB1.1协议中,只有两种数据包:DATA0 和 DATA1。USB2.0新增了两个数据包:DATA2和MDATA分别用于高速分裂事务(split)事务和高速带宽同步传输中,DATA0和DATA1是需要关注的重点。
    stm32 USB知识分析(二)——通信协议的基础概念_第4张图片

说明:
① 建立事务的数据过程使用的是DATA0数据包(SETUP事务的数据过程只能使用DATA0),DATA0数据包是8字节的请求数据。
② IN事务或者OUT事务的数据过程使用的是DATA1数据包,是实际要交互的数据。
③ 端点0传输的数据包就在DATA0和DATA1之间进行切换,这是实现设备栈时,为什么配置USB控制芯片端点的toggle功能的原因。
④ 数据包是跟随在令牌包后面的,数据包传输的目标地址和端点信息已经在令牌中指明

2.3 握手包

  • 握手包分为:ACK握手包、NAK握手包、STALL握手包、NYET握手包、ERR握手包,每种类型的PID(包类型标记)不相同以此区别,其是一种状态反馈数据,握手包是接收方给发送方返回的状态,这样发送方可以知道接收方的当前状态。
    握手包
    说明:
    ① 握手包跟随在令牌包或者数据包之后,组成一次完整的事务。
    ② 握手包可以由设备发出也可以由主机发出。
    ③ 握手包的方向和数据包的方向是相反的。

3.事务

  • 还记得由多个包组成事务吧,其一般由令牌包+数据包+握手包令牌包+握手包组成,现在我们就可以模拟USB简单的通信过程了
  • 首先明确几个前提知识
  1. USB总线上所有的事务(数据流传输)都是USB 主机先发起的
  2. 令牌包分为SETUP,IN,OUT,SOF包
  3. 每个事务都是由主机发送令牌包开始的!

3.1 SETUP事务

  • 以SETUP令牌包起始的,称为SETUP事务,现在模拟一个简单的过程。
  • 假设USB主机想设备信息,USB主机和设备都是两个人,主机想知道设备的信息
    stm32 USB知识分析(二)——通信协议的基础概念_第5张图片
  1. USB主机—>设备: “准备下发命令,需要你的信息或者要你干活(SETUP令牌包)”
  2. USB主机—>设备:“我要你户口本,听到了吗?(数据包)”
  3. 设备—>USB主机:“好的,收到!(ACK确认包)”
  • 为什么USB主机不在第一条SETUP令牌包就把话说完呢?
  • 机器通信和人之间交流不一样,人与人对话时,口,耳,眼同时工作配合,和对方说话时,眼睛可观察对方是否在听,耳和口也同时在工作,但机器不行。协议协议嘛,就是规范流程,好吧,我是在胡扯,我也不知道

这时候,设备知道主机想获取自己的身份


3.2 IN事务

stm32 USB知识分析(二)——通信协议的基础概念_第6张图片

  • 承接SETUP事务:
  1. USB主机—>设备:“收数据了!有数据就赶快发我”
  2. 设备—>USB主机:“有,这是你上次想要的我的户口本信息,简历文件”
  3. USB主机—>设备:“好,收到了”
  • IN事务:以IN令牌包开头,表示USB主机想接收数据,设备知道后会将数据发送给USB主机

3.3. OUT事务

stm32 USB知识分析(二)——通信协议的基础概念_第7张图片

  • 承接OUT事务
  1. USB主机—>设备:“我准备发你数据,准备接收哦”
  2. USB主机—>设备: “原来你是USB2.0,接下来按照这个文件做事吧”
  3. 设备—>USB主机:“收到”
  • 以OUT令牌包起始,为OUT事务:表明USB主机想发送数据。

3.4 问题

  • 不知道我类比的有没有问题,别人能不能懂。后面会结合USB主机获取设备描述的流程再说一遍的。
  • USB主机是如何知道设备有数据发送的呢?
    从上面的列子可知,是需要USB主机发送IN令牌包,设备才可以发送数据,USB主机怎么知道设备有数据要发呢?IN令牌包又会在什么时候发出呢?这是我开始学习的一个困惑。其实问题很简单,USB主机每间隔一小段时间就主动发送IN令牌包。这一点很重要,这意味着,设备能以什么速度发送数据,与IN令牌包发送间隔时间有重大关系,这与USB提速有关。
  • 如果通信过程出现数据丢失,丢包问题,怎么处理?
    如果一个事务最后的确认包没有传输成功,或者确认包中的接收状态有问题,该事务作废,将重新走一次流程。
  • 列子中都有数据包的传输,事务中数据包传输是一定会有的吗?
    不是,在SETUP事务中,有些场景是可以没有数据包传输。
  • 至此事务就讲完了:

4. 传输

  • 上面举的三个列子中,一个列子就是一个事务,多个事务就构成一次传输,在传输的层面上,有几种类型
  • 控制(Control)方式传输
  • 同步(isochronous)方式传输
  • 中断(interrupt)方式传输
  • 大量(bulk)传输
  • 我的理解是:类似与网络的7层模型,传输层有自己的协议(TCP,UDP),数据链路层也有自己的协议(ARP),不同层面上有不同的协议,而上面的传输类型属于传输层面的协议。不同的传输类型有不同的特点和试用场景,以及更具体的流程,后面再单独一贴,有得说了.

5. 实列:USB主机获取设备描述符

  • 在USB中,USB的设备有这非常多描述符信息,这些描述符记录着设备方方面面的信息,就是设备自己的简历或者户口本,通常设备接入USB总线后,USB主机会请求设备的描述符,下面就是一个具体的列子,实列,结合上面的列子和知识点,相信你也看得七七八八基本都懂。
    stm32 USB知识分析(二)——通信协议的基础概念_第8张图片
  • 第一行:Transfer:表示这图是一次传输,树形目录结构:bRequeset:Get_Descriptor:这次传输是为了获得设备描述符,后面还有些字段,后面帖子再讲
  • Transaction: 事务:后有写是什么事务:SETUP事务,IN事务,OUT事务
  • Packet:包,后面带有向下/上的箭头表示数据方向,向下:主机发设备,向上:设备发主机
  • 设备描述符在第八行,Packer(4486)的Data段(18字节)
    其实它和我举的例子是一样的,相信你一定可以看懂的(我写得太累了)

6.后续

  • 目前所讲的都是USB的理论知识,还没有设计STM32的USB代码,但是我认为理论是非常重要的。理论讲得差不多后,会结合STM32的代码的
  • 我是小白,真小白,写博客能让自己发现问题,写上自己的理解,检略知识,仅供查看哦~有错误,也请在评论区写出,让更多人看到!
    没有设计STM32的USB代码,但是我认为理论是非常重要的。理论讲得差不多后,会结合STM32的代码的
  • 我是小白,真小白,写博客能让自己发现问题,写上自己的理解,检略知识,仅供查看哦~有错误,也请在评论区写出,让更多人看到!

你可能感兴趣的:(工作,STM32,usb,stm32,协议栈)