艾巴生活网

您现在的位置是:主页>科技 >内容

科技

SPI总线,电子通信的SPI详解

2024-05-30 10:49:55科技帅气的蚂蚁
将微控制器连接到传感器、监控器或其他模块时,您是否考虑过如何在两个设备之间进行通信?他们到底在说什么?他们怎么能相互理解呢?电子设

SPI总线,电子通信的SPI详解

将微控制器连接到传感器、监控器或其他模块时,您是否考虑过如何在两个设备之间进行通信?他们到底在说什么?他们怎么能相互理解呢?

电子设备之间的通信就像人类之间的通信。双方需要说同一种语言。在电子学中,这些语言被称为通信协议。

SPI、I2C和UART

我们先来了解三种最常见协议的基础知识:串行外设接口(SPI)、内部集成电路(I2C)和通用异步收发器(UART)驱动通信。

SPI、I2C和UART比USB、以太网、蓝牙和WiFi慢得多,但它们更简单,使用的硬件和系统资源更少。SPI、I2C和UART非常适合微控制器之间以及微控制器与传感器之间的通信,在这些传感器中不需要传输大量的高速数据。

串行和并行通信

电子设备通过在设备之间物理连接的导线发送数据位来相互通信,这有点像信中的信。除了26个字母(英文字母表中),一位是二进制的,只能是1或0。通过电压的快速变化,比特从一个设备转移到另一个设备。在工作电压为5V的系统中,0位以0V的短脉冲通信,1位以5V的短脉冲通信。数据位可以并行或串行形式传输。在并行通信中,数据位同时发送,每个数据位通过一条单独的线路发送。下图是二进制(01000011)中字母“C”的并行传输:

在串行通信中,这些位通过单线一个接一个地发送。下图显示了二进制(01000011)中字母“C”的串行传输:

SPI简介

SPI,英文Serial Peripheral interface的缩写,顾名思义就是串行外设接口。首先由摩托罗拉在其MC68HCXX系列处理器上定义。SPI接口主要用于EEPROM、FLASH、实时时钟、AD转换器、数字信号处理器和数字信号解码器。SPI是一种高速、全双工、同步的通信总线,芯片的管脚上只占用四根线,节省了芯片的管脚,同时也节省了空间,为PCB的布局提供了方便。由于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。

1、SPI特性

(1)采用主从控制方式。

规定两个SPI设备之间通信必须由主设备控制,以控制从设备。一个主设备可以通过提供时钟和选择从设备来控制多个从设备,SPI还规定从设备的时钟由主设备通过SCK引脚提供给从设备,从设备本身不能产生或控制时钟,从设备没有时钟不能正常工作。

(2)以同步方式传输数据。

主设备将根据要交换的数据产生相应的时钟脉冲,该时钟脉冲形成时钟信号。时钟信号通过时钟极性(CPOL)和时钟相位(CPHA)控制两个SPI器件之间何时交换数据,以及何时对接收到的数据进行采样,以确保两个器件之间的数据同步传输。

(3)数据交换

SPI设备之间的数据传输之所以也叫数据交换,是因为SPI协议规定,一个SPI设备在数据通信的过程中,不能只充当‘发送方’或者‘接收方’。在每个时钟周期,SPI器件将发送和接收一位数据。这相当于设备交换了一位大小的数据。如果从设备想要接收主设备发送的控制信号,它必须先被主设备访问。因此,主机必须首先通过SS/CS引脚选择从机。选择您想要访问的从属设备。在数据传输过程中,在下一次数据传输之前,必须对每个接收的数据进行采样。如果先前接收的数据没有被读取,那么接收的数据可能被丢弃,导致SPI物理模块的最终故障。因此,在程序中,SPI设备中的数据通常是在SPI传输后读取的,即使这些数据(哑数据)在我们的程序中是没有用的。

(4)SPI有四种传输模式

上升沿、下降沿、前沿和后沿触发。当然也有MSB和LSB传输模式。

(5)SPI只能分为主机模式和从机模式。

没有所谓的读写,因为每次SPI都是主从器件交换数据。换句话说,你发送一个数据,必然会收到一个数据;如果你想接收一个数据,你也必须先发送一个数据。

2、工作机制

(1)概述

