加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

USB的通信方式(四)

2020/08/22
1134
  • 1评论
阅读需 8 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

今天,鱼鹰再介绍一下 USB 是如何通信的,即如何通过两根数据线完成通信呢(也就是上图中的最底层通信)?

USB 通信格式

前面简单提到过,USB 接口最少有四根线连接,其中有两根是数据线,而所有的 USB 数据传输都是通过这两根线完成的,那么它是怎么做到的?

我们知道,串口为了实现通信,规定了起始位、停止位,有时候也可能增加奇偶校验位,如果你知道了串口的波特率,那么你就可以正确的接收到发送方发来的数据。

那么 USB 应该也有相应的通信格式要求才对,那么它的格式是怎么样的?

因为 USB 通信远比串口复杂的多,所以本节内容不会面面俱到,更多的是为后面的学习提供基础,因此有些内容不会展开描述,感兴趣的可以查找相应的资料学习。

串口中高电平代表 1,低电平代表 0,并且是全双工通信,即可以同时发送和接收数据。

而 USB 有所不同,它虽然也有两根数据线,但它们却是采用差分传输,即需要两根数据线配合才能传输一个 bit,因此是半双工通信,同一时间只能发送或者接收。

首先我们需要了解一下差分 0 和差分 1 这两种状态:

差分 1:数据线 D+ 为高电平, D- 为低电平时为差分 1;

差分 0:数据线 D+ 为低电平, D- 为高电平时为差分 0。

但是要注意的是,这里的差分 0、差分 1 可不是代表数据 0 和 1,而仅仅只是数据线表现的状态,和真正的数据还有距离。

USB 规定,如果电压电平不变,代表逻辑 1;如果电压电平变化,则代表逻辑 0,这就是 NRZI (Non-Return-to-Zero Inverted Code)编码(关于这个编码感兴趣的可以看次条文章)。

看下图进行理解:

USB 不通信时,数据线处于闲置状态(类似于串口的高电平闲置),一旦需要开始通信,首先切换到 K 状态(类似串口的起始位),再进行实际的数据传输,在这里传输的数据为 000011,实际的数据线状态为差分 101000,传输完毕后需要发送结束信号 EOP:2 位的 SE0,再加 1 位的 J 状态(类似串口的停止位)。

这里只是简单的说明,实际上的数据传输比这个还要复杂一些,但大体是一致的(上述可能会有误,毕竟鱼鹰没有使用示波器查看过,通过资料进行理解的)。

并且需要注意的是,上述描述的闲置状态和 J、K 等状态和设备类型有关,即全速设备和低速设备这些状态的定义不同(这个可能和设备数据线的上拉电阻位置相关)。

(来源于 cypress  AN57294)

采用 NRZI 编码的好处是可以不需要时钟线进行同步,但是为了实现准确的采样,需要两个条件:

1、数据传输前需要发送同步域(SYNC),这个域固定为 0000 0001,通过 NRZI 编码后就是一串方波信号,接收者可以通过方波信号确定采样率(可以认为是串口的波特率)。

2、因为数据中有大量的 0,可以让接收者通过信号的变化不断调整采样频率,但是如果刚好数据中没有 0 怎么办?

一旦有大量的 1 存在于数据线上,那么数据线的电平将长时间不会发生变化,也就无法进行速率的同步,一旦接收者和发送者各自的时钟频率存在误差,那么很可能因为长时间没有电平变化而导致采样失败(误差长时间累积),所以  bit-stuffing 出现了,即所谓的强制插 0。

USB 规定,如果有 7 个连续的逻辑 1 ,需要在第 6 个 1 之后插入一个逻辑 0 来实现位填充,这样 D+和 D- 就会发生变化,从而让接收者实现时钟同步。

在接收时,只要将 6 个逻辑 1 后的 0 删除就可以恢复数据。

(来源于 cypress  AN57294)

可以看到,6 个连续的 1 之后强制插入了一个 0 进去,这样即使接收方和发送方各自的时钟存在误差,也可以通过信号的变化实时同步,从而准确的进行采样。

以上内容就是 USB 为什么只需要两根线就能进行快速进行数据传输的关键。

USB 数据包

下面再来聊聊数据包:

前面这张图介绍了如何通过 USB 数据线传输 000011 数据,事实上在 USB 中,所有的数据都是以包(Packet)的形式进行传输的,而数据包是有一定的格式,也就是说,为了传输 00011,需要按照包的格式才能正确传输。
数据包有如下组成部分:

(来源于 ST 资料)

首先是 SOP(即从闲置状态到 K 状态),然后是 SYNC,即前面提到的同步域,用于接收方的时钟同步,其次才是我们需要传输的数据内容,最后是 EOP(2 位 SE0,1 位 J 状态)。

如此,你的数据(PacketContent)才能被接收方正确接收。

数据包分为四大类:

令牌 (Token) Packet

帧首 (Start of Frame) Packet

数据 (Data) Packet

握手 (Handshake) Packet

每一类又可能分为多种具体的数据包,比如令牌包分为 OUT、IN、SETUP 等数据包,

每一类中的 Packet Content 内容可能是不一样的,比如:

令牌 (Token) Packet

(灰色部分代表不存在)

帧首 (Start of Frame) Packet

(灰色部分代表不存在)

数据 (Data) Packet

(灰色部分代表不存在)

握手(Handshake) Packet

(灰色部分代表不存在)

为什么要缺斤少两呢?或许和数据包的功能有关,毕竟有些内容在有些包中是不需要存在的,那为什么还要加入传输增加总线的负担呢。

以上具体的内容可以查看鱼鹰提供的资料,比如 CRC 是怎么计算的,帧号里面的内容是怎样的?

对于软件开发而言,我们可以不必关心这么多,只要我们能正确的从相关寄存器中获取我们想要的数据即可,也就是我们需要知道当前令牌是什么,传输的数据是什么就可以了,其他的可以在学完整个 USB 后自行深入了解。

下一章节,鱼鹰将介绍 USB 的四大传输,即控制、中断、同步、批量传输,同时介绍四大传输和数据包的关系,半双工的通信是如何工作的。

敬请期待!

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
5015680207 1 Molex Board Connector, 2 Contact(s), 1 Row(s), Male, Right Angle, 0.039 inch Pitch, Surface Mount Terminal, Locking, Natural Insulator, ROHS AND REACH COMPLIANT

ECAD模型

下载ECAD模型
$0.96 查看
DF11-4DP-2DSA(08) 1 Hirose Electric Co Ltd Board Connector, 4 Contact(s), 2 Row(s), Male, Straight, 0.079 inch Pitch, Solder Terminal, Locking Mech, Black Insulator, Receptacle,

ECAD模型

下载ECAD模型
$0.14 查看
39-28-1063 1 Molex Rectangular Power Connector, 6 Contact(s), Male, Solder Terminal, Plug, LEAD FREE

ECAD模型

下载ECAD模型
$0.77 查看

相关推荐

电子产业图谱

六年开发经验,丰富的KEIL调试经验,STM32使用经验,C语言运用经验。