电子通信协议

Mark Walen大约 9 分钟

通信

电子设备之间的通信就像是人与人之间的交流,都需要说相同的语言进行沟通。通信协议就是电子器件(嵌入式)进行通信时使用的语言。当我们构建大多数电子工程项目时,我们需要知道的通信协议很少。在接下来的一系列文章中,我们会讨论几种最基本、最常见的协议:SPI、I2C和UART。

SPI、I2C 和 UART虽然相对于其他通信协议会比较慢,如 USB、Ethernet、Bluetooth 和 WiFi,但是它们非常的简单,而且占用的硬件资源和系统资源非常的少。SPI、I2C 和 UART 非常适合微控制处理器之间的通信,也非常适合当微控制处理与传感器之间不需要传输大量高速数据时的通信。

数据通信的类型

并行通信基础

特征:

  • 并行通信中,所有数据的每一位同时传输在单独的通信线路上。(如果有四位通信线路,那么 2 (0010b) 的每一位就在四根线上同时传输,如图 1.1 所示。)
  • 用于短距离传输
  • n 根线传输 n 位
  • 比串行通信花费的代价更大,但传输速度要更快,数据传输花的时间更少

串行通信基础

特征:

  • 串行通信中,数据只在一根通信线路上传输,所以数据的每一位只能是一位接着一位的传输
  • 将数据从发送方传输到接收方,只需要一根通信线路,而不是 n 根线路
  • 所以数据的每一位都以串行的方式在一根线上传输

串行通信有两种方式:

  • 异步(UART)
    • 一次传输一位
    • 不需要时钟信号
  • 同步(如:SPI、I2C)
    • 一次传输一个数据块
    • 需要时钟信号

双工通信: 数据在传输中,数据可以被传输或接收

单工通信: 数据在传输时使用的是一根通信线路,数据的传输是单向的:发送设备不能接收数据只能发送数据,接收设备也只能用来接收数据而不能发送数据。

半双工通信: 数据在传输时使用的仍然是一根通信线路,但数据传输方向是双向的:通信线路两端的设备即可以是发送设备,也可以是接收设备,但是不能在发送数据的时,又接收数据,因为数据通信线路只有一根。

全双工: 数据在传输时使用的是两根通信线路,数据传输方向是双向的:数据通信线路两端中的任意一端设备接收数据和发送数据可以同时进行

协议: 发送方和接收方都同意的一套规则:

  • 数据是如何打包的
  • 多少个比特构成一个字符
  • 数据什么时候开始和结束
表 1.1 串行通信协议
串行通信协议同步/异步类型双工通信数据传输速率(kbps)
UART异步peer-to-peer全双工20
I2C同步multi-master半双工3400
SPI同步multi-master全双工> 1,000
MICROWIRE同步master/slave全双工> 625
I-WIRE异步master/slave半双工16

波特率的概念 在串行通信中,用每秒传输的比特数(bps)来衡量数据传输的速率,这也被称为波特率。波特率和 bps,相对于 UART,波特率和 bps 可以互换使用。

例: 需要的传输的比特数为 10 页文本,每一页有 100×25100 \times 25 个字符,每个字符有 8 个比特和一个开始位以及停止位:

一个字符共有 10 个比特,那么每页的比特数为 100×25×10=25,000100 \times 25 \times 10 = 25,000. 10 页的数据共有 250000 个比特。通常 SCI 的波特率是 1200,2400,4800,9600,19200 等。当波特率为 9600 时,传输这 250000 个比特,我们需要:2500009600=26.04s  (27s)\frac{250000}{9600} = 26.04s\;(27s)

串行通信接口

串行通信协议分为同步和异步两类。1)在同步通信中,数据的传输和接收是速率恒定的连续流。同步通信要求传输设备的时钟要与接收设备的时钟保持同步。 在大都数系统中,如 ADC、音频编码、电位器,数据的传输和接收以相同的频率发生。同步通信的例子:I2C、SPI 等。2)在异步通信中,数据的传输不需要时钟信号,同时数据的传输是间断的而不是恒定流。在异步通信中,传输设备与接收设备间的挥手信号非常的重要。异步通信的例子:UART、CAN 等。

同步和异步通信协议是定义明确的标准,并且软件和硬件都可以实现。在嵌入式系统早期,I2C 和 SPI 的软件实现很常见,也是一项非常繁琐的工作,并且用于执行较长的程序。渐渐地,大多数微控制器开始将标准通信协议作为硬件核心。90 年代初的这种发展使得嵌入式软件开发的工作更容易用于通信协议。

UART