上图只是对SPI器件间通信的简单描述。这里有一些模块如图所示:

Pbuf,同步串口缓冲区,一般指SPI设备中的内部缓冲区,在物理上一般是FIFO的形式,在传输过程中存储临时数据;

SSPSR,同步串口寄存器,一般指SPI设备中的移位寄存器(Shift Regitser),其作用是按照设定的数据位宽度将数据移入或移出SSPBUF

控制器是指SPI器件中的控制寄存器,可以配置这些寄存器来设置SPI总线的传输模式。

一般来说,我们只需对上图中描述的四个引脚(引脚)进行编程,就可以控制整个SPI器件之间的数据通信:

SCK,串行时钟,其主要作用是将时钟信号从主设备传输到从设备,控制数据交换的时序和速率;

SS/CS,Slave Select/Chip Select,用于为主设备片选从设备,使所选从设备可以被主设备访问;

Sdo/MoSi,串行数据输出/Master out slave in,也称为主机上方的Tx-Channel,是数据出口,主要用于SPI器件发送数据;

Sdi/miso,串行数据输入/主机输入从机输出,也称为主机以上Rx通道,作为数据入口,主要用于SPI器件接收数据;

在SPI设备之间的通信过程中,主设备和从设备之间会产生一个数据链路环路。如上图所示,SSPSR通过SDO和SDI引脚控制数据进出SSPBUF,控制器决定SPI总线的通信模式,SCK传输时钟信号。

(2)时机

上图通过主机和从机之间交换1字节数据说明了SPI协议的工作机制。

首先,在这里解释一下相位和极性的概念。

一、SPI相关的缩写或表达

SPI的极性和相位最常见的写法是CPOL和CPHA,但也有一些其他方式,可以总结如下:

(1) ckpol(时钟极性)=cpol=pol=极性=(时钟)极性

(2) CK相位=CPHA相位=相位=时钟相位

(3) SCK=SCLK=SPI的时钟

(4) Edge=edge,即时钟电平变化的时间,即上升沿或下降沿。

对于一个时钟周期,有两个边沿,称为:

前沿=前沿=第一沿,如果起始电压为1,则为1变为0时,如果起始电压为0,则为0变为1时;

Trailedge=最后一条边=第二条边。如果起始电压是1,那么就是0变成1的时间(也就是第一个1变成0之后,后面的0也有可能变成1)。如果起始电压是0,那么就是1变成0的时间。

b、SPI的相位和极性

CPOL和CPHA可以分别为0或1,对应的四种组合是:

模式0 CPOL=0,CPHA=0

模式1 CPOL=0,CPHA=1

模式2 CPOL=1,CPHA=0

模式3 CPOL=1,CPHA=1

c,CPOL极性

首先,SCLK钟的空闲时间是多少?这是SCLK发送8位数据前后的状态。与此相对应,SCLK发送数据时,正是正常工作和有效活跃的时候。

先说英语,它简洁的解释是:时钟极性Clock空闲状态。

用中文解释:

SPI的CPOL指示空闲时SCLK的电平是低电平0还是高电平1:

CPOL=0,时钟空闲时电平为低,所以SCLK活动时为高,称为active-high;

CPOL=1,时钟空闲时电平为高,所以SCLK活动时为低,称为active-low;

d、CPHA阶段

首先,capture strobe=latch=read=sample,表示数据被采样,数据有效。相位,对应数据采样的边沿,第一边沿还是第二边沿,0对应第一边沿,1对应第二边沿。

用于:

CPHA=0,表示第一条边:

对于CPOL=0,idle为低电平时,第一个边沿由低变高,所以是上升沿;

对于CPOL=1,idle为高电平时,第一个边沿由高变低,所以是下降沿;

CPHA=1,表示第二条边:

对于CPOL=0,idle为低电平时,第二个边沿由高变低,所以是下降沿;

对于CPOL=1,idle为高电平时,第一个边沿由低变高,所以是上升沿;

还是上图更容易让大家理解?

e、如何在软件中设置SPI的极性和相位

有SPI主机和从机,它们通过SPI协议进行通信。

设置SPI的模式是从器件的模式,它决定了主器件的模式。

因此,需要先了解从机的SPI模式,然后将主机的SPI模式设置为与从机相同的模式,才能实现正常通信。

