SPI也是MCU最常见的对外通信口之一,由摩托罗拉在上世纪80年代中开发,用于嵌入式系统中器件之间的短距离数据通信,标准模式使用四条信号线。目前常见的应用器件有:LCD模组、以太网模块、SPI串行Flash和很多传感器等,大部分SD卡都具有SPI操作模式。
SPI的特点是主从结构、协议简单、成本低廉、串行传输等,具有同步时钟信号,传输速率可达几兆至十几兆(近来也有达到二、三十兆速率的器件),适合于中等数据量、点对点的传输环境。
1.1 SPI通信协议
SPI是点对点的全双工串行通信协议,用于两个设备间的通信。基本的连线方式是四条信号线,如下图:
四条信号线中有两条数据线,分别用于主机向从机发送数据(MOSI: Master OutSlave In),和从机向主机发送数据(MISO: MasterIn Slave Out)。
主机器件通过SCK时钟信号线向从机输出时钟,同时主机输出SSEL信号作为从机的片选。
1.1.1 SPI数据传输
SPI的数据传输流程十分简单,在每个SCK的时钟周期中有如下操作:
▲主机在MOSI向从机发送一个数据位;
▲从机在MOSI上接收一个数据位;
▲从机在MISO向主机发送一个数据位;
▲主机在MISO上接收一个数据位。
一般SPI的主机和从机都是各由一个移位寄存器实现数据的发送与接收,示意图如下:
在同一个时钟信号的驱动下,主机和从机的移位寄存器同时向相同方向移位,经过n个时钟周期的n次移位,主机的数据与从机的数据正好进行了交换。
通常每个字符数据的长度n=8或n=16。LPC800允许每个数据长度可以是1~16中任意数值。
1.1.2 SPI的时钟信号
SPI的时钟信号SCK除了频率特性外,还需要考虑它的极性和相位,分别由CPOL和CPHA表示,具有以下意义:
▲时钟极性:
CPOL=0:空闲时,时钟信号为‘0’。时钟信号的前沿为上升沿,后沿为下降沿。
CPOL=1:空闲时,时钟信号为‘1’。时钟信号的前沿为下降沿,后沿为上升沿。
▲时钟相位:
CPHA=0:发送方在前一个时钟周期的后沿改变输出信号;接收方在时钟周期的前沿采样输入信号。
CPHA=1:发送方在时钟周期的前沿改变输出信号;接收方在时钟周期的后沿采样输入信号。
通常CPOL和CPHA的四种组合被定义为四种模式,如下表:
在模式0和模式2的SCK第一个时钟边沿之前,SPI主机利用内部时钟在MOSI上输出第一个数据位(最高位),SPI从机则使用前一个数据帧的最后一个边沿输出第一个数据位(最高位)。
1.1.3 SPI 设备的互连
SPI设备间的互连是主从关系,一个主设备可以连接多个从设备,主设备通过从设备片选信号区别与那个从设备进行通信。
一个主机设备能够连接的从机数量,由能够输出的片选信号(SSELn)的个数,和MOSI、SCK信号线的驱动能力限制。
1.2 LPC800的SPI特性
LPC800的SPI非常简单,但配置丰富并且很方便使用。
▲每个数据帧的长度可以直接配置为1~16位的任一种,通过软件操作还可以支持任意长度的数据帧。
▲支持主机模式或从机模式。
▲主机可以在发送数据时,不必理会从机返回的数据。这有助于优化软件的操作,例如对LCD模组刷屏时(现实中有不少LCD模组是不可读的),或写入SPI存储器时。
▲控制信息可以与发送的数据一起写入寄存器,这样可以实现各种灵活的操作要求。
▲最多有四个直接控制的从机片选信号,并且可以配置极性。
▲支持DMA操作。
▲可以灵活地控制每个数据帧中的各种时序。
1.3 SPI Flash读写例程 下面以几个例程示范使用SPI对SPI Flash的 读写操作。
这些例程都是在LPC824-Lite上,对板上的W25Q32BV的操作,下面先抄录这个存储器芯片的部分命令格式,方便例程的理解。以下例程会用到表中带阴影的命令。