在 UART 通信中,两个 UART 设备相互之间直接通信。发送 UART 将来自控制设备(如 CPU)的并行数据转换为串行数据,然后将串行数据发送给接收 UART,接收 UART 将串行数据转回并行数据。两个 UART 设备之间的数据传输只需要两根通信线,数据从发送 UART 的 TX 引脚流向接收 UART 的 RX 引脚。

UART 传输数据是异步的,这意味着没有时钟信号将发送 UART 比特的输出与接收 UART 比特的采样同步。发送 UART 在发送数据时,会给数据包添加一个开始和一个结束位来代替时钟信号,开始位和结束位定义了数据包的开始和结束,因此接收 UART 知道什么时候去读取数据。

当接收 UART 监测到一个开始位,它开始以特定频率(波特率)读取传入的比特。两个 UART 必须以大致相同的波特率运行。在位时序偏离太远之前,发送 UART 和接收 UART 之间波特率只能相差 10% 左右。

两个 UART 设备都必须配置传输以及接收相同的数据包结构。

使用的通信线路数2
最大传输速率不超过 115200 baud,通常 9600 baud
同步/异步异步
串行/并行串行
主节点数1
从节点数1

UART 工作原理

UART 发送的数据是从数据总线接收的。数据总线将来自其他设备的数据发送给 UART,如 CPU、内存和微控制处理器。数据总线以并行的方式将数据发送给传输 UART。在传输 UART 接收到来自数据总线的并行数据后,它添加了一个开始位,奇偶校验位和一个停止位,创建了数据包。接下来,数据包 TX 引脚处一位接着一位的串行输出。接收 UART 从它的 RX 引脚处一位接着一位的读取数据,然后将数据转回并行数据并移除开始位、校验位和停止位。最后,接收 UART 将数据以并行数据传输给数据总线。

UART 传输的数据会被组织成包,每个数据包包含:1个开始位、5-9数据位(取决于UART),一个可选的奇偶校验位,1-2个停止位。

开始位

当 UART 数据通信线不传输数据时,通常情况下会保持高电平。为了开始传输数据,传输 UART 将通信线会将高电平拉至低电平一个时钟周期,当接收端 UART 监测到高电平向低电平的变化,它开始以波特率的频率读取数据帧中的比特。

数据帧

数据帧包含实际传输的数据。如果包含奇偶校验位,那么它的长度可以达到 5 个比特或者 9 个比特。如果没有奇偶校验位,数据帧最大是 8 个比特。大多数情况下,数据的发送都是低位优先。

奇偶校验位

奇偶校验位描述了一个数是奇数还是偶数。奇偶校验位是接收 UART 判断数据在传输的过程中是否发送改变的一种方式。数据的位可以通过电磁辐射、波特率不匹配或者长距离数据传输改变。 在接收设备读取数据帧后,它开始统计数据帧中 1 的个数,并检查 1 的总数是奇数还是偶数。如果奇偶校验位是 1,那么数据帧中 1 的个数应该是奇数。数据帧中 1 的个数的奇偶性与奇偶校验位相符时,UART 接收设备就知道传输没有出现错误。但是如果奇偶校验位是 0,总数是奇数,或者奇偶校验位是 1,总数是偶数,UART 就知道数据帧中的比特已经变了。

停止位

停止位标志着数据包的结束。它通常是两位长但经常只有一位被使用。为了结束传输,发送 UART 让数据传输线保持在高电平状态。

UART 传输步骤

  1. 传输 UART 接收来自数据总线的并行数据;
  2. 传输 UART 将开始位,奇偶校验位和结束位添加至数据帧;
  3. 整个数据包由发送 UART串行的传输给接收 UART。接收 UART 以预先配置的波特率对数据线进行数据采样接收;
  4. 接收 UART 丢弃数据帧中的开始位、奇偶校验位和结束位;
  5. 接收 UART 将串行数据转回并行数据并传输到接收端的数据总线。

UART 的优点和缺点

没有通信协议是完美的,但是 UART 很擅长它们需要做的。

优点

  • 只使用两线
  • 不需要时钟信号
  • 有奇偶校验位,允许错误检查。
  • 数据包的结构是可以改变的,只要双方都设置好了
  • 资料多且使用广泛

缺点

  • 数据帧大小被限制为不超过 9 位
  • 不支持多主或多从模式
  • 每个 UART 之间的波特率的差必须在 10% 以内。

UART (通用异步收发器)是与串行通信的专用硬件。UART 的硬件可以是集成在微控制器上的电路或专用 IC。这与只是通信协议的 SPI 或 I2C 不同。

UART 是最简单和最常用的 串行通信技术之一。UART 有许多的应用,如 GPS 接收设备、蓝牙模块、GSM 和 GPRS 调制解调器、无线通信系统、基于 RFID 的应用等。