1.SPI接口介绍
SPI接口有两种形式,分别为3 线SPI接口和4 线SPI接口,目前最主流且应用最广泛的是4线SPI接口。4 线SPI接口存在四根信号线,分别为:串行时钟线SCK、主机输入、从机输出数据线MISO、主机输出,从机输入数据线MOSI 和低电平有效的片选信号CS。由于SPI 接口只有4 根信号线,使得它能够更加简单地集成在芯片中,同时在占用较少的管脚资源情况下即可完成数据的传输。SPI 接口是由主机、从机和外围设备组成,来自主机或者从机的数据在时钟的上升沿或下降沿同步,之后进行数据传输。
产生时钟的一侧称为主机,另一侧称为从机。总是只有一个主机(一般来说可以是微控制器/MCU),但是可以有多个从机。
整体的传输大概可以分为以下几个过程:
1)主机先将NSS信号拉低,这样保证开始接收数据(片选信号使能);
2)当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit)(一般在RXBUF寄存器中可以看到接收的数据);
3)主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;
4)主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送(主机一定要产生相应的时钟信号,否则从机不会发送数据,因为从机的时钟信号是主机提供的);
具体如下图所示:
SPI特性
SPI接口定义如下:
MISO:Master input slave output 主机输入,从机输出(数据来自从机);
MOSI:Master output slave input 主机输出,从机输入(数据来自主机);
SCLK : Serial Clock 串行时钟信号,由主机产生发送给从机;
SS:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。
2.SPI配置
网上大多博主讲解了SPI的接口特性,接口原理与HAL库的配置流程等等,下文从一般SPI的配置流程介绍,包含了主机与从机的配置流程,可以为市场上绝大多数MCU的SPI配置提供思路;
主机与从机可以按照上图进行硬件连接。
主机配置
- 使能时钟:主机与从机通信的过程中,主机提供时钟信号,那么首先就需要使能SPI主机的时钟;通过SPI引脚与从机通信,需要使能PAD时钟(也叫做GPIO时钟)。
- GPIO初始化:通常来说,1个单片机的引脚都有好几个功能(复用),那么我们就需要进行GPIO的初始化,将单片机的引脚设置为SPI功能(复用功能、上拉、驱动能力等等初始化)。
- 在这里之后就需要配置SPI Master寄存器了
- SPI的模式配置为主机模式、波特率设置(相当于设置SPI的传输速度)、CPHOL、CPHA(设置SPI在哪个沿采集数据)、每发送完一帧SSN(片选信号)设置高/低、SSN由软/硬件控制、一帧数据的长度;
- 使能相关中断;
- 使能SPI;
从机配置
- 使能时钟:SPI时钟,GPIO时钟;
- GPIO初始化:通常来说,1个单片机的引脚都有好几个功能(复用),那么我们就需要进行GPIO的初始化,将单片机的引脚设置为SPI功能(复用功能、上拉、驱动能力等等初始化)。
- 在这里之后就需要配置SPI Slave寄存器了
- SPI的模式配置为从机模式、CPHOL、CPHA(设置SPI在哪个沿采集数据)、每发送完一帧SSN(片选信号)设置高/低、一帧数据的长度;这里不需要设置波特率、但是需要设置与主机相同的数据长度,否则会导致接收到的数据与主机发送的数据不一致。
- 使能相关中断;
- 使能SPI;
-
以上配置完成之后就可以进行主从机的通信了,在配置的时候还需要注意以下内容:
- SPI作为从机时,在初始化的时候需要注意通信数据字长需要与主机设置相同,否则会导致接收数据不准确;
- 对于任何外设,在对TXBUF和RXBUF寄存器进行操作时,都需要查看相关标志,比如使用TXBUF寄存器进行数据发送时,需要在发送缓存空(标志位为TXBE)时再进行操作、使用RXBUF寄存器进行数据接收后进行读数据时,需要等待接收缓存满(标志位为RXBF)时再进行操作;——RXBUF的数据要及时读走,不然RXBUF中的数据一直是首次接收的数据。