• 温故知新(十二)——SPI



    1 简介

    SPI是一种嵌入式系统中应用广泛的同步串行通信、边沿采样、主从架构式总线接口。80年代由摩托罗拉开发。

    1.1 拓扑结构

    SPI一般有四根线,一根时钟线SCLK,两根数据线MOSI(主出从入)/MISO(主入从出),一根片选线。

    对于SPI总线而言,有两种拓扑:

    • 独立片选拓扑:总线拓扑需要更多片选引脚,但通信效率高。信息直接在主从间传递。
    对于从设备而言,当从设备未选中时,MISO脚须设置为高阻态,而不能是输出态,否则会影响总线。 对于从设备的MOSI,输入引脚的阻抗本来就是高阻,所以不会有问题。
    • 菊花链拓扑:某级从设备在第N组时钟周期用MISO发送第N-1组时钟周期接收到位给下级设备,同时把本组时钟周期期间前级设备通过MISO移位进来的数据保存按位序保存进接收寄存器中。

    1.2 四种工作模式

    SPI总线有四种工作模式,是由时钟极性选择(CPOL)和时钟相位选择(CPHA)决定。
    CPOL = 0 ,SPI总线空闲为低电平,CPOL = 1, SPI总线空闲为高电平。
    CPHA = 0, 在SCK第一个跳变沿采样,CPHA = 1, 在SCK第二个跳变沿采样。

    1. 当CPHA=0、CPOL=0时SPI 总线工作在模式0。MISO 引脚上的数据在第一个时钟跳变之前已经输出了,而为了保证正确传输,MOSI 引脚的MSB 位必须与SCK 的第一个边沿同步。在模式0的SPI 传输过程中,首先将数据输出,然后在同步时钟信号的上升沿时,SPI 的接收方采样位信号,在时钟信号的一个周期结束时(下降沿),下一位数据信号输出,再重复上述过程,直到规定的字节数传输结束。
    2. 当CPHA=0、CPOL=1时SPI 总线工作在模式1。与模式0唯一不同之处只是在同步时钟信号的下降沿时采样位信号,上升沿时下一位数据输出。
    3. 当CPHA=1、CPOL=0时SPI 总线工作在模式2。MISO 引脚和MOSI 引脚上的数据的MSB 位必须与SCK的第一个边沿同步,在SPI 传输过程中,在同步时钟信号周期开始时(上升沿)数据输出,然后在同步时钟信号的下降沿时,SPI 的接收方采样位信号,在时钟信号的一个周期结束时(上升沿),下一位数据信号输出,再重复上述过程,直到规定的字节数传输结束。
    4. 当CPHA=1、CPOL=1时SPI 总线工作在模式3。与模式2唯一不同之处只是在同步时钟信号的上升沿时采样位信号,下降沿时下一位数据输出。
      其中模式0和模式3最为常用

    2 SPI优劣

    主要与IIC做对比,因为两者都是常用的芯片间通信方式。

    • 优势:
      传输速度高,SPI并未限定最高速度。有的应用甚至高达10Mbps。
      全双工,但有的芯片没有MISO,则不支持。
      相较于I2C而言,SPI简单一些,编程容易,控制简单
      信号为单向信号,易于电隔离。尤其在工业产品中电气隔离在抗干扰方面、以及本质安全方面要求比较高。
      没有复杂的总线仲裁机制,相对健壮。

    • 劣势:
      无寻址机制,需要额外的片选信号
      SPI总线对于多从模式支持不好,两种拓扑都无法支持很多从设备
      而且系统中也仅有一个主设备
      没有定义错误检测机制
      事实上的标准,但无正式标准
      与I2C一样也只是芯片间总线,无法长距离通信


    3 总结

    SPI和IIC在鲁棒性方面都比较好。IIC之所以优雅,是因为它在极简的基础架构(两线SDA/SCL)上提供了非常先进的功能,例如自动多主机冲突处理和内置地址管理。但是它相对却非常复杂,在性能上或许有所欠缺。

    另一方面,SPI非常易于理解和实施,并且为扩展提供了很大的灵活性。SPI的优雅之处在于简单性。SPI应该被视为构建用于IC之间通信的自定义协议栈的良好接口。因此,尽管使用SPI可能需要做更多的工作,但可以提供更高的数据传输性能和灵活的自由度。

    如果一定要比较,则SPI和I2C都为低速设备的通信提供了良好的接口支持,但是SPI更适合点对点传输数据流的应用,而I²C则更适合于多主机“寄存器访问”应用。


    4 参考技术文档

    万变不离其宗之SPI总线要点总结

  • 相关阅读:
    Swift 单元测试
    动态sql和分页
    网络安全(黑客技术)—小白自学
    有手就行10——Jenkins+SonarQube代码审查
    windows安装docker版青龙面板
    nginx php-fpm swoole
    【已解决】vs2022 编译成功但是疯狂报错E1696找不到源文件
    GBase 8c查看数据
    【Java多线程】必须要了解的基本概念
    Spring基础(三):IOC底层原理
  • 原文地址:https://blog.csdn.net/qq_39397153/article/details/126392371