当前位置: 首页 > news >正文

SPI协议——笔记

       

目录

1. 基本信号线

2. 主从结构

3. 数据传输模式(CPOL和CPHA)

4. 数据传输过程

举例:一个简单的数据传输流程

5、问题解决


         SPI(Serial Peripheral Interface,串行外设接口)是一种常用的串行通信协议,广泛应用于微控制器、传感器、存储器和显示设备之间的数据传输。它通常用于短距离的高速通信,支持全双工通信

1. 基本信号线

SPI通常使用四条信号线:

  • MOSI(Master Out Slave In):主机输出、从机输入,主机通过这条线发送数据给从机。
  • MISO(Master In Slave Out):主机输入、从机输出,从机通过这条线发送数据给主机。
  • SCK(Serial Clock):串行时钟,由主机产生,用于同步数据传输。
  • SS/CS(Slave Select/Chip Select):从机选择,由主机控制,用于选择哪个从机参与通信(低电平有效)。

 

2. 主从结构

SPI采用主从结构,主机(Master)控制时钟信号和数据传输,从机(Slave)仅在被选择时进行通信。主机可以有一个或多个从机,每个从机对应一个独立的SS/CS信号。当主机拉低某个从机的SS/CS信号时,该从机即参与通信。

3. 数据传输模式(CPOL和CPHA)

SPI的时钟有两个参数控制传输模式:

  • CPOL(Clock Polarity):控制时钟的空闲状态是高电平(1)还是低电平(0)。
  • CPHA = 0

    • 数据在时钟的第一个边沿(上升沿)进行采样。
    • 对应的工作模式:模式0和模式2。
  • CPHA = 1

    • 数据在时钟的第二个边沿(下降沿)进行采样。
    • 对应的工作模式:模式1和模式3。

注意:在下图当中。当CPHA=0或者CPHA=1,不是说在开始发送数据的时候,时钟线是低电平或者高电平,而是说,CPHA = 0 是指数据在时钟上升沿被读取,CPHA=1是指在时钟下降沿的时候被读取。为了方便不混淆;可以说,

        在MOSI信号线上:CPHA=0,每个周期的第一个边沿读取(从机去读取),CPHA=1,每个周期的第二个边沿读取(从机读取);

        在MISO信号线上:CPHA=0,主机机会在每个时钟周期的第一个边沿读取主机发送的数据,CPHA=1,主机也会在每个时钟周期的第二个边沿读取从机发送的数据。

        这两个参数的组合会形成4种工作模式,通常称为模式0、模式1、模式2和模式3。不同的设备可能支持不同的SPI模式,因此在通信时要确保主从双方的模式一致。所以一般的芯片手册上面,厂家会提供该芯片的通信模式

模式0:CPOL=0,CPHA=0;

        模式0:CPOL=0(极性),CPHA(相位)=0:在模式0下面,时钟空闲状态时低电平,第一个边沿采样,所以当第一个周期开始的时候,此时第一个周期时低电平开始,主设备开始发送数据,当第一个周期当中,电平开始拉高产生上升沿的时候,从设备读取数据,当从设备接收到数据之后,在第二个周期当中,时钟信号变为低电平,产生下降沿,主设备发送数据,在第二个周期当中,时钟信号由低电平变为高电平的时候,产生上升沿,从设备接收数据,以此类推,当停止接收的时候,片选信号线会变为低电平,结束通信。

模式1:CPOL=0,CPHA=1;

  • CPOL = 0:时钟空闲状态为低电平。
  • CPHA = 1:数据在时钟信号的下降沿被采样。
  1. 片选信号(SS/CS)

    • 主设备将对应从设备的片选信号拉低,选择该从设备进行通信。
  2. 第一个周期

    • 时钟信号:开始时,SCK保持在低电平。
    • 主设备发送数据
      • 空闲状态是低电平,数据开始第一个周期会将时钟信号拉高,在拉低,第一个边沿为上升沿发送数据。
    • 从设备接收数据
      • 在SCK从高电平下降到低电平时,从设备在这个下降沿采样MOSI线上的数据。
  3. 第二个周期

    • 时钟信号:SCK在这一周期继续在低电平和高电平之间切换。
    • 主设备准备下一个数据位
      • 主设备在时钟信号上升沿时准备下一个数据位。
    • 从设备接收数据
      • 当SCK再次下降到低电平时,从设备在这个下降沿采样MOSI线上的数据。

        主设备在MOSI线上发送数据位,从最高有效位(MSB)开始。由于这时候CPHA=1,第二个边沿产生时,从机会读取数据。

        前面时钟空闲状态为低电平,这时候拉高会产生上升沿,主设备会发送数据,而在第一个周期还没结束的时候,时钟线会由高到低,产生下降沿,从设备接收数据,在第二个周期开始的时候,时钟线被拉高,产生上升沿,因此主设备发送数据,在第二个周期当中,当时钟线由高到低的时候,产生下降沿,从设备接收数据,由此重复循环,就实现通信,当主设备不想通信的时候,就会将cs信号线电平拉低或者拉高来结束通信,cs信号线为高电平或者低电平看从设备的芯片要求来定,因为对于有些芯片来说,厂家设计的时候,规定了这款芯片进行SPI通信的时候,cs线是低电平通信,还是高电平通信。但是绝大部分都是高电平通信,所以在想要和从设备通信之前,必须先将cs线拉高或者拉低,如果你选择的从设备是高电平通信,将cs拉高,当想要结束通信的时候,将cs线拉低。

