协议概述
协议 | UART | SPI | I2C |
---|---|---|---|
总线 | 3(RX、TX、GND) | 4(CS、CLK、MOSI、MISO) | 4(VCC、GND、SCL、SDA) |
同/异步 | 异步 | 同步 | 同步 |
全/半双工 | 全双工 | 全双工 | 半双工 |
传输速度 | 低 | 高 | 中 |
应用场景 | 板内/间 | 板内(不同芯片之间) | 板内 |
模式 | 一对一 | 一对多 | 一对多/多对多 |
一主多从实现 | X | 各CS | 地址 |
协议
一个完整的硬件产品是由多种模块组合实现产品功能的,微控制器 MCU 充当大脑,外围的存储单元、显示单元、发声单元、传感器单元、运动单元等等是其躯干和四肢,而不同类型的硬件单元需要有机的结合起来,就离不开相互之间的数据通信,电子工业经过了百余年的发展,衍生出了繁多的协议,其中既有行业公认的标准协议,也有企业自研的内部标准,这些协议通常可以分为并行通信协议和串行通信协议。
通信方式
数据的传输方式
可以分为:并行通信,串行通信
数据流的传输方向
可以分为:全双工、半双工、单工
根据接收端和发送端时钟频率的异同
又可分为:同步通信和异步通信
-
并行通信,在同一时刻发送多位数据(可以是多根线)。优点是
发送速度快
;缺点是传输距离短 资源占用多
。 -
串行通信,用一根线 在不同的时刻发送8位数据。优点是
传输距离远 占用资源少
;缺点是发送速度慢
。 -
单工通信 只能接受或者发送 收音机 遥控器,一般只有一根线
-
半双工通信 在同一时刻只能发送或者接收 对讲机,至少有两根线
-
全双工通信 在同一时刻 既能接收又能发送 电话,至少有两根线
UART协议
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步
收发传输器,是电脑硬件的一部分。采用全双工
通信。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。
通信原理
计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。
UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。
其中各位的意义如下:
起始位
:先发出一个逻辑”0”的信号,表示传输字符的开始。资料位
:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。奇偶校验位
:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。停止位
:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。空闲位
:处于逻辑“1”状态,表示当前线路上没有资料传送。波特率
:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就是120baud,比特率是120*8=960BIT/S。
总结
异步全双工通信
优点
- 只使用两根电线
- 不需要时钟信号
- 有校验位进行错误检测;
缺点
- 数据帧的大小限制为最多9位,不支持多个从属或多个主系统,每个UART的波特率必须在10%之内
- 传输速率比较低
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设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。
总结
优点
- 同步全双工通信
- 支持主从、
- 数据传输速率较高
缺点
没有指定的流控制,没有应答机制确认是否接收到数据。
I2C协议
I2C(Inter-Integrated Circuit)是一种串行
通信协议,用于连接在同一电路板上的集成电路(IC)。它是一种简单且广泛应用的通信协议,允许多个设备在同一总线上进行通信。
半双工
通信: I2C是一种半双工通信协议,意味着数据可以在主设备和从设备之间双向传输,但不能同时进行。
硬件连接
物理I2C接口有两根双向线,**串行时钟线(SCL)和串行数据线(SDA)**组成,可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输
。
通信过程
写操作
- 主芯片要发出一个 start 信号
- 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写, 0 表示写, 1 表示读)
- 从设备回应(用来确定这个设备是否存在),然后就可以传输数据
- 主设备发送一个字节数据给从设备,并等待回应
- 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然
- 后再传输下一个数据。
- 数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
主机发起通信请求,发出一个设备地址(每个从机都会有主机分配得设备地址),表示需要进行读(1)/写(0)操作。
从机回应请求,表示自身可以接受数据。
主机开始发送一个字节数据,从机回应,主机发送,从机回应,直到主机发出结束信号
读操作
- 主芯片要发出一个 start 信号
- 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写, 0 表示写, 1 表示读)
- 从设备回应(用来确定这个设备是否存在),然后就可以传输数据
- 从设备发送一个字节数据给主设备,并等待回应
- 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然
- 后再传输下一个数据。
- 数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主
主机发起通信请求,发出一个设备地址(每个从机都会有主机分配得设备地址),并表示需要进行读(1)/写(0)操作。
从机回应请求
从机开始发送一个字节数据,主机回应,从机发送,从机回应,直到主机发出结束信号
I2C 信号
I2C 协议中数据传输的单位是字节,也就是 8 位。但是要用到 9 个时钟:前面 8 个时钟用来传输 8 数据,第 9 个时钟用来传输回应信号。传输时,先传输最高位(MSB)。
- 开始信号( S): SCL 为高电平时, SDA 山高电平向低电平跳变,开始传送数据。
- 结束信号( P): SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
- 响应信号(ACK):接收器在接收到 8 位数据后,在第 9 个时钟周期,拉低 SDA
- SDA 上传输的数据必须在 SCL 为高电平期间保持稳定, SDA 上的数据只能在SCL 为低电平期间变化
I2C 协议信号如下
协议细节
如何在 SDA 上实现双向传输?
主芯片通过一根 SDA 线既可以把数据发给从设备,也可以从 SDA 上读取数据,连接 SDA 线的引脚里面必然有两个引脚(发送引脚/接受引脚)。
主、从设备都可以通过 SDA 发送数据,肯定不能同时发送数据,怎么错开时间?
在 9 个时钟里:
前 8 个时钟由主设备发送数据的话,第 9 个时钟就由从设备发送数据;
前 8 个时钟由从设备发送数据的话,第 9 个时钟就由主设备发送数据。
双方设备中,某个设备发送数据时,另一方怎样才能不影响 SDA 上的数据?
设备的 SDA 中有一个三极管,使用开极/开漏电路(三极管是开极, CMOS管是开漏,作用一样),如下图:
总结
优点
- 串行半双工通信
- 支持多主机多从机
- 有应答机制
缺点:
速率比SPI慢
SMBus 协议
SMBus 是 I2C 协议的一个子集
SMBus 与 I2C 协议的差别
VDD 的极限值
不一样
- I2C 协议:范围很广,甚至讨论了高达 12V 的情况
- SMBus: 1.8V~5V
最小时钟频率、最大的 Clock Stretching
- Clock Stretching 含义:某个设备需要更多时间进行内部的处理时,它可以把 SCL 拉低占住 I2C 总线
- I2C 协议:时钟频率最小值无限制, Clock Stretching 时长也没有限制
- SMBus:时钟频率最小值是 10KHz, Clock Stretching 的最大时间值也有限制
地址回应(Address Acknowledge): 一个 I2C 设备接收到它的设备地址后,是否必须发出回应信号
?
- I2C 协议:没有强制要求必须发出回应信号
- SMBus:强制要求必须发出回应信号,这样对方才知道该设备的状态:busy, failed,或是被移除了
SMBus 协议明确了数据的传输格式
- I2C 协议:它只定义了怎么传输数据,但是并没有定义数据的格式,这完全由设备来定义
- SMBus:定义了几种数据格式(具体参照pdf文档)
REPEATED START Condition
(无需重复发出 S 信号,i2c:需要发出 P 信号停止后,重新发起 S 信号)
-
比如读 EEPROM 时,涉及 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