SPI--原理

SPI–原理

前言:

若对 SPI 通讯协议不了解,可先阅读《SPI 总线协议介绍》文档的内容学习。

关于 FLASH 存储器,请参考“常用存储器介绍”章节,实验中 FLASH 芯片的具体参数,请参考
其规格书《W25Q64》来了解。

大纲

  1. SPI协议
  2. STM32 的 SPI 特性及架构
  3. 通讯过程
  4. SPI 初始化结构体详解

具体案例

SPI协议

物理层

我们主要使用这个来进行高速通讯,下面从物理层和协议层来进行介绍
在这里插入图片描述
SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCK、MOSI、MISO,片选线为 SS,它们的作
用介绍如下:

  1. ) SS ( Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、CS,以下用 NSS 表示。当有多个 SPI 从设备与 SPI 主机相连时,设备的三条总线 SCK、MOSI 及 MISO 同时并联到相同的 SPI 总线上,即所有设备都共用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI 通讯。所以 SPI 通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号,如上图所示
  2. SCK (Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,
    不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 fpclk/2,两个设备之间
    通讯时,通讯速率受限于低速设备
  3. MOSI (Master Output,Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输
    出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机
  4. MISO (Master Input,,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数
    据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机

协议层

SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节
在这里插入图片描述这是一个主机的通讯时序。NSS、SCK、MOSI 信号都由主机控制产生,而 MISO 的信号由从机产生,主机通过该信号线读取从机的数据。MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。
以上通讯流程中包含的各个信号分解如下:

通讯的起始和停止信号

在图 SPI 通讯时序 中的标号处(上图1,6标号),NSS 信号线由高变低,是 SPI 通讯的起始信号。NSS 是每个从机各自独占的信号线,当从机在自己的 NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。在图中的标号处,NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消

数据有效性

SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI 及 MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同样的协定,一般都会采用图 SPI 通讯时序 中的 MSB 先行模式

观察图中的标号处,MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出,在 SCK 的下降沿时被采样。即在 SCK 的下降沿时刻,MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI 及 MISO 为下一次表示数据做准备

SPI 每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制

CPOL/CPHA 及通讯模式

上图的采样和触发的时序只是 SPI 中的其中一种通讯模式,SPI 一共有四种通讯模式,它们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻。为方便说明,在此引入“时钟极性 CPOL”和“时钟相位 CPHA”的概念,

时钟极性 CPOL 是指 SPI 通讯设备处于空闲状态时,SCK 信号线的电平信号 (即 SPI 通讯开始前、NSS 线为高电平时 SCK 的状态)。CPOL=0 时,SCK 在空闲状态时为低电平,CPOL=1 时,则相反

时钟相位 CPHA 是指数据的采样的时刻,当 CPHA=0 时,MOSI 或 MISO 数据线上的信号将会在
SCK 时钟线的“奇数边沿”被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿”采样

下面是四种模式的流程图
分别对应在不同的时钟极性和时钟相位
在这里插入图片描述
在这里插入图片描述

下面是四种模式对应的图,我们平常主要使用模式0和模式3

在这里插入图片描述

STM32 的 SPI 特性及架构

框架

在这里插入图片描述

通讯引脚

SPI 的所有硬件架构都从图 SPI 架构图 中左侧 MOSI、MISO、SCK 及 NSS 线展开的。STM32 芯片有多个 SPI 外设,它们的 SPI 通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引脚,见表 STM32F10x 的 SPI 引脚 。关于 GPIO 引脚的复用功能,可查阅《STM32F10x 规格书》,以它为准

中 SPI1 是 APB2 上的设备,最高通信速率达 36Mbtis/s,SPI2、SPI3 是 APB1 上的设备,最高通信速率为 18Mbits/s。除了通讯速率,在其它功能上没有差异。其中 SPI3 用到了下载接口的引脚,这几个引脚默认功能是下载,第二功能才是 IO 口,如果想使用 SPI3 接口,则程序上必须先禁用掉这几个 IO 口的下载功能。一般在资源不是十分紧张的情况下,这几个 IO 口是专门用于下载和调试程序,不会复用为 SPI3

时钟控制逻辑

SCK 线的时钟信号,由波特率发生器根据“控制寄存器 CR1”中的 BR[0:2] 位控制,该位是对 fpclk时钟的分频因子,对 fpclk 的分频结果就是 SCK 引脚的输出时钟频率,计算方法见表 BR 位对 fpclk的分频

在这里插入图片描述
其中的 fpclk 频率是指 SPI 所在的 APB 总线频率,APB1 为 fpclk1,APB2 为 fpckl2

下面是对应的寄存器
在这里插入图片描述
控制波特率和时钟极性和时钟相位和主从机
在这里插入图片描述

数据控制逻辑

SPI 的 MOSI 及 MISO 都连接到数据移位寄存器上,数据移位寄存器的数据来源及目标接收、发送缓冲区以及 MISO、MOSI 线。当向外发送数据的时候,数据移位寄存器以“发送缓冲区”为数据源,把数据一位一位地通过数据线发送出去;当从外部接收数据的时候,数据移位寄存器把数据线采样到的数据一位一位地存储到“接收缓冲区”中。通过写 SPI 的“数据寄存器 DR”把数据填充到发送缓冲区中,通讯读“数据寄存器 DR”,可以获取接收缓冲区中的内容。其中数据帧长度可以通过“控制寄存器 CR1”的“DFF 位”配置成 8 位及 16 位模式;配置“LSBFIRST 位”可选择 MSB 先行还是 LSB 先行
在这里插入图片描述
在这里插入图片描述

整体控制逻辑

整体控制逻辑负责协调整个 SPI 外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的 SPI 模式、波特率、LSB 先行、主从模式、单双向模式等等。在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,我们只要读取状态寄存器相关的寄存器位,就可以了解 SPI 的工作状态了。除此之外,控制逻辑还根据要求,负责控制产生 SPI 中断信号、DMA 请求及控制 NSS 信号线

通讯过程

在这里插入图片描述
主模式收发流程及事件说明如下:
(1) 控制 NSS 信号线,产生起始信号 (图中没有画出);

(2) 把要发送的数据写入到“数据寄存器 DR”中,该数据会被存储到发送缓冲区;

(3) 通讯开始,SCK 时钟开始运行。MOSI 把发送缓冲区中的数据一位一位地传输出去;MISO 则把数据一位一位地存储进接收缓冲区中;

(4) 当发送完一帧数据的时候,“状态寄存器 SR”中的“TXE 标志位”会被置 1,表示传输完一帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,“RXNE 标志位”会被置 1,表示传输完一帧,接收缓冲区非空;

(5) 等待到“TXE 标志位”为 1 时,若还要继续发送数据,则再次往“数据寄存器 DR”写入数据即可;等待到“RXNE 标志位”为 1 时,通过读取“数据寄存器 DR”可以获取接收缓冲区中的内容

假如我们使能了 TXE 或 RXNE 中断,TXE 或 RXNE 置 1 时会产生 SPI 中断信号,进入同一个中断服务函数,到 SPI 中断服务程序后,可通过检查寄存器位来了解是哪一个事件,再分别进行处理。也可以使用 DMA 方式来收发“数据寄存器 DR”中的数据

这里对标志位再进行说明,当我们的发送缓冲区为空时,此时TXE为1,我们可以往里写入数据,而当我们写入数据之后,TXE立马会置为0,因为SPI是同步发送的,所以当RXNE为1时,代表接收缓冲区不为空,也代表着发送完毕

SPI 初始化结构体详解

typedef struct{uint16_t SPI_Direction; /* 设置 SPI 的单双向模式 */uint16_t SPI_Mode; /* 设置 SPI 的主/从机端模式 */uint16_t SPI_DataSize; /* 设置 SPI 的数据帧长度,可选 8/16 位 */uint16_t SPI_CPOL; /* 设置时钟极性 CPOL,可选高/低电平 */uint16_t SPI_CPHA; /* 设置时钟相位,可选奇/偶数边沿采样 */uint16_t SPI_NSS; /* 设置 NSS 引脚由 SPI 硬件控制还是软件控制
*/uint16_t SPI_BaudRatePrescaler; /* 设置时钟分频因子,fpclk/分频数 =fSCK */uint16_t SPI_FirstBit; /* 设置 MSB/LSB 先行 */uint16_t SPI_CRCPolynomial; /* 设置 CRC 校验的表达式 */} SPI_InitTypeDef;

这些结构体成员说明如下,其中括号内的文字是对应参数在 STM32 标准库中定义的宏:

(1) SPI_Direction
本成员设置 SPI 的通讯方向,可设置为双线全双工(SPI_Direction_2Lines_FullDuplex),双线只接收 (SPI_Direction_2Lines_RxOnly),单线只接收 (SPI_Direction_1Line_Rx)、单线只发送模式(SPI_Direction_1Line_Tx)

(2) SPI_Mode
本成员设置 SPI 工作在主机模式 (SPI_Mode_Master) 或从机模式 (SPI_Mode_Slave ),这两个模式的最大区别为 SPI 的 SCK 信号线的时序,SCK 的时序是由通讯中的主机产生的。若被配置为从机模式,STM32 的 SPI 外设将接受外来的 SCK 信号

(3) SPI_DataSize
本成员可以选择 SPI 通讯的数据帧大小是为 8 位 (SPI_DataSize_8b) 还是 16 位 (SPI_DataSize_16b)

(4) SPI_CPOL 和 SPI_CPHA
这两个成员配置 SPI 的时钟极性 CPOL 和时钟相位 CPHA,这两个配置影响到 SPI 的通讯模式,关于 CPOL 和 CPHA 的说明参考前面“通讯模式”小节。时钟极性 CPOL 成员,可设置为高电平 (SPI_CPOL_High) 或低电平 (SPI_CPOL_Low )。时 钟 相 位 CPHA 则 可 以 设 置 为 SPI_CPHA_1Edge(在 SCK 的 奇 数 边 沿 采 集 数 据) 或
SPI_CPHA_2Edge(在 SCK 的偶数边沿采集数据)

(5) SPI_NSS
本成员配置 NSS 引脚的使用模式,可以选择为硬件模式 (SPI_NSS_Hard ) 与软件模式(SPI_NSS_Soft ),在硬件模式中的 SPI 片选信号由 SPI 硬件自动产生,而软件模式则需要我们亲自把相应的 GPIO 端口拉高或置低产生非片选和片选信号。实际中软件模式应用比较多

(6) SPI_BaudRatePrescaler
本成员设置波特率分频因子,分频后的时钟即为 SPI 的 SCK 信号线的时钟频率。这个成员参数可设置为 fpclk 的 2、4、6、8、16、32、64、128、256 分频

(7) SPI_FirstBit
所有串行的通讯协议都会有 MSB 先行 (高位数据在前) 还是 LSB 先行 (低位数据在前) 的问题,而STM32 的 SPI 模块可以通过这个结构体成员,对这个特性编程控制

(8) SPI_CRCPolynomial
这是 SPI 的 CRC 校验中的多项式,若我们使用 CRC 校验时,就使用这个成员的参数 (多项式),来计算 CRC 的值

当我们配置好结构体里面的成员,调用SPI_Init函数来进行初始化,然后还要调用SPI_Cmd来使能SPI

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

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

相关文章

glb数据格式

glb数据格式 glb 文件格式只包含一个glb 文件,文件按照二进制存储,占空间小 浏览 浏览glb工具的很多,ccs,3D查看器等都可以,不安装软件的话用下面网页加载就可以,免费 glTF Viewer (donmccurdy.com) glb…

Makefile 学习笔记(一)gcc编译过程

环境准备 .linux 系统(虚拟机) VS code linux 编译过程 预处理: 把.h .c 展开形成一个文件.宏定义直接替换 头文件 库文件 .i 汇编: .i 生成一个汇编代码文件 .S 编译: .S 生成一个 .o .obj 链接: .o 链接 .exe .elf gcc c语言 g c语言 gcc的使用 …

MySQL之表内容的增删改查(含oracel 9i经典测试雇佣表下载)

目录 一:Create 二:Retrieve 1.select列 2.where条件 3.结果排序 4. 筛选分页结果 三:Update 四:Delete 1.删除数据 2. 截断表 五:插入查询结果 六:聚合函数 七:group by子句的使用 表内容的CRUD操作 : Create(创建), Retrieve(读取)…

数据结构之栈(python)

栈(顺序栈与链栈) 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作(包含入栈和出栈)2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

吐血整理资料后,测试面试相关的资料大全

最近假期收集资料的过程真的让我吐血。 在博客上随便搜一点资料,好多只能看一般,或者打着分享资源,但实际上并不是了。而且大部分资料就是网上找的,恰饭不好评价,但体验真的好差啊! 我搜集了很多面试资料…

流程图怎么画?3个好用的在线流程图软件推荐,绘图没烦恼!

目录 什么是流程图? 为什么需要使用流程图? 流程图中各种图形的含义 如何制作流程图? 小结:流程图如何制作? 流程图是表达工作流程或者系统操作过程的有效工具,被广泛应用于各个行业和领域。…

Centos7环境下Hive的安装

Centos7环境下Hive的安装 前言一、安装Hive1.1 下载并解压1.2 配置环境变量1.3 修改配置1. hive-env.sh2. hive-site.xml 1.4 拷贝数据库驱动1.5 初始化元数据库报错 1.6 安装MySQL1.7 启动 二、HiveServer2/beeline2.1 修改Hadoop配置2.2 修改Hive配置2.2 启动hiveserver22.3 …

2024/9/16 dataloader、tensorboard、transform

一、pytorch两大法宝元素 假设有一个名为pytorch的包 dir():用于打开包,看里面的内容 help():用于查看具体的内容的用处 二、python文件,python控制台和jupyter的使用对比 三、pytorch读取数据 pytorch读取数据主要涉及到两个类&#xff1…

基于 PyQt5 和 OpenCV 进行图像处理操作的GUI工具初版

为了实现一个基于 PyQt5 和 OpenCV 的图形用户界面(GUI),要求如下: 左边显示加载的图片。 中间提供各种对图片进行处理的操作方法(如灰度化、模糊处理等)。 右边显示处理后的效果图。 接下来我将详细讲解如…

【C语言零基础入门篇 - 5】:探索C语言中丰富多样的选择和循环结构

文章目录 选择分支结构if选择结构if...else...选择结构if...else if...else 嵌套选择结构switch多分支结构 循环结构for 循环while 循环do … while 循环 跳转语句 选择分支结构 if选择结构 基本格式:if(表达式1)语句1; 功能:如果表达式1…

坚持的力量--完成向CSDN迁移500篇技术文章阶段小记-以此自勉

前言:本文为迁移前的博客中的文章《坚持的力量-写给第1000篇文章笔记》发表于 publish:May 14, 2021 -Friday,作为原个人博客中累计写满1000篇文章的总结和鼓励。因在向CSDN迁移文章的过程中进行了一些文章合并等调整,总文数大量下降&#xf…

【建设方案】固定资产信息系统建设方案(功能清单列表2024word原件)

固定资产管理系统需求要点: 1. 实现公司内部固定资产管理全生命周期管理,包括资产采购、资产入库、资产领用、资产借用、资产归还、资产报废、资产维修、资产调拨等全过程管理。 2. 可实现集团内部固定资产盘点管理,包括盘点计划、盘点查询等…

Python数据分析与可视化的全面指南

目录 引言 一、Python数据分析基础 1. 为什么选择Python进行数据分析? 2. 常用的数据分析库 二、环境配置 1. 安装Python 2. 安装Anaconda(可选) 3. 创建虚拟环境 4. 安装必要的库 三、数据分析流程 四、数据处理与分析 1. 导入库…

【PHP代码审计】PHP基础知识

🌝博客主页:菜鸟小羊 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 php简介 php是什么? php(全称:Hypertext Preprocessor,即超文本预处理器&…

圆环加载效果

效果预览 代码实现 from PyQt5.QtCore import QSize, pyqtProperty, QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QColor, QPainter from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayoutclass Cir…

数据与结构算法平衡二叉树详解叉树--基本概念

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好…

图解Redis 01 | 初识Redis

什么是 Redis? Redis 是一种基于内存的数据库,所有的数据读写操作都在内存中完成,因此读写速度非常快。它被广泛应用于缓存、消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务需求,如 String、Hash、List、…

环形数组与单向链表的队列实现(Queue)

什么是队列 队列是一种重要的线性数据结构,具有先进先出(FIFO)的特性。元素的插入操作称为入队,删除操作称为出队。队列在许多计算机科学应用中非常常见,如任务调度和数据缓冲等。 在实现队列时,可…

路由策略PBR

文章目录 策略路由PBR概述本地流量接口策略 策略路由 策略路由和路由策略的区别: 策略路由可以不按照路由表进行转发路由策略主要控制路由信息的引入、发布和接受等,主要靠 RIB和FIB PBR概述 比路由策略耗资源,直接跳过路由表,数…

Pytorch详解-模型模块(RNN,CNN,FNN,LSTM,GRU,TCN,Transformer)

Pytorch详解-模型模块 Module & parameterModule初认识forward函数 ParameterPytorch中的权重、参数和超参数 Module容器-ContainersSequentialModuleListModuleDictParameterList & ParameterDict 常用网络层LSTM输入和输出 GRUConvolutional Layers卷积层的基本概念常…