一、前言
SPI是一种高速全双工同步通信总线。一个主机设备可以和一个或多个从机设备进行通信。主设备开始与从设备的同步通信,从而完成数据的交换。标准的SPI有四个引脚,分别为:
- MOSI: 主机输出从机输入
- MISO: 主机输入从机输出
- CLK: 时钟
- CS片选(这个引脚叫法比较多)
二、名词
- CPOL:clock polarity 时钟的极性:表示 SPI 在空闲时, 时钟信号是高电平还是低电平.
- CPHA:clock phase 时钟的相位:表示 SPI 设备是在 SCK 管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样
- 主-从控制方式:SPI 协议中规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave设备不能正常工作。因此在SPI通信中,任何的数据交互都是由主机发起,主机通过时钟引脚CLK及片选信号CS控制相对应的从机进行通信。
三、四种工作模式
由时钟极性和时钟相位相互组合,得出SPI四种工作模式如下:
- 模式0:CPOL= 0,CPHA=0。SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换
- 模式1:CPOL= 0,CPHA=1。SCK串行时钟线空闲是为低电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换
- 模式2:CPOL= 1,CPHA=0。SCK串行时钟线空闲是为高电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换
- 模式3:CPOL= 1,CPHA=1。SCK串行时钟线空闲是为高电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换
四、数据交换
SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 “发送者(Transmitter)” 或者 “接收者(Receiver)”. 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了.
一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上.
在数据传输的过程中, 每次接收到的数据必须在下一次数据传输之前被采样. 如果之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃, 导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的.
摘抄自https://blog.csdn.net/bleauchat/article/details/84821031