介绍:
SPI(Serial Peripheral Interface)是由摩托罗拉公司开发的一种通用数据总线
四根通信线:
- SCK(Serial Clock) 时钟线
- MOSI(Master Output Slave Input) 主机输出 、从机输入
- MISO(Master Input Slave Output) 主机输入 、从机输出
- SS(Slave Select) 从机选择线
同步,全双工
支持总线挂载多设备(一主多从)
特点:
- 没有像I2C这样复杂的从设备寻址系统;
- 分离的MISO和MOSI信号线,因此可以同时发送和接收数据,支持全双工;
- 极其灵活的数据传输,不限于8位,它可以是任意大小的字;
- 数据传输速率比I2C更高(几乎快两倍);
硬件电路
- 所有SPI设备的SCK、MOSI、MISO分别连在一起
- 主机另外引出多条SS控制线,分别接到各从机的SS引脚
- 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入
SPI协议的工作方式如下:
- 主设备选择一个从设备,通过将对应的SS信号置为低电平。
- 主设备提供时钟信号(SCLK),在时钟的上升沿或下降沿进行数据传输。
- 主设备通过MOSI线发送数据给从设备,从设备通过MISO线发送数据给主设备。
- 数据传输可以是全双工的,即主设备和从设备可以同时发送和接收数据。
- 数据的传输顺序可以是位序(LSB first)或字节序(LSB first或MSB first)。
- 传输完成后,主设备将对应的SS信号置为高电平,结束与从设备的通信。
操作模式
选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系
根据SPI的时钟极性和时钟相位特性可以设置4种不同的SPI通信操作模式:
SPI模式 | CPOL | CPHA | 空闲时SCK时钟 | 采样时刻 |
0 | 0 | 0 | 低电平 | SCK第一个边沿移入数据,第二个边沿移出数据 |
1 | 0 | 1 | 低电平 | SCK第一个边沿移出数据,第二个边沿移入数据 |
2 | 1 | 0 | 高电平 | SCK第一个边沿移入数据,第二个边沿移出数据 |
3 | 1 | 1 | 高电平 | SCK第一个边沿移出数据,第二个边沿移入数据 |
Mode 0
SCK第一个边沿移入数据,第二个边沿移出数据
注意:从机未被选择时,从机的MISO引脚必须关断输出(即配置输出为高阻状态)所以MISO是中间线,等SS被选择后才被允许开启输出 ,等输出结束后置回高阻态。
Mode1
SCK第一个边沿移出数据,第二个边沿移入数据
Mode 2
实际上相比Mode 0,就是SCK时钟线翻转了 。
SCK第一个边沿移入数据,第二个边沿移出数据
Mode 3
Mode 1 SCK时钟线 翻转
SCK第一个边沿移出数据,第二个边沿移入数据
SPI时序
一个完整的SPI通信过程包括以下 5 部分:
- 起始信号
- 选择设备(通过指令集实现)
- 选择地址(通过指令集实现)
- 数据传输
- 终止信号
起始信号:
SS从高电平切换到低电平
终止信号:
SS从低电平切换到高电平
指令集
SPI 指令集并非一个固定、统一的集合,而是由各个SPI从设备(如EEPROM、FLASH存储器、传感器等)根据其内部功能和操作需求定义的。这些指令集允许SPI主设备(如微控制器)通过发送特定的指令代码来控制从设备的操作,如读取数据、写入数据、擦除扇区等。
由于SPI是一种广泛应用的通信协议,不同的从设备制造商可能会设计不同的指令集来满足其产品的特定需求。因此,当使用SPI与某个从设备进行通信时,首先需要查阅该从设备的数据手册或技术规格书,以了解其所支持的指令集及其具体用法。
指令示例(以W25Q128 FLASH存储器为例)
这些指令可以作为SPI指令集的一个缩影:
-
写使能(Write Enable):指令码通常为06H,用于使能FLASH存储器的写操作。在发送写数据或擦除指令之前,需要先发送写使能指令。
-
读状态寄存器(Read Status Register):指令码通常为05H,用于读取FLASH存储器的状态寄存器的内容,以获取存储器的当前状态信息,如忙标志位(BUSY)等。
-
页写时序(Page Program):指令码通常为02H,用于向FLASH存储器的指定地址写入数据。页写操作允许一次写入最多256个字节的数据。
-
扇区擦除时序(Sector Erase):指令码通常为20H,用于擦除FLASH存储器中的一个扇区。扇区擦除是将扇区内的所有数据位设置为1(FFH)的过程。
需要注意的是:不同SPI从设备指令集不同
综上所述,SPI指令集是一个由各个SPI从设备定义的、用于控制从设备操作的指令集合。在使用SPI进行通信时,必须查阅所使用的SPI从设备的数据手册或技术规格书,以了解其所支持的指令集及其具体用法。
发送指令集
向SS指定的设备,发送指令
数据传输
正常字节正常传输,如果是半字或者字传输 则高位先传
SPI时序详解
指定地址写
向SS指定的设备,发送写指令(0x02), 随后在指定地址(Address[23:0])下,写入指定数据(Data)
指定地址读
向SS指定的设备,发送读指令(0x03), 随后在指定地址(Address[23:0])下,读取从机数据(Data)
参考推荐
SPI协议详解(Standard SPI、Dual SPI和Queued SPI)-CSDN博客
SPI通信协议_spi协议-CSDN博客