SPI 协议(Serial Peripheral Interface),即串行外设接口,是一种高速串行全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。

物理层

SPI的物理连接图
file
上面是SPI的物理连接图。主要可以分为四部分:

SCK:由主机产生,协议不设上面,频率上限主要看设备。
MISO:master input slave output
MOSI:master output slave input
SS:也称为NSS、CS,片选信号线。用于选择从机,一条片选线对应一个从机。
拓扑结构上比I2C稍微复杂一丢丢,但十分好理解。

协议层

I2C协议只有两根总线,所有信息传输更是只能通过那一根数据总线进行,所以规定了3种传输方式。

而SPI协议有四根线,可操作空间大,自然不比像I2C一样限定多种模式。在传输模式上比较自由,没有固定的传输模式,只需学习原子操作即可。(PS:传输模式其实是有的,不过具体到每个外设的传输模式都不同,还需要具体情况具体分析。)

原子操作

1)起始和停止信号

file

非常简单易看。以连接主机和从机的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:偶数边沿采样
    file
    这个边沿的计数从SS片选线的起始信号开始后,SCK的第一个边沿开始计算。

总结

至此,对于SPI协议的主干内容就结束了。。。没错,结束了。。。官方文档其余的内容,更多的是关于寄存器和相关参数的内容,协议本身的核心内容就辣么点。

跟I2C相比,SPI协议本身连应答确认机制都没有,十分的简单的粗暴。。。好处是,相对于无标准状态下,各路厂家自由放飞导致的不同厂家间接口不兼容,SPI提供了一个相对普适的基础通信框架。既统一了标准,又给足了厂家们根据自身产品需求对该框架魔改的空间。

发表评论

您的电子邮箱地址不会被公开。