从机的SPI有两种模式:

固定,由SPI从机硬件决定

从SPI器件来说,具体是什么模式?相关数据手册中会有描述,所以你需要自己在数据手册中找到相关描述,即:

关于SPI从器件,空闲时是高电平还是低电平,决定了CPOL是0还是1;

然后找到关于器件是在上升沿还是下降沿采样的数据,这样如果设置了CPOL的值,就可以计算出CPHA是0还是1。

可配置,由软件本身设置。

从机也是SPI控制器,支持所有四种模式。这时候你只需要把自己设置到某个模式就可以了。

然后,知道从机的模式后,将SPI主机的模式设置为与从机的模式相同。

至于如何配置SPI的CPOL和CPHA,我就不赘述了。大部分只是把CPOL和CPHA直接写在相应SPI控制器的相应寄存器里,写0或1。

(3)SSPSR

SSPSR是SPI设备中的移位寄存器。其主要功能是根据SPI时钟信号的状态将数据移入或移出SSPBUF,每次移动的数据大小由总线宽度和通道宽度决定。

总线宽度用于指定地址总线和主机之间的数据传输单位。

例如,我们想将16字节数据写入主器件的SSPBUF:首先,将主器件的配置寄存器的总线宽度设置为Byte;然后,将数据写入地址总线入口处主设备的Tx-Data移位寄存器,每次写入1个字节的数据(使用writeb函数);写入1字节数据后,主机中的Tx-Data移位寄存器会自动将1字节数据从地址总线移入SSPBUF以上动作总共需要重复16次。

通道宽度的功能是指定主设备和从设备之间数据传输的单位。与总线宽度类似,主机内部的移位寄存器会根据通道宽度,通过Master-SDO引脚自动将数据从Master-SSPBUF传输到从机的Slave-SDI引脚,然后从机SSPSR会将每次接收的数据移入从机SSPBUF。通常情况下,Bus-Width总是大于或等于Channel-Width,这可以确保SSPBUF中存储的数据是无效的,因为主机和从机之间的数据交换频率比地址总线和主机之间的数据交换频率快。

(4) SSPBUF

我们知道,在每个时钟周期,主机和从机之间交换的数据实际上是由SPI的内部移位寄存器从SSPBUF中复制的。我们可以通过读写SSPBUF的相应寄存器(Tx-Data/Rx-Data寄存器)来间接控制SPI器件中的SSPBUF。

例如,在发送数据之前,我们应该首先将要发送的数据写入主机的Tx-Data寄存器,该数据将由主机-SSPSR的移位寄存器根据总线宽度自动移入主机-SSPBUF。然后,这些数据将由主机-SSPSR根据通道宽度从主机-SSPBUF中移除,并通过主机-SDO引脚传输到从机-SDI引脚。Slave-SSPSR将从Slave-SDI接收的数据移入Slave-SSPBUF。同时,Slave-SSPBUF中的数据根据每个接收数据的通道宽度通过Slave-SDO发送到Master-SDI。然后,主机-SSPSR将从主机-SDI接收的数据传输到主机-SSPBUF。单次数据传输后,用户程序可以从主机的Rx-Data寄存器中读取主机数据交换所获得的数据。

(5)控制器

主设备中的控制器主要通过时钟信号和从设备选择信号来控制从设备。从设备将等待,直到它从主设备接收到片选信号,然后根据时钟信号工作。

主器件的片选操作必须通过程序来实现。比如程序将SS/CS引脚的时钟信号拉至低电平,完成SPI器件数据通信的前期工作;当程序希望SPI器件结束数据通信时,它会将SS/CS引脚上的时钟信号拉高。

SPI的优点和缺点

使用SPI有一些优点和缺点。如果你在不同的通信协议之间进行选择,你应该根据项目的要求知道什么时候使用SPI:优点没有起始位和停止位,所以数据可以不间断地连续流动,没有复杂的从寻址系统,例如I2C更高的数据传输速率(几乎快一倍)和独立的MISO和MOSI线,因此,数据可以同时发送和接收。使用四条线(两条用于I2C和UART)的缺点不能确认数据已经成功接收(I2C已经执行了此操作)。没有错误检查,如UART中的奇偶位只允许单个主机。

审计唐子红