SPI通信协议有哪些应用及原理?
扫描二维码
随时随地手机看文章
SPI,Serial Peripheral Interface,串行外围设备接口,是一种同步通信协议,通常用于芯片间进行数据交互。SPI总线通常由四根线组成:时钟线、数据线、主机选择线与从机选择线。本文将介绍SPI通信协议的基本原理和使用场景,并附带示例代码。
一、基本原理
SPI协议是一种全双工协议,其中最多存在一个主设备和多个从设备,主设备通过选择不同的从设备、向其发送数据及接收数据的方式,与多个从设备进行通信。SPI是一种同步通信协议,亦即通过时钟信号的同步作用,实现数据在多个设备之间的传递。
SPI通信一般由四根线(或者五根线)组成:
1. CLK(Clock):时钟信号,规定数据的传输时间。
2. MOSI(Master-Out-Slave-In):主设备发出的数据。
3. MISO(Master-In-Slave-Out):从设备发出的数据。
4. SS(Slave Select):从设备的选择信号,因为SPI可以同时控制多个设备,所以可以使用多个SS线来实现多个从设备的选择。
(5. 全双工模式下,数据输出线为MOSI,数据输入线为MISO,两个设备分别向对方传输数据。)
二、使用场景
SPI是一种非常常见的芯片间通信协议,它的应用场景非常广泛,如:
1. 内部数据传输
无论是芯片内部还是与其他芯片之间的通讯,SPI都能体现出其高效率与高速性。它的主机能同时与多个从机进行数据通信,使得芯片之间的数据交换更为高效。
2. 存储器
常见的存储器芯片,如EEPROM、Flash以及SRAM等均可以使用SPI进行数据的读写。
3. 传感器
SPI协议在很多传感器中也得到广泛应用。比如陀螺仪、加速度计、压力传感器等。
SPI是一种高速、全双工、同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚至超过10M/bps。
SPI是有主从机设备的,主机只允许有一个,从机可以有多个。
SPI通信时需要用到四根线,单向传输时需要用到三根线,即单工模式。它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)和CS/SS(片选)
MISO( Master Input Slave Output):主设备输入从设备输出信号引脚。
MOSI(Master Output Slave Input):主设备输出从设备输入信号引脚。
SCLK(Serial Clock):时钟信号,由主设备产生。
CS/SS(Chip Select/Slave Select):从设备使能信号,由主设备控制,一主多从时,CS/SS是从芯片是否被主芯片选中的控制信号,只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。
SPI的优缺点
优点
无起始位和停止位,因此数据位可以连续传输而不会被中断(根据通信芯片的选择可能有所区别,但SPI通信本身没有硬性的起始位停止位规定);
没有像I2C这样复杂的从设备寻址系统;
数据传输速率比I2C更高(几乎快两倍);
分离的MISO和MOSI信号线,因此可以同时发送和接收数据;
极其灵活的数据传输,不限于8位,它可以是任意大小的字;
非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。
缺点
使用四根信号线(I2C和UART使用两根信号线);
无法确认是否已成功接收数据(I2C应答位拥有此功能);
没有任何形式的错误检查,如UART中的奇偶校验位;
只允许一个主设备;
没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
没有定义硬件级别的错误检查协议;
与RS-232和CAN总线相比,只能支持非常短的距离;
电子设备之间的通信就像人类之间的交流,双方都需要说相同的语言。在电子产品中,这些语言称为通信协议。
之前有单独地分享了SPI、UART、I2C通信的文章,这篇对它们做一些对比。
串行 VS 并行
电子设备通过发送数据位从而实现相互交谈。位是二进制的,只能是1或0。通过电压的快速变化,位从一个设备传输到另一个设备。在以5V工作的系统中,“0”通过0V的短脉冲进行通信,而“1”通过5V的短脉冲进行通信。
数据位可以通过并行或串行的形式进行传输。另外也可以通过此视频了解:视频讲解UART、I2C、SPI串口通信。在并行通信中,数据位在导线上同时传输。下图显示了二进制(01000011)中字母“C”的并行传输:
在串行通信中,位通过单根线一一发送。下图显示了二进制(01000011)中字母“C”的串行传输:
SPI通信
SPI是一种常见的设备通用通信协议。它有一个独特优势就是可以无中断传输数据,可以连续地发送或接收任意数量的位。而在I2C和UART中,数据以数据包的形式发送,有着限定位数。
在SPI设备中,设备分为主机与从机系统。主机是控制设备(通常是微控制器),而从机(通常是传感器,显示器或存储芯片)从主机那获取指令。
一套SPI通讯共包含四种信号线:MOSI (Master Output/Slave Input) – 信号线,主机输出,从机输入。MISO (Master Input/Slave Output) – 信号线,主机输入,从机输出。SCLK (Clock) – 时钟信号。SS/CS (Slave Select/Chip Select) – 片选信号。
SPI协议特点
实际上,从机的数量受系统负载电容的限制,它会降低主机在电压电平之间准确切换的能力。
时钟信号
每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。 时钟信号由于是主机配置生成的,因此SPI通信始终由主机启动。
设备共享时钟信号的任何通信协议都称为同步。SPI是一种同步通信协议,还有一些异步通信不使用时钟信号。 例如在UART通信中,双方都设置为预先配置的波特率,该波特率决定了数据传输的速度和时序。
片选信号
主机通过拉低从机的CS/SS来使能通信。 在空闲/非传输状态下,片选线保持高电平。在主机上可以存在多个CS/SS引脚,允许主机与多个不同的从机进行通讯。
如果主机只有一个片选引脚可用,则可以通过以下方式连接这些从器件:
MOSI和MISO
主机通过MOSI以串行方式将数据发送给从机,从机也可以通过MISO将数据发送给主机,两者可以同时进行。所以理论上,SPI是一种全双工的通讯协议。
传输步骤
1. 主机输出时钟信号
使用SPI有一些优点和缺点,如果在不同的通信协议之间进行选择,则应根据项目要求进行充分考量。
SPI优点
SPI通讯无起始位和停止位,因此数据可以连续流传输而不会中断;没有像I2C这样的复杂的从站寻址系统,数据传输速率比I2C更高(几乎快两倍)。独立的MISO和MOSI线路,可以同时发送和接收数据。
SPI缺点
SPI使用四根线(I2C和UART使用两根线),没有信号接收成功的确认(I2C拥有此功能),没有任何形式的错误检查(如UART中的奇偶校验位等)。
UART代表通用异步接收器/发送器也称为串口通讯,它不像SPI和I2C这样的通信协议,而是微控制器中的物理电路或独立的IC。
UART的主要目的是发送和接收串行数据,其最好的优点是它仅使用两条线在设备之间传输数据。UART的原理很容易理解,但是如果您还没有阅读SPI 通讯协议,那可能是一个不错的起点。
UART通信
在UART通信中,两个UART直接相互通信。相关实例:按下按键,通过串口发送数据实例。发送UART将控制设备(如CPU)的并行数据转换为串行形式,以串行方式将其发送到接收UART。只需要两条线即可在两个UART之间传输数据,数据从发送UART的Tx引脚流到接收UART的Rx引脚:
UART属于异步通讯,这意味着没有时钟信号,取而代之的是在数据包中添加开始和停止位。这些位定义了数据包的开始和结束,因此接收UART知道何时读取这些数据。
当接收UART检测到起始位时,它将以特定波特率的频率读取。波特率是数据传输速度的度量,以每秒比特数(bps)表示。两个UART必须以大约相同的波特率工作,发送和接收UART之间的波特率只能相差约10%。
UART工作原理
发送UART从数据总线获取并行数据后,它会添加一个起始位,一个奇偶校验位和一个停止位来组成数据包并从Tx引脚上逐位串行输出,接收UART在其Rx引脚上逐位读取数据包。
UART数据包含有1个起始位,5至9个数据位(取决于UART),一个可选的奇偶校验位以及1个或2个停止位:
起始位:
UART数据传输线通常在不传输数据时保持在高电压电平。开始传输时发送UART在一个时钟周期内将传输线从高电平拉低到低电平,当接收UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据帧中的位。
数据帧:
数据帧内包含正在传输的实际数据。如果使用奇偶校验位,则可以是5位,最多8位。如果不使用奇偶校验位,则数据帧的长度可以为9位。
校验位:
奇偶校验位是接收UART判断传输期间是否有任何数据更改的方式。接收UART读取数据帧后,它将对值为1的位数进行计数,并检查总数是偶数还是奇数,是否与数据相匹配。
停止位:
为了向数据包的结尾发出信号,发送UART将数据传输线从低电压驱动到高电压至少持续两位时间。