SPI 详解

介绍

串行外设接口是微控制器用来与外设(如 SRAM、SD 卡、移位寄存器、传感器等)通信的最常见通信协议之一。它是一种同步、全双工、基于主从的协议。它支持高速数据传输,并且 SPI 协议中的数据速度 (bps) 和时钟频率 (Hz) 之间存在直接关系。例如,如果 SPI 的时钟频率为 36 MHz,则传输速度将为 36Mbps。因此,SPI 协议的传输速度没有限制。它完全取决于设备支持的时钟频率。谈到连接,SPI 是一个 4 线接口,具有以下信号线:

  • 主输出从输入 (MOSI)
  • 主入从出 (MISO)
  • 时钟(SCLK)
  • 从属选择

SPI 接口

SPI接口
MISO 和 MOSI 是传输数据的主要数据线。SCLK 是主机生成的时钟信号,用于对总线上的数据进行采样。最后,是一条有效低信号线(非活动时拉高,使用时拉低),用于选择总线上的从机。

使用 SPI 连接设备简单明了。主设备的每个引脚都连接到从设备相同的引脚,不会造成混淆。主设备的 MOSI 连接到从设备的 MOSI,主设备的 MISO 连接到从设备的 MISO。SCLK 也是如此。

SPI数据传输

的主要优势之一是不需要起始位和停止位,因为总线的 SCLK 线会同步数据。SCLK 线会同步数据线上位的移位和采样,本文后面会详细解释这一点。

至于可传输的位数,SPI 协议支持的字长范围为 3-16 位,但标准为 8 位。如果主机和从机想要一次共享 2 个字节,它们可以选择 16 位字长并使用 16 位数据寄存器(如果 MCU 上有的话)或将其以两个 8 位数据包的块形式传输。

SPI 还支持连接到同一主设备的多个从设备。对于每个从设备,必须有一条单独的 SS 线。数据交换仅发生在主设备和选定的从设备之间;总线上其余的从设备保持不活动状态,无法使用其 MOSI 和 MISO 线。图 2 显示了多个从设备设置的连接。
SPI总线上连接到主机的多个从设备
但 SPI 并非完美无缺。SS 线只是数字 I/O 引脚。因此,可连接的从属设备数量受到微控制器上可用 I/O 引脚的限制。

为什么要使用带有 SPI 的时钟?

可能会出现这样的问题:如果串行协议可以很好地异步工作,为什么还要引入时钟线?如果您读过我们的 UART 教程,您就会知道通过 UART 通信的设备没有公共时钟来同步它们之间的数据传输。通信设备依靠其内部时钟来采样数据。因此,时钟需要精确,否则会收到垃圾数据。此外,额外的位用于标记数据帧的开始和结束,这会给大量传输带来大量开销。但是对于 SPI 来说,它无需标记数据帧的开始和结束,并在时钟信号的上升沿或下降沿同步数据。让我们看看 SPI 是如何实现这一点的。

在继续之前,我们将解释本教程下一部分中将使用的两个重要术语:

具有 CPOL 和 CPHA 的 SPI 时钟模式

四种模式下的数据采样和移位

1. SPI 模式 0 - CPOL:0,CPHA:0
SPI模式0
数据在时钟信号的上升沿被采样,并在时钟信号的下降沿被移出。这里,时钟极性在理想状态下为低;当没有数据传输时,时钟线为低。

2. SPI 模式 1 - CPOL:0,CPHA:1
SPI模式1
数据在下降沿采样,在上升沿移出。此处,时钟极性与前一种情况(模式 0)类似;理想状态下,当没有数据传输时,时钟线处于低位。

3. SPI 模式 2 - CPOL:1,CPHA:0
SPI模式3
数据在时钟的上升沿被采样,在时钟的下降沿被移出。这里,时钟极性在理想状态下为高。

4. SPI 模式 3 - CPOL:1,CPHA:1
SPI模式4
数据在时钟的下降沿采样,在时钟的上升沿移出。时钟极性与 SPI 模式 - 3 类似,理想状态下为高电平。

