嵌入式通信协议

协议概述

协议UARTSPII2C
总线3(RX、TX、GND)4(CS、CLK、MOSI、MISO)4(VCC、GND、SCL、SDA)
同/异步异步同步同步
全/半双工全双工全双工半双工
传输速度
应用场景板内/间板内(不同芯片之间)板内
模式一对一一对多一对多/多对多
一主多从实现X各CS地址

协议

一个完整的硬件产品是由多种模块组合实现产品功能的,微控制器 MCU 充当大脑,外围的存储单元、显示单元、发声单元、传感器单元、运动单元等等是其躯干和四肢,而不同类型的硬件单元需要有机的结合起来,就离不开相互之间的数据通信,电子工业经过了百余年的发展,衍生出了繁多的协议,其中既有行业公认的标准协议,也有企业自研的内部标准,这些协议通常可以分为并行通信协议和串行通信协议。

通信方式

数据的传输方式可以分为:并行通信,串行通信

数据流的传输方向可以分为:全双工、半双工、单工

根据接收端和发送端时钟频率的异同又可分为:同步通信和异步通信

  1. 并行通信,在同一时刻发送多位数据(可以是多根线)。优点是发送速度快;缺点是传输距离短 资源占用多

  2. 串行通信,用一根线 在不同的时刻发送8位数据。优点是传输距离远 占用资源少;缺点是发送速度慢

  3. 单工通信 只能接受或者发送 收音机 遥控器,一般只有一根线

  4. 半双工通信 在同一时刻只能发送或者接收 对讲机,至少有两根线

  5. 全双工通信 在同一时刻 既能接收又能发送 电话,至少有两根线

请添加图片描述

UART协议

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。采用全双工通信。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。

在这里插入图片描述

通信原理

计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。

UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。
在这里插入图片描述

其中各位的意义如下:

  1. 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
  2. 资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
  3. 奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
  4. 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
  5. 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
  6. 波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就是120baud,比特率是120*8=960BIT/S。

总结

异步全双工通信

优点

  1. 只使用两根电线
  2. 不需要时钟信号
  3. 有校验位进行错误检测;

缺点

  1. 数据帧的大小限制为最多9位,不支持多个从属或多个主系统,每个UART的波特率必须在10%之内
  2. 传输速率比较低

SPI协议

SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI是一种高速的、全双工同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今主流的微控制器都集成有spi接口,如 stm32 家族。

通信原理

SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。

  • SDI – SerialData In,串行数据输入;
  • SDO – SerialDataOut,串行数据输出;
  • SCLK – Serial Clock,时钟信号,由主设备产生;
  • CS – Chip Select,从设备使能信号,由主设备控制。

在这里插入图片描述

其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。

接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。

请添加图片描述

SCLK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCLK时钟线的控制可以完成对通讯的控制。

通过逻辑分析仪采集 spi 总线数据,可以看到四个通道的波形变化,判断信号的时钟周期、时钟相位和极性,并能够解码获取实际传输的数据和指令。

SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。

总结

优点

  1. 同步全双工通信
  2. 支持主从、
  3. 数据传输速率较高

缺点

没有指定的流控制,没有应答机制确认是否接收到数据。

I2C协议

I2C(Inter-Integrated Circuit)是一种串行通信协议,用于连接在同一电路板上的集成电路(IC)。它是一种简单且广泛应用的通信协议,允许多个设备在同一总线上进行通信。

半双工通信: I2C是一种半双工通信协议,意味着数据可以在主设备和从设备之间双向传输,但不能同时进行。

硬件连接

物理I2C接口有两根双向线,**串行时钟线(SCL)串行数据线(SDA)**组成,可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输

请添加图片描述

通信过程

写操作

  1. 主芯片要发出一个 start 信号
  2. 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写, 0 表示写, 1 表示读)
  3. 从设备回应(用来确定这个设备是否存在),然后就可以传输数据
  4. 主设备发送一个字节数据给从设备,并等待回应
  5. 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然
  6. 后再传输下一个数据。
  7. 数据发送完之后,主芯片就会发送一个停止信号。

下图:白色背景表示"主→从",灰色背景表示"从→主"

在这里插入图片描述

主机发起通信请求,发出一个设备地址(每个从机都会有主机分配得设备地址),表示需要进行读(1)/写(0)操作。

从机回应请求,表示自身可以接受数据。

主机开始发送一个字节数据,从机回应,主机发送,从机回应,直到主机发出结束信号

