嵌入式——串行外围设备接口(SPI)

news2024/11/16 0:02:29

目录

一、初识SPI

1. 介绍

2. 特性

补:

二、物理层

1. SS (Slave Select)

2. SCK (Serial Clock)

3. MOSI (Master Output, Slave Input)

4. MISO (Master Input, Slave Output)

三、协议层

1. 基本通讯过程

2. 通信的起始和停止信号

3. 数据有效性

4. CPOL/CPHA及通信模式

四、SPI架构

1. 通信引脚

2. 时钟控制逻辑

3. 数据控制

4. 整体控制逻辑

五、通信过程


一、初识SPI

1. 介绍

        SPI (Serial Peripheral Interface,串行外围设备接口) 协议是由摩托罗拉公司提出的通信协议。它被广泛地使用在ADC、LCD等设备与MCU间,适用于对通信速率要求较高的场合

2. 特性

补:

(1)主或从 操作。

(2)支持 多主模式。

(3)8 个 主模式 波特率 预分频 系数(最大为 fpclk / 2)。

(4)从 模式频率(最大为 fpclk / 2)。

(5)主模式 和 从模式的 快速通信。

(6)主模式 和 从模式 下均可以 由软件或硬件 进行 NSS管理主 / 从操作模式的 动态改变。

(7)可编程的 时钟极性 和 相位。

(8)可编程的 数据顺序,MSB 在前或 LSB 在前。

(9)可 触发中断 的专用发送 和 接收标志。

(10)SPI 总线 忙状态 标志。

(11)支持 DMA功能 的 1 字节 发送和接收 缓冲器:产生发送 和 接受请求。

二、物理层

        SPI通信使用 3 条总线及片选线,3条总线分别为SCK、MOSI、 MISO,片选线为SS

1. SS (Slave Select)

        从设备选择信号线,常称为片选信号线,也称为NSS、CS。

        当有多个SPI从设备与SPI主机相连时,设备的其他信号线SCK、MOSI及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同使用这 3条总线;而每个从设备都有独立的一条NSS信号线,本信号线独占主机的一个引脚,即有多少个 从设备,就有多少条片选信号线

        IIC协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通信;而SPl协议中没有设备地址,它使用 NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中(片选有效),主机便可开始与被选中的从设备进行SPI通信。所以SPI通信以NSS线置低电平为开始信号,以 NSS线 被拉高作为结束信号。

2. SCK (Serial Clock)

        时钟信号线,用于通信数据同步由通信主机产生,决定了通信的速率不同的设备支持的最高时钟频率不一样两个设备之间通信时,通信速率受限于低速设备

3. MOSI (Master Output, Slave Input)

        主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即该线上数据的方向为主机到从机

4. MISO (Master Input, Slave Output)

        主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即该线上数据的方向为从机到主机

三、协议层

1. 基本通讯过程

        NSS、SCK、MOSI信号都由主机控制产生,而 MISO的信号由 从机产生,主机通过该 信号线读取 从机的数据。MOSI 与 MISO的信号 只在 NSS为低电平 的时候才有效,在 SCK的 每个时钟周期,MOSI 和 MISO 传输一位数据

2. 通信的起始和停止信号

        ① 处 NSS信号 由高变低,是SPI通信的 起始信号。NSS是 每个从机各自 独占的 信号线,当从机在自己的 NSS线检 测到起始信号后,就知道自己被 主机选中,开始准备与主机通信

        ⑥ 处 NSS信号 由低变高,是SPI通信的 停止信号,表示本次通信结束,从机的选中状态 被取消

3. 数据有效性

        SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。

        MOSI 及 MISO 数据线 在SCK 的每个时钟周期 传输 一位数据,且 数据输入输出是同时进行的。数据传输时,MSB先行或LSB先行并没有作硬性规定( 一般都会采用MSB先行模式

        MOSI 及 MISO 的数据在 SCK的 上升沿 期间 变化输出,在 SCK的 下降沿时被采样( MOSI 及MISO 的数据有效 )高电平时 表示数据 1,为低电平时 表示数据 0。其他时刻数据无效,MOSI 及 MISO 为下一次表示数据做准备。

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

4. CPOL/CPHA及通信模式

        为方便说明 SPI 的 4种通信模式,引入了“ 时钟极性CPOL ” 和 “ 时钟相位CPHA ” 的概念,用于区别 总线空闲时SCK的时钟状态以及数据采样时刻

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

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

        无论 CPOL 是 0 还是 1 ,因为配置的 时钟相位 CPHA=0采样时刻 都是在 SCK 的奇数边沿注意当 CPOL=0 的时候,时钟的奇数边沿 是 上升沿,而 CPOL=1 的时候,时钟的 奇数边沿是下降沿 )。所以 SPI 的采样时刻 不是由 上升 / 下降沿 决定的

        MOSI 和 MISO 数据线 的有效信号 在 SCK的奇数边沿 保持不变数据信号 将在 SCK奇数边沿时被采样在非采样时刻,MOSI 和 MISO 的有效信号 才发生切换

        CPHA =1 时,不受CPOL的影响,数据信号在 SCK的 偶数边沿 被采样

        由 CPOL 及 CPHA 的 不同状态,SPl 分成了 4种模式主机与从机 需要工作 在相同的模式下才可以 正常通信( 实际中采用较多的是 “ 模式0 ” 与 “ 模式3 ”  )。