嵌入式工程师必须了解 SPI 时钟模式,因为从设备通常预先配置了其中一种模式。您可以在相应的数据表中找到从设备的时钟操作模式。一旦我们确定了从设备的操作模式,就可以相应地配置主设备以通过 SPI 总线与从设备进行通信。

SPI寄存器中的数据接收与发送

支持 SPI 协议的微控制器有一组专用的控制和数据寄存器。这些专用寄存器配置时钟模式(如上文所述)并在通信设备之间传输和接收数据。

SPI 遵循 SISO(串行输入、串行输出)方法 - 每发送一个位,就会收到一个新位。因此,在每个时钟脉冲上,主机数据寄存器中的一个位通过 MOSI 线传输到从机数据寄存器,同时,从机数据寄存器中的一个位通过 MISO 线传输回主机数据寄存器

数据传输和接收过程直观地显示如下。我们将时钟控制位视为 CPHA = 0 和 CPOL = 0:

  1. 数据存储在主机和从机各自的 SPI 数据寄存器中。
    在这里插入图片描述

  2. 开始通信时,主机发送时钟信号,并通过启用特定从机的线路来选择连接的从机中的任意一个。从机被 SS 线路上的“0”信号中断并准备传输。主机和从机上的 LSB 分别从 MOSI 和 MISO 线路上的寄存器中移出。需要注意的是,线路保持低位,直到所有位都传输完毕。
    在这里插入图片描述

  3. 主机和从机均在 SCLK 线的上升沿(CPHA = 1)采样 LSB,并将其存储在其数据寄存器的 MSB 中。
    在这里插入图片描述

  4. 现在,数据寄存器的后续位在时钟脉冲的下降沿移出,清除 MSB 以读取下一位,新的 LSB 在数据线上移出。同样,在上升沿,对下一位进行采样并存储在寄存器中。
    在这里插入图片描述

  5. 这个过程在每个时钟脉冲上重复,直到寄存器上的所有 8 位都从主机传输到从机。因此,数据从主机逐字节发送到从机,反之亦然。数据传输完成后,主机通过禁用线路(将其拉高)来结束通信。
    在这里插入图片描述

SPI 中的菊花链方法

在我们上面讨论的 SPI 配置中,从设备需要单独的线路与主设备进行通信,但有时可用作线路的数字引脚数量可能少于所需数量。可以使用菊花链方法消除此问题。

SPI 接口
在菊花链方法中,所有从设备的引脚都连接到主设备的单个数字 I/O 引脚。下面显示了一个主设备带两个从设备的菊花链配置。所有从设备都与主设备共享一条公共 SCLK 线路,但其他引脚的连接方式不同。

主设备的 MOSI 连接到从设备 1 的 MOSI,但这次,从设备 1的 MISO连接到从设备 2 的 MOSI,而从设备 2的 MISO又连接到主设备的 MISO。这可能让人难以理解,因此下图应该会有所帮助。
SPI菊花链链接
类似地,如果您在菊花链配置中设置了 N 个从属设备,那么主设备的 MOSI 再次连接到从属设备 1的 MOSI,而从属设备 1的 MISO连接到从属设备 2的 MOSI。同样,从属设备 2的 MISO连接到从属设备 3 的 MOSI,依此类推,直到第 N 个从属设备。最后,第 N 个从属设备的 MISO 连接回主设备的 MISO。

SPI数据传输
为了理解菊​​花链配置中的数据传输,让我们考虑与上图 5 所示的相同配置。主设备希望分别将数据包 1 和数据包 2 发送到从设备 1 和从设备 2。菊花链配置中的数据包传输将按以下方式进行:

  1. 要启动通信,主机将通过拉低 SS 线来启用它,从而唤醒两个从机。
    在这里插入图片描述
  2. 主机随后将发送数据包 2 给从机 1,该数据包将存储在从机 1 的缓冲区中。
    在这里插入图片描述
  3. 根据标准 SPI 协议,数据包大小为 8 位。因此,在恰好 8 个时钟周期之后,从设备 1 将开始通过 MISO-MOSI 连接向从设备 2 发送数据包 2,同时从主设备接收数据包 1。
    在这里插入图片描述
  4. 一旦两个数据包都到达了目的地,从设备 2 就会通过它们之间的 MISO-MISO 连接发送响应字节来通知主设备。收到响应字节后,主设备会通过禁用 SPI 总线上的 SS 线来结束通信。
    在这里插入图片描述
    使用菊花链配置可减少 𝑆𝑆 线路所需的多个 I/O 引脚的要求。但是,随着从属设备数量的增加,它也会导致数据传输延迟。在实施菊花链方法时,确保所有芯片使用相同的时钟边沿和空闲时钟状态至关重要。如果设备不使用相同的时钟条件,则可能会出现不可靠的通信、数据损坏或设备之间完全无法交换数据的情况。

