1)基本概念
•
SPI
是串行外设接口(
Serial Peripheral Interface
)的缩写。
SPI
,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为
PCB
的布局上节省空间,提供方便,正是出于这种简单易用的特性。是
Motorola
首先在其
MC68HCXX
系列处理器上定义的。
•
SPI
的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少
4
根线,事实上
3
根也可以(单向传输时)。也是所有基于
SPI
的设备共有的,它们是
SDI
(数据输入)、
SDO
(数据输出)、
SCLK
(时钟)、
CS
(片选)。
(
1
)
SDI –
S
erial
D
ata
In,
串行数据输入;
MOSI; SIMO: Master Output, Slave Input(output from master);
(
2
)
SDO –
S
erial
D
ata
O
ut
,
串行数据输出;
MISO; SOMI: Master Input, Slave Output(output from slave);
(
3
)
SCLK – Serial Clock,
时钟信号,由主设备产生;
(
4
)
CS – Chip Select,
从设备使能信号,由主设备控制。
![](https://i-blog.csdnimg.cn/blog_migrate/6784642d9b56d63aec793516833fdf6f.png)
2) SPI时钟配置
这部分内容,从嵌入式的角度是在SPI的驱动中实现的,需要考虑主芯片和从芯片通过SPI通信时,在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。但要注意的是,由于主设备的SDO连接从设备的SDI,从设备的SDO连接主设备的SDI,从设备SDI接收的数据是主设备的SDO发送过来的,主设备SDI接收的数据是从设备SDO发送过来的,所以主设备这边SPI时钟极性的配置(即SDO的配置)跟从设备的SDI接收数据的极性是相反的,跟从设备SDO发送数据的极性是相同的。
3)SPI优缺点
•
SCK
信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于
SPI
的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少
8
位数据,而
SPI
允许数据一位一位的传送,甚至允许暂停,因为
SCK
时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据,也就是说,主设备通过对
SCK
时钟线的控制可以完成对通讯的控制。
SPI
还是一个数据交换协议:因为
SPI
的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的
SPI
设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。
•
在点对点的通信中,
SPI
接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比
I2C
系统要稍微复杂一些。
•
SPI
主要特点有
:
可以同时发出和接收串行数据
;
可以当作主机或从机工作
;
提供频率可编程时钟
;
发送结束 中断标志
;
写冲突保护
;
总线竞争保护等。
•
SPI
接口的一个缺点:
没有指定的流控制,没有应答机制确认是否接收到数据。
![](https://i-blog.csdnimg.cn/blog_migrate/65c298fd66c844cd11c9eaac955b950e.png)
4)SPI有四种操作模式
•
模式
0
、模式
1
、模式
2
和模式
3
,它们的区别是定义了在时钟脉冲的哪条边沿转换(
toggles
)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。每种模式由一对参数刻画,它们称为时钟极(
clock polarity
)
CPOL
与时钟期(
clock phase
)
CPHA
。
![](https://i-blog.csdnimg.cn/blog_migrate/26b8a32c2dfe1666d5eee9d72b1cbd86.png)
5)SPI基本应用SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间,在SPI的实际应用过程中,同样可以使用逻辑分析仪捕捉SPI的4根或者3根信号总线,并且可以用上位机进行解析,分析SPI通信过程中数据的传输是否有异常,如果出现异常的结果,需要分析SPI的配置是否正确,检查通信地址,读取字节长度等等是否有问题。