SPI通信原理详解-全面剖析
1.何为SPI通信
同步通信协议,不要求主机和从机的速率严格匹配,主设备(Master)负责生成时钟信号(SCLK),而从设备(Slave)只需要根据主设备提供的时钟信号进行数据采样和发送,主设备的速率不能超过从设备的速率
引脚为推挽输出,可以主动输出高低电平,无需依赖外部电路,相比于IIC的开漏输出,必须要上拉电阻,电平上升时间低于SPI,所以SPI通常用于高速通信
2.通信所需的通信引脚
2.1.协议核心引脚
-
MISO(Master In Slave out): 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。- 即主设备读取信息需要运用到这个引脚
-
MOSI(Master out Slave In): 主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。- 即主设备发送信息需要运用到这个引脚
-
从设备的收发引脚:
SIMO(Slave In Master out) 和 SOMI(Slave In Master out)和上述引脚功能理解一致,只是主机和从机的表述不一样
-
SCK(Serial Clock):串行时钟信号,主设备通过 SCK 引脚生成时钟信号,控制数据传输的节奏。从设备根据 SCK 的边沿(上升沿或下降沿)采样或发送数据。- 方向:主设备输出,从设备输入
-
CS/NSS:从设备片选信号,由主设备控制。它的功能是用来作为“片选引脚”,引脚为低电平时,表示从设备被选中;当为高电平时,表示从设备未被选中- 分为硬件和软件,为了更好管理时序,通常用软件模拟,以匹配所有的从机时序
-
中断引脚(非标准协议) : 从设备可以通过一个 GPIO 引脚向主设备发送中断信号,通知主设备某些事件的发生(例如数据准备就绪、错误状态等)。
- 从设备通过一个 GPIO 引脚输出一个电平变化(通常是低电平有效或高电平有效)来通知主设备。
- 主设备的相应 GPIO 引脚配置为输入模式,并启用中断功能以检测该信号的变化。
实际使用中,对于一些只需要单方面写入的操作,比如屏幕驱动,可以完全舍弃掉 MISO 这个引脚,无需接收从机信息
一对一
一对多
3.时钟极性和相位
- CPOL: 时钟极性,决定了
SCK在空闲状态下的电平- CPOL = 0 : 空闲状态下为低电平,决定第一个边沿为上升沿,第二个边沿为下降沿
- CPOL = 1 : 空闲状态下为高电平,决定第一个边沿为下降沿,第二个边沿为上升沿
- CPHA : 时钟相位,决定了数据在时钟信号的哪个边沿被采样或发送
- CPHA = 0 : 数据在时钟信号的第一个边沿被采样
- CPHA = 1 : 数据在时钟信号的第二个边沿被采样
主设备必须根据从设备的要求配置相同的模式。
4.协议使用和解析
4.1.主从设备收发
-
SPI是单主设备通信协议,当SPI主设备想读/写[从设备]时,它首先拉低从设备对应的CS/NSS线(低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,主设备把信号发到MOSI实现“写”,或者发送到MISO来实现“读”
-
SPI主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输
- 首先拉低对应NSS信号线,表示与该设备进行通信
- 主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据
- SCLK时钟信号可以是低电平有效,也可以是高电平有效,
- 这里会影响数据采样的边沿即时钟极性(CPOL)决定了上升沿和下降沿位于第一个边沿还是第二个边沿,而时钟相位(CPHA)则决定了通过第一个边沿进行数据采样还是第二个边沿进行数据采样。
- 主机(Master)将要发送的数据写到发送数据缓存区(buffer),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,,同时MISO接口接收到的数据拆成BIT位经过移位寄存器一位一位的移到接收缓存区。
- 从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
- SPI虽然是同步通讯协议,但是它的本质仍然是串行通信,通过移位寄存器一位一位发送,但是它可以通过时钟线来进行同步,效率相比异步通信效率更改
-
主从设备通信需要匹配的几大因素:
- CPHA(时钟相位)
- CPOL(时钟极性)
- MSB/LSB(数据解析顺序)
- 主机速率要小于等于从机的速率
4.2.全双工通信协议
SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据,下图为移位寄存器的收发

5.时序图解析

-
CPOL = 1 : 空闲状态下为高电平,决定第一个边沿为下降沿,第二个边沿为上升沿
-
CPHA = 1 : 数据在时钟信号的第二个边沿被采样,在这里代表上升沿进行数据采样
这里我以跳变边沿和数据采样边沿来代表时钟周期的两个边沿,具体取决于 CPOL 和 CPHA
-
跳变边沿:
- 主设备会在该边沿将新的数据位驱动到 MOSI 端口。
- 从设备会在该边沿将新的数据位驱动到 MISO 端口。
-
数据采样边沿 :
- 主设备在该边沿采样从设备通过 MISO 发送的数据。
- 从设备在该边沿采样主设备通过 MOSI 发送的数据。
-
采样时段 :
- 在采样边沿和翻转边沿之间的时间段是采样时段,在此时段上,这里对于主设备来说,数据已经稳定在 MOSI 和 MISO 端口上,对于从设备而言,数据就是稳定到SOMI和SIMO端口上,本质一样的线路,表述不一样,主设备和从设备可以安全地采样数据,而不会受到信号不稳定的影响。
从这里可以看出,MOSI 和 MISO 端口的状态变化是由时钟信号的跳变边沿和数据采样变样驱动,即从 "空闲状态"到“驱动状态”,代表数据是否填充到对应端口,在时钟信号的跳变沿,MOSI 和 MISO 端口会切换到新的电平值,以表示新的数据位。
即当主机的输出口(MOSI)输出1bit时,在时钟的采样前沿被从器件输入口(SIMO)采样,而从器件这边,主器件的输入口(MISO)同样是在时钟的采样前沿接收(采样)来自从器件输出口(SOMI)的1bit
6.时序BIT位分析
- 在MOSI端口,这里每个时钟周期会传输一个bit位,而这个bit位的高低则取决于MOSI的信号电平,高电平则为二进制的1,低电平则为二进制的0
- 这里观察MOSI端口的时候你可以看到两根线,一般上面那根线为信号线,下面那根为地线(参考电平),主要观察信号线的电平即可,信号线在下则为低电平,在上方则为高电平
- 数据解析顺序格式: 主设备和从设备需要根据相同的传输顺序解析接收到的数据
MSB: 接收到的第一个位被解析为最高有效位(MSB),后续位依次填充到次高有效位、次低有效位,直到最低有效位LSB: 接收到的第一个位被解析为最低有效位(LSB),后续位依次填充到次低有效位、次高有效位,直到最高有效位
更多推荐

所有评论(0)