结论

SPI 通信协议非常适合与 SD 卡模块、各种传感器以及具有强大诊断工具的工业测试进行通信。它具有高速、简单和低成本等优点,但也有局限性,例如范围有限并且需要比其他通信协议更多的引脚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145623.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[Redis][Hash]详细讲解

目录 0.前言1.常见命令1.HSET2.HGET3.HEXISTS4.HDEL5.HKEYS6.HVALS7.HGETALL8.HMGET9.HLEN10.HSETNX11.HINCRBY12.HINCRBYFLOAT 2.内部编码1.ziplist(压缩链表)2.hashtable(哈希表) 3.使用场景4.缓存方式对比1.原⽣字符串类型2.序列化字符串类型3.哈希类型 0.前言 在Redis中&am…

帧率和丢帧分析理论

一、丢帧问题概述 应用丢帧通常指的是在应用程序的界面绘制过程中,由于某些原因导致界面绘制的帧率下降,从而造成界面卡顿、动画不流畅等问题。以60Hz刷新率为例子,想要达到每秒60帧(即60fps)的流畅体验,每…

鹏哥C语言复习——函数栈帧的创建和销毁

目录 演示用代码: 提示:后文讲解时后缀为h的指的是16进制表示 疑惑1:自定义函数、库函数都是在main函数内部调用,那么是什么调用了main函数呢? 疑惑2:如何观察ebp、esp等寄存器的运行? 疑惑…

提升效率的AI工具集 - 轻松实现自动化

在这个快节奏、高效率的社会中,我们每个人都渴望能够找到提升工作效率的捷径。幸运的是,随着人工智能(AI)技术的迅猛发展,越来越多的AI工具涌现出来,为我们提供了强大的支持。这些工具不仅能够帮助我们提高…

算法-分治和逆序

分治法(Divide and Conquer)是一种重要的算法设计范式,它通过将复杂的问题分解成更小、更易于管理和解决的子问题,然后递归地解决这些子问题,最后将子问题的解合并以得到原问题的解。分治法通常用于排序、搜索、数学计…

基于STM32F103C8T6单片机的DDS信号源设计

本设计能够输出三角波信号、方波信号和正弦波信号,主要由STM32F103C8T6最小核心板、电源供电电路模块、AD9833电路模块、矩阵按键电路模块、LCD1602液晶显示模块等组成。在设计中,使用STM32F103C8T6作为控制芯片,结合LCD1602液晶显示器,矩阵键…

稳了,搭建Docker国内源图文教程

大家好,之前分享了我的开源作品 Cloudflare Workers Proxy,它的作用是代理被屏蔽的地址,理论上支持代理任何被屏蔽的域名,使用方式也很简单,只需要设置环境变量 PROXY_HOSTNAME 为被屏蔽的域名,最后通过你的…

Unity多语言插件I2 Localization国际化应用

【就不收费了,要个关注不过分吧】 【图片来自插件官网,侵删】 前言 目前游戏往往都不会仅局限于国内语言,为了适应产品都要做国际化适配,因此会用到这个插件,这个插件要付费,因此请前往unity官网进行下载…

秒懂Linux之消息队列与信号量(了解)

目录 前言 消息队列原理 信号量理论 信号量原理 IPC资源 前言 消息队列与信息量目前已经不常用了,大家也可以参考共享内存去了解基本原理即可。 消息队列原理 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型&…

mfc140u.dll引发的软件故障怎么破?mfc140u.dll文件损坏的解决办法全知道!