模式2:CPOL=1,CPHA=0;

  • 时钟信号状态:在模式2中,时钟的空闲状态为高电平。这意味着在没有数据传输时,时钟线保持在高电平状态。

  • 数据传输

    • 主设备在MOSI线上发送数据时,数据的有效传输发生在时钟的下降沿。这是主设备首先拉高时钟线,随后在数据传输期间从高到低产生下降沿。
    • 从设备在下降沿时接收数据。
  • 数据顺序:与模式1相同,主设备从MOSI线上发送数据时,也是从最高有效位(MSB)开始。

  • CS信号线:与模式1一样,CS信号线用于选择从设备,具体的高低电平取决于从设备的设计要求。当CS线有效时,主设备与从设备之间建立通信。

  • 结束通信:同样,主设备在完成数据传输后,通过拉高或拉低CS线来结束通信。

模式3:CPOL=1,CPHA=1;

对于模式3来说,CPHA=1,在第二个边沿读取数据,所以,当第一个边沿时,是用来发送数据的,下降沿发送数据,第二个边沿接收数据。 

4. 数据传输过程

在SPI通信中,数据在SCK的边沿传输。每个时钟周期,MOSI和MISO各发送1位数据,完成全双工通信。数据的传输方向和速率由主机决定,通常采用8位或16位为一个数据帧。

举例:一个简单的数据传输流程
  1. 主机拉低目标从机的SS/CS信号,使该从机进入通信状态。
  2. 主机开始发送SCK信号,同时在MOSI上发送数据位,从机在MISO上返回数据。
  3. 数据传输完成后,主机拉高SS/CS信号,结束与该从机的通信。

5、问题解决

完善一下,在学习的过程当中,我也产生了几个疑问:

1、主设备将数据放到MOSI线上,然后在下降沿进行接收。这种时序安排确保了数据能够在正确的时刻被接收和发送。那么对于MISO线来说,此时收到的数据是来自从设备的吗?

回答:当MOSI线在发送数据的时候,MISO线在接收来自从设备的数据,当MOSI线在发送数据时,MISO线则在接收来自从设备的数据。在SPI通信中,这种时序安排确保了主设备和从设备能够同时进行数据传输。主设备在MOSI线上发送数据的同时,从设备会在MISO线上发送数据,主设备可以在合适的时刻读取MISO线上的数据。这样实现了双向通信。这样是SPI作为全双工通信的特点。

 2、假如主设备当中有多个寄存器地址,从设备怎么确定数据存放在哪个寄存器当中呢,假如从设备当中有多个寄存器地址,主机发送的数据又怎么确定放在哪个寄存器地址下面呢?

回答:

在SPI通信中,主设备和从设备通过特定的协议来管理寄存器地址。这通常涉及以下几个步骤:

  1. 寄存器选择:主设备在发送数据之前,会首先发送一个命令字或寄存器地址。这一部分数据可以通过MOSI线传输给从设备,告诉从设备要访问哪个寄存器。

  2. 数据传输:一旦从设备识别了要访问的寄存器地址,主设备可以随后发送数据到该寄存器,或者从该寄存器读取数据。

  3. 协议约定:这种寄存器选择的方式需要在主设备和从设备之间有一致的协议。例如,可能会有一个固定的命令格式,其中包括寄存器地址和操作类型(读或写)。

  4. 多从设备情形:如果有多个从设备,主设备可以通过选择特定的片选信号(Chip Select,CS)来激活对应的从设备。这些片选信号通常是独立的,每个从设备都有一个对应的信号线。

3、在发送寄存器地址方面,SPI不用确认从设备是否知道我要发送到哪个寄存器地址下面吗?如果是第一段数据是从设备寄存器地址,那么读写是不是已经确定了,不用读写位来确定,因为这时候MOSI已经确定发送和接收的关系了? 和IIC有相似之处吗?

回答:

在SPI中,主设备发送寄存器地址的确是在数据传输的初期阶段,这样从设备就可以知道接下来的数据是要写入哪个寄存器,或者是从哪个寄存器读取。主设备不需要单独确认从设备是否已经“知道”要发送到哪个寄存器,因为在发送寄存器地址后,从设备会根据这个地址来处理接下来的读或写操作。

相对于I2C,SPI的操作较为简单,因为I2C通常需要使用读写位来明确指示接下来是读还是写,而SPI则通过寄存器地址的顺序和主设备的时序来决定。因此,主设备通过发送正确的寄存器地址,已经在一定程度上确定了读写的关系,接下来的数据传输则依赖于协议的定义。


http://www.mrgr.cn/news/64790.html

相关文章:

  • Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)
  • 初识动态规划(由浅入深)
  • 【算法】Prim最小生成树算法
  • 小菜家教平台:基于SpringBoot+Vue打造一站式学习管理系统
  • 《现代工业经济和信息化》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • 深度学习之降维和聚类
  • cangjie仓颉程序设计-数据结构(四)
  • [LeetCode] 面试题08.01 三步问题
  • 企业实现数字化转型需要考虑的方面?
  • LeetCode题练习与总结:超级次方--372
  • ‌SSB在时域上的特征
  • RHCE-SElinux+防火墙
  • Web Broker(Web服务应用程序)入门教程(5)
  • 软考高级之系统架构师之安全攻防技术
  • 固定VMwareIP地址
  • 【Vue】Vue项目创建步骤
  • 无线配置实验
  • 淘宝 API 多语言接入:释放技术开发新潜力
  • DNS域名系统
  • C语言编译所有知识点
  • 记住电机原理及几个重要公式,搞清楚电机so easy
  • 如何确保多进程中的数据一致性?
  • 【基础】使用template替换yaml中的变量
  • 【运动的&足球】足球场上球检测系统源码&数据集全套:改进yolo11-DGCST
  • 【网络面试篇】HTTP(1)(笔记)——状态码、字段、GET、POST、缓存
  • Zypher Network:全栈式 Web3 游戏引擎,服务器抽象叙事的领导者