读操作

  1. 主芯片要发出一个 start 信号
  2. 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写, 0 表示写, 1 表示读)
  3. 从设备回应(用来确定这个设备是否存在),然后就可以传输数据
  4. 从设备发送一个字节数据给主设备,并等待回应
  5. 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然
  6. 后再传输下一个数据。
  7. 数据发送完之后,主芯片就会发送一个停止信号。

下图:白色背景表示"主→从",灰色背景表示"从→主

在这里插入图片描述

主机发起通信请求,发出一个设备地址(每个从机都会有主机分配得设备地址),并表示需要进行读(1)/写(0)操作。

从机回应请求

从机开始发送一个字节数据,主机回应,从机发送,从机回应,直到主机发出结束信号

I2C 信号

I2C 协议中数据传输的单位是字节,也就是 8 位。但是要用到 9 个时钟:前面 8 个时钟用来传输 8 数据,第 9 个时钟用来传输回应信号。传输时,先传输最高位(MSB)。

  1. 开始信号( S): SCL 为高电平时, SDA 山高电平向低电平跳变,开始传送数据。
  2. 结束信号( P): SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
  3. 响应信号(ACK):接收器在接收到 8 位数据后,在第 9 个时钟周期,拉低 SDA
  4. SDA 上传输的数据必须在 SCL 为高电平期间保持稳定, SDA 上的数据只能在SCL 为低电平期间变化

I2C 协议信号如下

在这里插入图片描述

协议细节

如何在 SDA 上实现双向传输?

主芯片通过一根 SDA 线既可以把数据发给从设备,也可以从 SDA 上读取数据,连接 SDA 线的引脚里面必然有两个引脚(发送引脚/接受引脚)。

主、从设备都可以通过 SDA 发送数据,肯定不能同时发送数据,怎么错开时间?

在 9 个时钟里:
前 8 个时钟由主设备发送数据的话,第 9 个时钟就由从设备发送数据;
前 8 个时钟由从设备发送数据的话,第 9 个时钟就由主设备发送数据。

双方设备中,某个设备发送数据时,另一方怎样才能不影响 SDA 上的数据?

设备的 SDA 中有一个三极管,使用开极/开漏电路(三极管是开极, CMOS管是开漏,作用一样),如下图:

总结

优点

  1. 串行半双工通信
  2. 支持多主机多从机
  3. 有应答机制

缺点:

速率比SPI慢

SMBus 协议

SMBus 是 I2C 协议的一个子集

SMBus 与 I2C 协议的差别

VDD 的极限值不一样

  1. I2C 协议:范围很广,甚至讨论了高达 12V 的情况
  2. SMBus: 1.8V~5V

最小时钟频率、最大的 Clock Stretching

  1. Clock Stretching 含义:某个设备需要更多时间进行内部的处理时,它可以把 SCL 拉低占住 I2C 总线
  2. I2C 协议:时钟频率最小值无限制, Clock Stretching 时长也没有限制
  3. SMBus:时钟频率最小值是 10KHz, Clock Stretching 的最大时间值也有限制

地址回应(Address Acknowledge): 一个 I2C 设备接收到它的设备地址后,是否必须发出回应信号

  1. I2C 协议:没有强制要求必须发出回应信号
  2. SMBus:强制要求必须发出回应信号,这样对方才知道该设备的状态:busy, failed,或是被移除了

SMBus 协议明确了数据的传输格式

  1. I2C 协议:它只定义了怎么传输数据,但是并没有定义数据的格式,这完全由设备来定义
  2. SMBus:定义了几种数据格式(具体参照pdf文档)

REPEATED START Condition (无需重复发出 S 信号,i2c:需要发出 P 信号停止后,重新发起 S 信号)

  1. 比如读 EEPROM 时,涉及 2 个操作:把存储地址发给设备、读数据

  2. 在写、读之间,可以不发出 P 信号,而是直接发出 S 信号:这个 S 信号就是REPEATED START,

    如图所示
    在这里插入图片描述

SMBus Low Power Version: SMBus 也有低功耗的版本

使用建议

因为很多设备都实现了 SMBus,而不是更宽泛的 I2C 协议,所以优先使用SMBus。即使 I2C 控制器没有实现 SMBus,软件方面也是可以使用 I2C 协议来模拟 SMBus。所以: Linux 建议优先使用 SMBus

参考

嵌入式Linux应用开发完全手册V5_IMX6ULL_Pro开发板.pdf

常见硬件通信(SPI、I2C、CAN、USB、UART)协议介绍 - 知乎 (zhihu.com)

UART、I2C、SPI的优缺点和区别_spi uart i2c优缺点_昇柱的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值