四、SPI架构

1. 通信引脚

        SPI的所有硬件架构 都是从左侧的 MOSI、 MISO、SCK及NSS线 展开的。

        SPI1 是APB2上的设备,最高通信速率达36Mbps,SPI2、SPI3 是APB1上的设备,最高通信速率为18Mbps。除了通信速率,在其他功能上没有差异。SPI3 用到了下载接口的引脚,这几个引脚 默认功能 是下载,第二功能 才是 lO口。如果 想使用SPI3接口,则在程序上必须 先禁用这几个 lO口 的下载功能。

2. 时钟控制逻辑

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

        fpclk频率 是指SPl所在的 APB总线频率,APB1为 fpclk1,APB2为 fpclk2。

        通过 配置 控制寄存器CR 的CPOL位 及 CPHA位,可以把 SPI设置成 前面分析的 4种SPI 模式。

3. 数据控制

        SPI 的 MOSI 及 MISO 都连接到 数据移位寄存器上,数据移位寄存器的数据来源于 目标接收、发送缓冲区以及MISO、MOSI线

        当向外发送数据的时候,数据移位寄存器以 “ 发送缓冲区 ” 为数据源,通过写 SPI的 数据寄存器 DR 把数据填充到 发送缓冲区 中,并把数据一位位地通过数据线 发送出去。当 从外部接收数据的时候,数据移位寄存器 把数据线采样到的数据一位位地存储到 “ 接收缓冲区 〞中,通过读 数据寄存器 DR,可以 获取接收缓冲区 中的内容。

        其中 数据帧长度 可以通过 控制寄存器 CR1 的 DFF位 配置成 8位 及16位 模式;配置LSBFIRST位 可选择 MSB先行 还是 LSB先行。

4. 整体控制逻辑

        负责 协调整个SPI外设,其工作模式根据 配置的控制寄存器 (CR1/CR2) 的参数而改变。

        在外设工作时,控制逻辑会根据外设的工作状态修改状态寄存器SR,只要读取状态寄存器相关的寄存器位,就可以了解 SPI的工作状态

        控制逻辑还根据要求,负责控制产生 SPI中断信号、DMA请求 及 控制 NSS信号线

        实际应用中,一般不使用 STM32 SPl 外设 的 标准 NSS信号线,而是更简单地 使用普通的 GPIO,软件控制 它的电平输出,从而 产生通信起始 和 停止信号

五、通信过程

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 中的数据。


                                                                                                                        后面再进行补充。

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

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

相关文章

AI助力农作物自动采摘,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建作物番茄采摘场景下番茄成熟度检测识别分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物,专家设计出来了很多用于采摘不同农作物的大型机械,看着非常震撼,但是我们国内农业的发展还是相对比较滞后的&#xff0…

Python机器学习库(numpy库)

文章目录 Python机器学习库(numpy库)1. 数据的维度2. numpy基础知识2.1 numpy概述2.1 numpy概述2.1 numpy概述2.2 numpy库的引用 3. ndarray数组的创建3.1 N维数组对象ndarray3.2 创建ndarray数组3.2.1 使用Python列表、元组创建ndarray数组3.2.2 使用nu…

C++ 动态规划 线性DP 数字三角形

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 73 8 8 1 02 7 4 4 4 5 2 6 5 输入格式 …

Quick BI中lod函数之lod_include

一、lod函数简介 LOD函数的全称是详细级别表达式(Level Of Detail Expressisons)。它主要是为了克服一些表达式之间计算颗粒度不一致的问题。比如,要计算第一季度各月销售收入占比,这里分子计算颗粒度为’月’,但是分…

栈的应用:括号匹配问题_有效的括号

假设表达式中允许包含两种括号:圆括号和方括号,嵌套顺序要求: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。 考虑下列括号序列: 分析如下: 计算机…

stable diffusion学习笔记——高清修复

ai画图中通常存在以下痛点: 受限于本地设备的性能(主要是显卡显存),无法跑出分辨率较高的图片。生图的时候分辨率一调大就爆显存。即便显存足够。目前主流的模型大多基于SD1.0和SD1.5,这些模型在训练的时候通常使用小…

