嵌入式开发中,常见的外设通信接口/协议有SPI,I2C,UART三种,本文先分三个部分对SPI,I2C,UART进行介绍,最后对这三种协议进行比较。
1 SPI
1.1 SPI的简介
SPI(Serial Peripheral Interface):串行外围设备接口。SPI是一种高速的,全双工的,同步的通信总线。SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps,已知的有的器件SPI已达到50Mbps。
1.2 SPI接口的引脚
- MOSI(Master Out Slave In):主设备数据输出,从设备数据输入
- MISO(Master In Slave Out):主设备数据输入,从设备数据输出
- SCLK(Serial Clock):时钟信号,由主设备产生,主从设备共用
- CS/SS(Slave Select):从设备使能信号,由主设备控制,低电平有效
1.3 SPI的工作原理
- SPI通过移位寄存器实现数据的交换
- 每经历一个时钟脉冲,主设备和从设备同时发送或接收一位数据(如上升沿发送数据,下降沿接收数据)。
- 发送数据时,将移位寄存器中的数据左移一位,最高位发送出去;接收数据时,将数据补充到移位寄存器的最后一位
- 当完成指定位数的数据发送或接收后,移位寄存器将数据存放到缓冲器中等待读取
1.4 SPI的四种工作方式
为了和外设进行数据交换,需要根据外设工作要求,设置SPI的时钟极性(CPOL)和时钟相位(CPHA)。CPOL和CPHA决定数据发送和接收的时序(注意:数据总是先发送后接收的)。
- CPOL:时钟极性选择
CPOL = 0 :SPI总线空闲为低电平
CPOL = 1 :SPI总线空闲为高电平 - CPHA:时钟相位选择
CPHA = 0 :无相位延时
CPHA = 1 :1/2个周期的相位延时
下表为SPI的四种工作模式选择
工作模式 | CPOL = 0 | CPOL = 1 |
---|---|---|
CPHA = 0 | 上升沿发送数据,下降沿接收数据 | 下降沿发送数据,上升沿接收数据 |
CPHA = 1 | 下降沿发送数据,上升沿接收数据 | 上升沿发送数据,下降沿接收数据 |
下图为四种工作模式的时序图
?
2 I2C
2.1 I2C的简介
??I2C(Inter Integrated Circuit):内部集成电路。I2C是一种低速的,半双工的,同步的通信总线。IIC 数据传输速率有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps)。
2.2 I2C接口的引脚
- SDA:数据线
- SCL:时钟线
2.3 I2C的工作原理
-
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据
-
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据
-
数据传输:SCL为高电平时,若SDA保持稳定,那么SDA传输一位数据
-
数据改变:SCL为低电平时,SDA线改变想要传输的一位数据
-
应答信号:接收数据的IC在接收到数据后,向发送数据的IC发出特定的低电平脉冲,表示已经收到数据;发送数据的IC在发送数据后,等待接收数据的IC发出应答信号,根据实际情况做出是否继续传递信号的判断(注意:只有应答信号是从设备发送,其他信号都是主设备发送)
2.4 I2C的通信过程
- Master发送START
- Master发送数据,等待ACK
- Slave发送ACK
- Master发送STOP
?
3 UART
3.1 UART的简介
??UART(Universal Asynchronous Receiver/Transmitter):通用异步收发传输器。UART是一种低速的,全双工的,异步的通信总线。UART的数据传输速率有9600bps,115200bps等等。
3.2 UART接口的引脚
- VCC:供电端,若两设备独立供电,则不需要连接
- TX:发送数据端,要接对面设备的RX
- RX:接收数据端,要接对面设备的TX
- GND:保证两设备共地(必须要接)
3.3 UART的传输格式
- 空闲位:当总线处于空闲状态时信号线的状态为高电平
- 起始位:发送一个低电平信号,表示开始传输数据
- 数据位:可以是5~8位的数据,一般都是8位。先发送最低位,最后发送最高位。(I2C和SPI先发送最高位,最后发送最低位)
- 奇偶校验位:数据位传送完成后,要进行奇偶校验。分为无校验,奇校验,偶校验
?- 无校验(no parity)
?- 奇校验(odd parity):如果数据位中'1'的数目是偶数,则校验位为'1',如果'1'的数目是奇数,校验位为'0'
?- 偶校验(even parity):如果数据为中'1'的数目是偶数,则校验位为'0',如果为奇数,校验位为'1'。 - 停止位:数据的结束标志。可以是1位、1.5位、2位的高电平。
下图为UART数据传输格式
4 SPI、I2C、UART的区别与联系
SPI、I2C、UART都是常见的通信协议,目前主流的芯片都内置了这些通讯协议的控制器。同样,各种传感器、蓝牙模块、WIFI模块也都兼容这三种通信方式的一种或几种。我们可以根据外设拥有的通信方式和几种通信方式的特点选择合适的通信方式。
4.1 使用场景
- I2C,SPI主要是CPU与其他芯片(如Flash等)的通信方式
- UART主要是CPU与CPU之间的通信方式
4.2 传输速度
- 同步:低速情况下,使用I2C合适,如果速度快一些,则一般都要使用SPI
- 异步:使用UART传统的传输速度一般在115200bps或以下
4.3 硬件开销
- SPI有4根线,可以挂多个从设备,但是在挂多个从设备时,主设备端还需要做一个n选1的译码器,用于选择将要访问的从设备,因此,主设备上的管脚需求比较多;SPI总线在只有一个从设备时,只要用到SCK,SDO,SDI这三根线,此时选择SPI比I2C总线占优
- I2C有2根线,可以挂多个从设备,对从设备的选择直接依靠协议完成,无需增加物理连线
- 一般情况下,当一块电路板上有多个从设备时,往往选用I2C而非SPI,因为SPI增加了额外硬件开销以及电路板走线