一、SPI简介
SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步通信总线,常用于短距离通讯,主要应用于 EEPROM、FLASH、实时时钟、AD 转换器、还有数字信号处理器和数字信号解码器之间。
1.1 SPI物理层
SPI 一般使用 4 根线通信,如下图所示:
MISO –主机输入 / 从机输出数据线(SPI Bus Master Input / Slave Output);
MOSI –主机输出 / 从机输入数据线(SPI Bus Master Output / Slave Input);
SCLK –串行时钟线(Serial Clock),主设备输出时钟信号至从设备,用于通信数据同步,同时决定了SPI的通信速率;
NSS(CS) –从设备选择线 (NO. Slave Select / Chip select),由主设备控制,当NSS为低电平则选中从器件。
SPI 以主从方式工作,通常有一个主设备和一个或多个从设备。通信由主设备发起,主设备通过 CS 选择要通信的从设备,然后通过 SCLK 给从设备提供时钟信号,数据通过 MOSI 输出给从设备,同时通过 MISO 接收从设备发送的数据。
如下为主器件与多个从器件通信,其中SCK,MOSI,MISO是接在一起的,NSS分别接到不同的IO管脚控制。主器件要和从器件通信就先拉低对应从器件的NSS管脚使能。默认状态IO1,IO2,IO3全为高电平,当主器件和从器件1通信时,拉低IO1管脚使能从器件1。而从器件2,3不使能,不作响应:
1.2 SPI协议层
每次开始传输时,主器件先拉低从器件的片选信号线NSS,选中要传输的从器件。SCK时钟线发送一个时钟周期就传输一位数据。MOSI为主出从入,数据由主器件控制发送,从器件接收。MISO的数据由从器件控制发送,主器件接收。所以SPI传输一个字节就相当于主器件和从器件交换一个字节。
SPI只有主模式和从模式之分,没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
根据时钟极性(CPOL: Clock Polarity)及相位(CPHA: Clock Phase)不同,SPI有四种工作模式:
SPI四种工作模式对应的工作时序图如下:
上图中的nSS信号由高电平变为低电平即为SPI通讯的起始信号,反过来,nSS信号由低电平变为高电平即为SPI通讯的结束信号。
SPI通信数据的采集跟其工作模式有关,当时钟相位CPHA=0则在时钟的第一个跳变沿进行数据采样,当CPHA=1则在时钟的第二个跳变沿(也即延迟半个时钟周期)进行数据采样。时钟极性CPOL则定义了时钟空闲状态的电平高低,即CPOL=0则时钟空闲状态为低电平,CPOL=1则时钟空闲状态为高电平。