引言
当您将微控制器连接到传感器,显示器或其他模块时,您是否考虑过这两种设备如何相互通信?他们到底在说什么?他们如何互相了解?
电子设备之间的通信就像人类之间的通信。双方都需要说相同的语言。在电子学中,这些语言称为 通信协议。对我们来说幸运的是,在构建大多数DIY电子产品项目时,我们只需要知道一些通信协议即可。
首先,我们将从有关电子通信的一些基本概念开始,然后详细说明SPI的工作原理。
SPI,I2C和UART比USB,以太网,蓝牙和WiFi等协议要慢很多,但它们更简单,使用的硬件和系统资源也更少。SPI,I2C和UART非常适用于微控制器之间以及不需要传输大量高速数据的微控制器与传感器之间的通信。
正文
串行与并行通信
电子设备 通过物理连接在设备之间的电线发送数据位来相互通信 。有点像单词中的字母,除了不是26个字母(英语字母中的字母)外,位是二进制的,只能是1或0。通过电压的快速变化,位从一个设备转移到另一个设备。在以5 V工作的系统中,0位作为0 V的短脉冲进行通信,而1位通过5 V的短脉冲进行通信。
数据位可以并行或串行形式传输。在并行通信中,数据位通过一条单独的导线同时全部发送。下图显示了二进制(01000011)中字母“ C”的并行传输:
在串行通信中,位通过单根线一一发送。下图显示了二进制(01000011)中字母“ C”的串行传输:
SPI通信简介
SPI是许多不同设备使用的通用通信协议。例如, SD卡模块, RFID卡读取器模块和 2.4 GHz无线发送器/接收器 均使用SPI与微控制器通信。
SPI的一个独特优势是可以无中断传输数据。可以在连续流中发送或接收任意数量的位。使用I2C和UART,数据以数据包的形式发送,限制为特定位数。开始和停止条件定义了每个数据包的开始和结束,因此数据在传输过程中被中断。
通过SPI通信的设备处于主从关系。主设备是控制设备(通常是微控制器),而从设备(通常是传感器,显示器或存储芯片)从主设备获取指令。SPI的最简单配置是一个单主机,一个从机系统,但是一个主机可以控制多个从机(下面有更多介绍)。
MOSI(主机输出/从机输入) –主机将数据发送到从机的线路。
MISO(主机输入/从机输出) –从机将数据发送到主机的线路。
SCLK(时钟) –时钟信号线。
SS / CS(从站选择/芯片选择) –主站用于选择向其发送数据的从站的线路。
实际上,从站的数量受系统负载电容的限制,这降低了主机在电压电平之间准确切换的能力。
SPI如何运作?
时钟
时钟信号将主设备的数据位输出同步到从设备的位采样。每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。由于主机配置并生成时钟信号,因此SPI通信始终由主机启动。
设备共享时钟信号的任何通信协议都称为 同步。 SPI是一种同步通信协议。还有一些 异步 方法不使用时钟信号。例如,在UART通信中,双方都设置为预先配置的波特率,该波特率决定了数据传输的速度和时序。
可以使用时钟极性和时钟相位的属性来修改SPI中的时钟信号。这两个属性共同定义了何时输出位以及何时对其进行采样。主机可以设置时钟极性,以允许在时钟周期的上升沿或下降沿输出和采样位。可以设置时钟相位,以便在时钟周期的第一沿或第二沿进行输出和采样,而不管它是上升还是下降。
从机选择
主机可以通过将从机的CS / SS线设置为低电压电平来选择要与之通信的从机。在空闲,非传输状态下,从选择线保持在高电压电平。主机上可能有多个CS / SS引脚,这允许多个从机并行连接。如果仅存在一个CS / SS引脚,则可以通过菊花链将多个从机连接到主机。
多个从机
可以将SPI设置为与单个主机和单个从机一起运行,并且可以与由单个主机控制的多个从机一起设置。有两种方法可以将多个从站连接到主站。如果主机具有多个从机选择引脚,则从机可按以下方式并联:
如果只有一个从设备选择引脚可用,则可以通过以下方式菊花链连接从设备:
MOSI和MISO
主机通过MOSI线以串行方式将数据发送到从机。从机通过MOSI引脚接收主机发送的数据。从主机发送到从机的数据通常先发送最高有效位。
从机也可以通过MISO线串行将数据发送回主机。从从机发送回主机的数据通常先发送最低有效位。
SPI数据传输步骤
主机输出时钟信号:
主机将SS / CS引脚切换到低电压状态,从而激活从机:
主机沿着MOSI线一次将数据发送给从机。从站读取接收到的位:
如果需要响应,则从机沿着MISO线一次将数据返回一位给主机。主机读取接收到的位:
SPI的优缺点
使用SPI有一些优点和缺点,如果在不同的通信协议之间进行选择,则应根据项目要求知道何时使用SPI:
优点
没有起始位和停止位,因此数据可以连续流传输而不会中断
没有像I2C这样复杂的从站寻址系统
数据传输速率比I2C更高(几乎快两倍)
分开的MISO和MOSI线路,因此可以同时发送和接收数据
缺点
使用四根线(I2C和UART使用两根线)
没有确认已成功接收数据的确认(I2C拥有此功能)
没有任何形式的错误检查,如UART中的奇偶校验位
只允许一个主机