理解SPI协议
SPI 协议(Serial Peripheral Interface),即串行外设接口,是一种高速串行全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。
物理层
SPI的物理连接图
上面是SPI的物理连接图。主要可以分为四部分:
SCK:由主机产生,协议不设上面,频率上限主要看设备。
MISO:master input slave output
MOSI:master output slave input
SS:也称为NSS、CS,片选信号线。用于选择从机,一条片选线对应一个从机。
拓扑结构上比I2C稍微复杂一丢丢,但十分好理解。
协议层
I2C协议只有两根总线,所有信息传输更是只能通过那一根数据总线进行,所以规定了3种传输方式。
而SPI协议有四根线,可操作空间大,自然不比像I2C一样限定多种模式。在传输模式上比较自由,没有固定的传输模式,只需学习原子操作即可。(PS:传输模式其实是有的,不过具体到每个外设的传输模式都不同,还需要具体情况具体分析。)
原子操作
1)起始和停止信号
非常简单易看。以连接主机和从机的NSS线状态为准:
- 高——>低:起始信号
- 低——>高:停止信号
2)数据有效性
由于SPI线多,财大气粗,所以相对而言比较随心所欲,没有固定的表示0/1电平的形式。
但究其通信本质,数据信号线的状态无非就三种:
-
空闲没东西发
-
数据有效
-
数据无效:01切换的时间
所以SPI定义了两个概念: -
CPOL:clock pole,时钟极性。
-
CPHA:clock phase,时钟相位。
CPOL时钟极性
定义了时钟线空闲状态时的电平情况。
-
CPOL=0:低电平空闲
-
CPOL=1:高电平空闲
CPHA时钟相位
SPI的0/1信号 由边沿触发时表示。我们知道,边沿有两不同的状态——上下边沿。而一个时钟周期有两个边沿(上下边沿)。所以要精确的进行数据表示的话,我们必须留出一个边沿来作为电平切换用,即数据无效区。说白的就是一个时钟周期只能传输1位数据。
而CPHA就是定义了具体数据线MOSI和MISO在哪个边沿表示的数据有效。
- CPHA=0:奇数边沿采样
- CPHA=1:偶数边沿采样
这个边沿的计数从SS片选线的起始信号开始后,SCK的第一个边沿开始计算。
总结
至此,对于SPI协议的主干内容就结束了。。。没错,结束了。。。官方文档其余的内容,更多的是关于寄存器和相关参数的内容,协议本身的核心内容就辣么点。
跟I2C相比,SPI协议本身连应答确认机制都没有,十分的简单的粗暴。。。好处是,相对于无标准状态下,各路厂家自由放飞导致的不同厂家间接口不兼容,SPI提供了一个相对普适的基础通信框架。既统一了标准,又给足了厂家们根据自身产品需求对该框架魔改的空间。