当这个重要的 DLL 文件丢失或损坏时,用户可能会收到一个错误消息,提示 “程序无法启动,因为计算机中缺失 mfc140u.dll” 或类似的提示。这种情况不仅令人困扰,而且可以干扰正常的工作流程,尤其是当您依赖特定软件完成日…

KMP算法的实现

这是C算法基础-数据结构专栏的第二十六篇文章,专栏详情请见此处。 引入 KMP算法是一种可以快速查找某一字符串在一个文本中的所有出现的算法。 下面我们就来讲KMP算法的实现。 定义 Knuth–Morris–Pratt 算法,简称KMP算法,是由Knuth、Pratt…

基于VUE的教师教学质量网络评测评价统计分析系统

1、 选题的背景与意义 21世纪是信息化的世纪,我们的一些生活习惯因为计算机而发生改变,我们也逐渐习惯于通过计算机的各项功能来获得便利。这其中所带来的挑战和机遇为各行业的发展指明了一个方向。教学质量评测是一项琐碎而又十分细致的工作&#xf…

【永磁同步电机(PMSM)】 3. 基于Matlab 的仿真与控制

【永磁同步电机(PMSM)】 3. 基于Matlab 的仿真与控制 1. 电机的仿真与控制2. BLDC 电机与 PMSM 电机3. BLDC 的方波控制4. 磁场定向控制(FOC)5. 空间矢量调制 (SVM)6. PMSM 模型的频率响应估计 电机仿真和控制是能源生产、汽车、航…

Java对象一口气讲完!φ(* ̄0 ̄)

Java Object类 Java面向对象设计 - Java Object类 Java在java.lang包中有一个Object类。 所有Java类都直接或间接扩展Object类。 所有Java类都是Object类的子类Object类是所有类的超类。 Object类本身没有超类。 Object类的引用变量可以保存任何类的对象的引用。 以下代…

OSPFv3协议几类LSA介绍

OSPFv3协议介绍 与OSPFv2相比,OSPFv3在工作机制上与OSPFv2基本相同;但为了支持IPv6地址格式,OSPFv3对OSPFv2做了一些改动。OSPFv3基于OSPFv2基本原理增强,是一个独立的路由协议(v3不兼容v2)协议号仍然是89…

竹云赋能“中国·贵州”全省统一移动应用平台建设,打造政务服务“新引擎”

近日,2024中国国际大数据产业博览会在贵州贵阳圆满落幕。会上,由贵州省政府办公厅牵头建设的“中国贵州”全省统一移动应用平台正式发布,聚焦民生办事、政务公开、政民互动、扁平高效、数据赋能五大模块,旨在打造公平普惠的服务平…

Hbase操作手册

一:Hbase 创建数据库表 1.进入hbase shell 2.创建数据库表的命令:create 表名, 列族名1,列族名2,列族名N 3.如果想查看所有数据库表,可以使用list 命令: 4.可以看到,刚创建的数据库表user 已经在数据库表的列表中&…

单元格左边放文字右边放按钮

1 . 代码 /* 添加到你的CSS文件中 */ .switch-td { display: flex; justify-content: space-between; /* 两端对齐&#xff0c;这样文本和开关会分别靠左和靠右 */ align-items: left; /* 垂直居中 */ } /* 如果你不想改变其他<td>的默认左对齐&#xff0c;…

TTF与图片之间的相互转换,使用python,potrace,fontforge

概述 TTF是字体文件格式&#xff0c;里面存储的是矢量化的字体信息。TTF与图片之间的相互转换简单描述如下&#xff1a; 使用python中的PIL&#xff08;pillow&#xff09;图像库可以实现TTF转图片使用potrace可以将图片转为矢量文件svg&#xff0c;再进一步使用fontforge可以…

一天认识一个硬件之连接线

我们在日常工作生活中经常会用到许多连接线&#xff0c;比如视频线&#xff0c;USB线&#xff0c;但是他们的区别在哪里&#xff0c;可能太不清楚&#xff0c;今天就来给大家分享一下。 HDMI线 特点&#xff1a;HDMI线是一种全数字化视频和声音发送接口&#xff0c;可以发送未…