【图文并茂超详细】嵌入式外设 —— 搞懂spi通信原理

〇 写在前面

  本人本科硕士皆是天坑专业,后自学转行去做了嵌入式软件开发,曾在华为和大疆等公司任职。
  在转行自学的过程中,困难艰辛不必多说,幸运的是得到了网上很多大佬的帮助。现在不敢说小有所成,也算是偶有心得,回顾一路以来的困顿苦恼,决定把自己的一些经验拙见写成博客带给大家,希望能够帮助大家。也欢迎大家积极留言互动问问题,看到消息都会回复的。
  最后,如果觉得文章有用或者能够帮助到你,麻烦点个赞给个关注支持一下,你的点赞关注是对我的最大肯定和支持,也是我不断创作的动力,同时也让我满足一下虚荣心,哈哈~

一 啥是SPI

  SPI 全称是Serial Peripheral interface(串行外围设备接口),由摩托罗拉首次定义并开发。

二 硬件连接

1. 架构

  spi采用的是主从模式,在spi通讯系统中,有且只有一个主机(master),可以有一个或者多个从机(slave)。

2. 信号线与连接

  spi接口一般有4条信号线,分别是:

  • SCLK (Serial Clock):时钟信号线,由主设备产生,用于同步数据传输。
  • MOSI (Master Out Slave In):主设备输出从设备输入的数据线。
  • MISO (Master In Slave Out):主设备输入从设备输出的数据线。
  • SS (Slave Select):片选信号线,用于选择特定的从设备。每个从设备都有独立的SS线。

连接线如图:
在这里插入图片描述

三 spi模式

  这里引入时钟极性时钟相位的概念:

  • 时钟极性(CPOL, Clock Polarity)
    时钟极性有0和1之分,当CPOL=0时,SCLK 信号在空闲时为低电平。CPOL=1时,表示 SCLK 信号在空闲时为高电平。
  • 时钟相位(CPHA,Clock Phase)
    时钟相位也有0和1之分,当CPHA=0时,表示数据在 SCLK 信号的第一个边沿(上升沿或下降沿)被采样。当CPHA=1时,表示数据在 SCLK 信号的第二个边沿(下降沿或上升沿)被采样。

  CPHA与CPOL组合,则有四种采样模式,如下表:

spi模式CPOLCPHA解析
000空闲时SCK为低电平,数据在SCLK上升沿采样,下降沿传输
101空闲时SCK为低电平,数据在SCLK下降沿采样,上升沿传输
210空闲时SCK为高电平,数据在SCLK下降沿采样,上升沿传输
311空闲时SCK为高电平,数据在SCLK上升沿采样,下降沿传输

图解:

  • CPHA = 1时:
    在这里插入图片描述
  • CPHA = 0时:
    在这里插入图片描述

注: 实际上当SS信号拉低后,master立刻产生sclk信号,并非如图在下一个完整周期才产生信号,图解只是为了更清晰的呈现采样过程。

四 通信流程帧格式

  以上图,master与slave0通信为例,且CPOL=1,CPHA = 1。

1.空闲状态

  • SCKL为高电平
  • MOSI和MISO的电平取决于硬件。当被置为高组态时,其信号处于不确定的状态。当连接上拉或者下拉电阻时,则会被固定为高电平或者低电平。具体的电平状态取决于硬件设置。
  • SS0和SS1均处于高电平(未选中状态)
    如下图:
    在这里插入图片描述

2.通信状态

  以mosi和miso信号线被下拉,即空闲时为低电平为例,流程为:
  1. SS信号被拉低。
   2. SCLK在SS信号被拉低后产生方波信号(在ss信号被拉低后立刻产生,并非在下个完整周期产生,图中只是为了便于讲解)。
   3. MOSI和MISO信号线上产生高低电平以传输数据。
   4. 数据传输完成后,SS信号被拉高,SCLK信号为高电平,MOSI和MISO为低电平。

图解如下:
在这里插入图片描述

讲解:

  • 对于spi通来说,没有对一次传输的数据长度做规定。
      即在开始信号和结束信号之间,可以为8位,16位甚至更长,需要根据具体的硬件手册和设计来进行具体分析。

  • SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。
      要理解这句话,需要从spi硬件入手,在 SPI 硬件设计中,主机和从机通常都有至少一个移位寄存器来处理数据的发送和接收。但是,具体到硬件实现,不同的 SPI 控制器可能有不同的架构和设计,所以移位寄存器的数量可能会有所不同。
      以最简单的spi控制器,即主从设备都只有一个8位移位寄存器为例(如stm32f4xx的片内spi设备),通信过程是这样的:
    在这里插入图片描述
      从图中可以看出,两个移位寄存器通过MISO和MOSI两条线构成了一个环形。其具体流程如下:
      (1)主设备将移位寄存器的最高位放置MOSI上,同时从设备将移位寄存器的最高位放在MISO上。
      (2)主设备移位寄存器向左移动一位,从设备移位寄存器向左移动一位。
      (3)主设备从MISO读取一个位,并将数据放在移位寄存器最右侧的位置。从设备从MOSI上读取一个位,并将设局放在移位寄存器最右侧俄位置上。

  举个例子:
  主设备移位寄存器中数据为0b01101101,从设备移位寄存器中的数据为0b01001001,现要将数据 0b10011100 从主设备发送至从设备。且CPHA = 1 ,CPOL = 1,大端在前。
  整体时序图如下:
在这里插入图片描述

  • 初始状态:
    在这里插入图片描述
  • 第一步:
      对应时序图中的1,SS信号拉低,SCLK产生时钟信号,主设备将内存中需要发送的数据写入到移位寄存器中,。
    在这里插入图片描述
  • 第二步:
      对应时序图的2,主设备将移位寄存器的最高位1放在MOSI上,从设备将最高位0放在MISO上,同时主从两个设备的移位寄存器都向左移动一位。
    在这里插入图片描述
  • 第三步:
      对应时序图的3,主设备从MISO上采样数据,并将得到的数据放在移位寄存器的最右侧,同时从设备从MOSI上采样数据,并将得到的数据放在移位寄存器的最右侧。
    在这里插入图片描述
      之后重复第二第三步,直到数据传输完成。

五 总结和补充

1.优缺点:

优点:

  • 高速 (最高50MHz,具体取决于硬件)
  • 全双工 (接收和发送同时进行)
  • 同步 (有单独的时钟信号来确保同步)

缺点:

  • 布线复杂性:
      对于每个从设备,都需要一条独立的 SS 线,这可能导致在连接多个从设备时引脚数量增加,从而增加了布线的复杂性。
  • 有限的通信距离:
      由于 SPI 是一种高速通信协议,信号衰减和反射等问题可能会限制通信的有效距离。SPI 通常用于短距离通信,不适合远距离数据传输。
  • 没有内置的错误检测机制:
      SPI 协议本身没有内置的错误检测机制,如 CRC 校验码,这可能需要在软件层面上添加额外的错误检测功能。
  • 主控性:
      SPI 通信完全由主设备控制,这意味着从设备不能主动发起通信,所有的数据交换都必须由主设备发起。

2.一些补充

  • 从上面讲解可知,spi的主从设备必须选择同样的模式才可正常工作。
  • 在硬件连接上,连接多从机还有一种菊花链的方式,该方式在多从机的情况下仅使用一个SS信号,节约引脚,但是较为复杂,不常见,故只做简述,有兴趣的可以自行搜索学习。

  
  
  
  
  
  如果帮助到你,麻烦点个赞给个关注,你的支持和关注是我持续更新的动力!谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值