机器学习-基础分类算法-KNN详解

KNN-k近邻算法 k-Nearest Neighbors 思想极度简单应用数学只是少效果好可以解释机器学习算法使用过程中的很多细节问题更完整的刻画机器学习应用的流程 创建简单测试用例 import numpy as np import matplotlib.pyplot as plt raw_data_X [[3.393533211, 2.331273381],[3.1…

单片机学习笔记---定时器和中断系统如何连起来工作

前面两节我们分别讲了中断系统和定时器,这节我们看看这两者连起来工作的原理。 说明:看这一节之前一定要先把前两节给看明白了再仔细琢磨这一节的每一张图! 前两节: 单片机学习笔记---中断系统(含外部中断&#xff…

Python基础知识:Python注释及print函数、input函数

在Python中,注释是对相应代码的解释,以增加代码的可读性,让用户能够更好地理解相应代码的含义。注释通过在相应代码后面加上“#”号来实现。比如以下代码 data.describe()#对数据集进行描述性分析 其中data.describe()为需要被执行的代码&a…

网络安全之漏洞扫描

漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。这些缺陷、错误或不合理之处可能被有意或无意地利用,从而对一个组织的资产或运行造成不利影响,如信息系统被攻击或控制…

【高阶数据结构】红黑树

文章目录 前言什么是红黑树红黑树的性质红黑树结点的定义红黑树的插入情况一情况二情况三插入代码总结 验证是否为红黑树红黑树的删除 前言 前面我们学习了 AVL 树——高度平衡的二叉搜索树,AVL 树保证了结点的左右子树的高度差的绝对值不超过 1,也就是…

Nebula Siwi:基于图数据库的智能问答助手思路分析

本文重点分析 Nebula Siwi 智能问答思路,具体代码可参考[2],使用的数据集为 Basketballplayer[3]。部分数据和 schema 如下所示: 一.智能问答可实现的功能 1.Nebula Siwi 源码整体结构 主要包括前段(Vue)和后端&#…

Unity3d C# 在WebGL平台加载并解析xml文件实现总结

前言 xml是可扩展标记语言,由一系列的元素、属性、值节点等构成的一个树形结构,除了可读性差一点,别的用于存储一些结构化的数据还是比较方便的。这个功能在Unity3d端的实现是比较方便快捷的: void GetXML1() {string filePath …

【力扣hot100】刷题笔记Day3

前言 以撒真是一不小心就玩太久了,终于解锁骨哥嘞,抓紧来刷题,今天是easy双指针! 283. 移动零 - 力扣(LeetCode) 一个指针遍历,一个指针用于交换前面的0 class Solution(object):def moveZer…

简单说说mysql的日志

今天我们通过mysql日志了解mysqld的错误日志、慢查询日志、二进制日志,redolog, undolog等。揭示它们的作用和用途,让我们工作中更能驾驭mysql。 redo 日志 如果mysql事务提交后发生了宕机现象,那怎么保证数据的持久性与完整性?…

《计算机网络简易速速上手小册》第6章:网络性能优化(2024 最新版)

文章目录 6.1 带宽管理与 QoS - 让你的网络不再拥堵6.1.1 基础知识6.1.2 重点案例:提高远程办公的视频会议质量实现步骤环境准备Python 脚本示例注意事项 6.1.3 拓展案例1:智能家居系统的网络优化实现思路Python 脚本示例 6.1.4 拓展案例2:提…

挑战杯 LSTM的预测算法 - 股票预测 天气预测 房价预测

0 简介 今天学长向大家介绍LSTM基础 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 这是一个较为新颖的竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…

Megatron-LM源码系列(七):Distributed-Optimizer分布式优化器实现Part2

1. 使用入口 DistributedOptimizer类定义在megatron/optimizer/distrib_optimizer.py文件中。创建的入口是在megatron/optimizer/__init__.py文件中的get_megatron_optimizer函数中。根据传入的args.use_distributed_optimizer参数来判断是用DistributedOptimizer还是Float16O…

QSlider使用笔记

最近做项目使用到QSlider滑动条控件,在使用过的过程中,发现一个问题就是点滑动条上的一个位置,滑块并没有移动到鼠标点击的位置,体验感很差,于是研究了下,让鼠标点击后滑块移动到鼠标点击的位置。 1、event…

this指针详细总结 | static关键字 | 静态成员

文章目录 1.this指针引入2.this指针的特性3.静态成员3.1.C语言中static的基本用法3.2.C中的static关键字 1.this指针引入 class student { public:student(const string& name){ _name name; }void print(){// _name<>this->_name<>(*this)._name// 说一下…