一、SPI是什么
SPI (Serial Peripheral interface)定义的一种串行外围设备接口,是一种全双工、同步的通信总线,只需要四根信号线即可,节约引脚,同时有利于PCB的布局。正是出于这种简单易用的特性,现在越来越多的芯片集成了SPI通信协议,如FLASH、AD转换器等。
二、SPI的通信原理
SPI的通信原理比较简单,它以主从方式工作,通常有一个主设备(例如:FPGA)和一个或多个从设备(例如: flash芯片M25P16)。
SPI通信需要四根线,分别为 cs_n、sclk、mosi和 miso。其中 cs_n、sclk、mosi是由主机输出给从机,而miso由从机输出给主机。cs_n用于控制从机是否被选中,也就是说只有片选信号有效时,对从机的操作才有效;sclk是由主机产生的同步时钟,用于同步数据; mosi和 miso是主机发送和接收的数据脚。传输数据时,以MSB 的形式传输。
- miso:主设备输入,从设备输出
- mosi:主设备输出,从设备输入
- sclk:时钟信号,由主设备产生
- cs_n:从设备使能信号,由主设备控制,用于选择从机
三、SPI的工作模式
SPI通信一般有4种不同的模式,不同的从设备在出厂时被厂家配置为其中几种通信模式,通信模式是不允许用户修改的。主设备和从设备必须在同一模式下进行通信,否则数据会接收错误。SPI的通信模式是由CPOL(时钟极性)和CPHA(时钟相位)来决定的;
时钟极性和时钟相位共同决定了读取数据的方式。
-
时钟极性CPOL = 0 : 同步时钟SCLK在空闲时为低电平
-
时钟极性CPOL = 1 : 同步时钟SCLK在空闲时为高电平;
-
时钟相位CPHA = 0 : 在同步时钟信号SCLK的第一个跳变沿采样
-
时钟相位CPHA = 1 : 在同步时钟信号SCLK的第二个跳变沿采样。
-
模式0:CPOL = 0,CPHA = 0;
-
模式1:CPOL = 0,CPHA = 1;
-
模式2:CPOL = 1,CPHA = 0;
-
模式3:CPOL = 1,CPHA = 1。
我后续使用的FLASH(M25P16)只适用模式0(CPOL=0,CPHA=0)和模式3(CPOL=1,CPHA=1)。
四、SPI的传输流程
- 主机先将cs_n片选信号拉低,选择对应从机,保证开始传输数据。
- 当接收端检测到时钟的第二个边沿信号时,它将立即读取数据线上的信号,这样就得到了 1bit 的数据。(前沿输出,后沿采样)。
- 主机发送数据给从机时,主机产生相应的时钟信号(sclk),然后数据一位一位地从mosi信号线上发送从机(先发送高位,再发送低位)。
- 主机接收从机数据时,从机需要将数据送回主机,则主机将继续生成预定数量分频的时钟信号,并且从机通过miso信号线发送数据给主机(先发高位,再发低位)。