【STM32】SPI

news2024/12/24 21:46:19

SPI又是另一个超级常见的外设通信方式。

大部分图片来源:正点原子HAL库课程

 专栏目录:记录自己的嵌入式学习之路-CSDN博客


目录

1    基本概念

1.1    与IIC的区别

1.2    引脚

1.3    移位原理

1.4    四种工作模式

2    NOR Flash

2.1    25Q128系列 NOR Flash

2.2    25Q128存储结构

2.3    常用指令及其时序

2.4    重要的状态寄存器

2.5    读操作步骤

2.6    擦除扇区

2.7    写操作(极简版)

3    配置

3.1    相关HAL库函数

3.2    关键结构体

3.3    NOR Flash基本驱动步骤

4    QSPI

4.1    基本概念

4.2    SPI的分类


1    基本概念

SPI:串行外设设备接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线。主要应用在存储芯片、AD转换器以及LCD中。

1.1    与IIC的区别

  • SPI是边沿协议(以边沿的产生为信号),IIC是电平协议(以电平的高低为信号);
  • SPI可以选择MSB(高位)先发和LSB(低位)先发两种模式,一般是根据从机的需要进行选择;
  • SPI也可以只使用一根数据线,实现半双工通信。

1.2    引脚

MOSI(Master Out / Slave In):输出数据线

MISO(Master In / Slave Out):输入数据线

SCK(Serial Clock):时钟

NSS\overline{CS}):片选线,上方的横线代表低电平有效。实现上一般使用软件管理NSS,而将硬件的NSS引脚省下来用作他用。

软件管理CS的意思是:将主机配置为软件管理NSS,而从机的CS在物理上就可以连接MCU的任意一个IO了,只要和该从机通信的时候拉低该IO的电平即可。

1.3    移位原理

如上图,当时钟线产生一个上升沿触发时,主机和从机的最高位都会被传输到发送引脚上;当时钟线产生一个下降沿触发时,接收引脚上的数据将被写进移位寄存器中。通过8个时钟脉冲,一个字节的数据就被发送/接收完成了。也就是说,收发是同时进行的。所以:

  • 若主机只向从机进行写操作,可以忽略接收到的从机数据;
  • 若主机要对从机进行读操作,需要发送一个空数据来引发从机发送数据。

1.4    四种工作模式

  • 主机SPI的工作模式的选择要结合从机支持的模式来,因为从机不一定支持这么多模式;

2    NOR Flash

2.1    25Q128系列 NOR Flash

  • HOLD用于一主多从的通信;

2.2    25Q128存储结构

一片25Q128有256个块(Block),一个块有16个扇区(Sector),一个扇区有16页,一页有256个字节。最终算出来就是16M Byte/128M bit。

  • 擦除的单位:扇区、块、片
  • 写的单位:页写,与EEPROM的页写一样存在写完一页需要翻页的情况,否则再写会发生覆盖;
  • 地址长度:根据原件数据手册可知,为0- FFFFFFH;

2.3    常用指令及其时序

NOR FLASH的指令总数比较多, 但是如果只需要实现基本操作,还是比较简单的,一般我们只需要:5条指令即可完成对NOR FLASH的基本使用(以NM25Q128为例):

  • 写使能
    拉低片选→发送06H→拉高片选
  • 读SR1
    拉低片选→发送05H→返回SR1的值→拉高片选
    • 其中,05H、35H、15H分别对应SR1、SR2、SR3三个状态寄存器;
    • 若拿到SR1数据后不拉高片选,从机会持续发送SR1的数值;
  • 读数据
    拉低片选→发送03H→发送24位地址→读取数据1~n→拉高片选
    • 与读SR1类似,在发送完地址后,要是时钟线一直给脉冲,就会一直读数据;
  • 页写
    拉低片选→发送02H→发送24位地址→发送数据1~n→拉高片选
    • 页写命令最多可以向FLASH传输256个字节的数据,因为一页就256字节;
    • 与上面的命令一样,只要保持片选和时钟脉冲就可以持续写入;
  • 扇区擦除
    拉低片选→发送20H→发送24位地址→拉高片选
    • FLASH存储器的特性决定了它只能把原来为“1”的数据位改写成“0”,而原来为“0”的数据位不能直接改写为“1”;
    • 写入数据前,检查内存空间情况是否满足,不满足需擦除;

2.4    重要的状态寄存器

  • 除了上图所述的BUSY位和WEL位外,对大容量FLASH进行操作时还需要对ADP位进行操作;

2.5    读操作步骤

  • 分三次发送是因为帧格式那里设置了每帧8位;
  • 发送空字节是因为读写是同时进行的,要读就要发送写数据;

2.6    擦除扇区

  • 注意:发送要擦除的字节地址即可,Flash芯片会自动擦除该地址所在扇区;

2.7    写操作(极简版)


3    配置

3.1    相关HAL库函数

  • 使能时钟也可以放在HAL_SPI_MspInit()函数中;

3.2    关键结构体

  • Direction:选择双线全双工,SPI_DIRECTION_2LINES;
  • NSS:选择软件,SPI_NSS_SOFT;
  • TIMode:选择不开启,即默认的摩托罗拉模式,SPI_TIMode_DISABLE;
  • CRCCalculation:关闭CRC校验;
  • CRCPolynomial:找寄存器的默认值,7;

3.3    NOR Flash基本驱动步骤

  • 关键的函数:HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
    • pTxData:发送数据的指针;
    • pRxData:接收数据的指针;
    • Size:发送数据的数目,要是帧格式是字节就是字节数,帧格式是半字就是半字数;
    • Timeout:超时时间,例程内设置为1000;
  • 如果需要一次性发送16位数据(SPI的单帧数据格式可以设置为16位)
    • 方法1:在配置SPI时配置好16位帧格式,在发送数据时,则将数据指针强转为8位指针发送:
    • 方法2:配置SPI时依然配置为8位,但发送两个字节:
  • 一般SPI初始化完毕后最好发送一个0xFF,以达到清空数据寄存器的作用;
  • 注意⚠️:GPIO应设置为初始上拉,以保证对一些有上下拉电阻功能的MCU,不会因为初始拉低而发生片选;
  • 注意⚠️:设置传输速度前必须__HAL_SPI_DISABLE,失能SPI才行;
     

  • 读取数据时应发送一个空的8位数据出去,从而获得返回值,因为根据19.1.3,需要发送空数据以启动移位操作;
  • 发送24位地址需要分开三次发,高8位→中8位→低8位;
  • 每次操作完毕后记得拉高片选;
  • 这里的GPIO初始化指的是Flash芯片的片选引脚初始化;
  • 读、改、写的步骤是为了避免要写入的扇区原来就有数据,因此要先将扇区的数据读出来,然后放到一个大数组中;在大数组中写入自己需要写入的数据,然后擦除扇区,再将数组的数据写入扇区中;
  •  如在写入前不进行数据读取与比对,那么直接写入后与写入地址同扇区的数据将被擦除,因为擦除的最小单位是扇区;

4    QSPI

4.1    基本概念

STM32F1系列并没有QSPI的外设。了解有更快的SPI传输数据的方式即可。

4.2    SPI的分类

  • SPI加速的思路:复用更多的引脚做IO,以提高一次性传输的数据;

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

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

相关文章

论文《Graph Structural Attack by Perturbing Spectral Distance》笔记

【SPAC 2022 KDD】大多数现有攻击方法在空间域中操作图,而对傅里叶域中图卷积的脆弱性研究较少。作者提出了一种名为SPectral AttaCk(SPAC)的攻击方法,通过最大化谱距离来实施攻击,并提出了一种有效的近似方法来降低特…

R语言股价跳跃点识别:隐马尔可夫hmm和 GARCH-Jump对sp500金融时间序列分析

全文链接:https://tecdat.cn/?p37479 分析师:Yue Ji 在突发事件发生后,股价会相应的发生较大幅度的上涨或下跌,称为跳跃现象,跳跃现象会给金融投资带来极大风险,因而对跳跃点的识别对于风控而言是很重要的…

web渗透:SQL注入漏洞WAF绕过

目录 如何检测和防范SQL注入攻击中的编码伪装? 检测SQL注入攻击中的编码伪装 防范SQL注入攻击中的编码伪装 WAF在处理SQL注入时为什么有时会对大小写不敏感? SQL注入中的联合查询注入有哪些常见的攻击方式? 在绕过Web应用防火墙&#xf…

实时计算Flink:推动行业变革的新时代引擎(附金融/汽车/物流/零售案例)

实时计算Flink:推动行业变革的新时代引擎(附金融/汽车/物流/零售案例) 前言实时计算Flink 前言 在当今数字化高速发展的时代,数据的价值愈发凸显,而实时计算技术则成为了挖掘数据价值的关键利器。阿里云实时计算 Flin…

道格拉斯-普克 Douglas-Peuker(DP算法) python php实现

废话不多说,直接开干! 最近在做一个车联网项目,有一个场景是车辆定时上报当前所在经纬度等位置信息上报给平台,平台通过web页面在高德地图上展示车辆行驶路径。 说明 道格拉斯-普克算法 (Douglas–Peucker algorithm,亦…

Leetcode面试经典150题-17.电话号码的字母组合

突然发现回溯题最近考的好多,其实没啥技术含量 解法都在代码里,不懂就留言或者私信 class Solution {public static final char[][] digitsCharArr {{},{},{a,b,c},/**数字2可以代表的字符 */{d,e,f},{g,h,i},{j,k,l},{m,n,o},{p,q,r,s},{t,u,v},{w,x…

【数据结构入门】二叉树之堆排序及链式二叉树

目录 前言 一、堆排序 1.概念 2.堆排序思想 3.具体步骤 4.实现 5.复杂度 二、堆的应用——TopK问题 三、链式二叉树 1.二叉树创建 2.二叉树遍历 1)前序、中序以及后序遍历 2)层序遍历 3.结点个数以及高度 1)结点个数&#xff1a…

阿里巴巴中间件canal的搭建和使用以及linux命令下使用mail发送html格式的邮件

一、阿里巴巴中间件canal的搭建和使用 canal可以用来监控数据库数据的变化(binlog日志),从而获得指定数据的变化。canal是应阿里巴巴存在杭州和美国的双机房部署,存在跨机房同步的业务需求时开始逐步的尝试基于数据库的日志解析,获取增量变更…

Netty三

Netty TCP拆包粘包 二次编码方式 常用二次解码器 网络应用程序基本步骤 数据结构设计 完善客户端 客户端实例 Netty编程易错点

C++ 设计模式——适配者模式

C 设计模式——适配者模式 C 设计模式——适配者模式1. 主要组成成分2. 逐步构建适配者模式2.1 目标抽象类定义2.2 源类实现2.3 适配器类实现2.4 客户端 3. 适配者模式 UML 图适配者模式 UML 图解析 5. 类适配者6. 适配者模式的优点7. 适配者模式的缺点8. 适配者模式适用场景总…

永久去除windows11推荐产品的软件

永久去除windows11推荐产品的软件 去除windows11 推荐的项目,并用来固定软件 要求 22621及以上版本 企业版,专业教育版,教育版(可以自行找工具切换,无需重装系统,非常方便的。) [软件原创作者]&#xff…

【Python】Python 函数综合指南——从基础到高阶

文章目录 Python 函数综合指南1. 函数介绍1.1 什么是函数?1.2 定义函数示例:1.3 调用函数1.4 函数参数1.4.1 必需参数1.4.2 默认参数1.4.3 关键字参数1.4.4 可变长度参数 2. Python 内置函数2.1 字符串处理函数示例: 2.2 数学函数示例&#x…

音视频相关

ffmpeg 安装 1. 源码安装 git clone https://git.ffmpeg.org/ffmpeg.git 2. 配置 编译 安装 ./configure --prefix/usr/local/ffmpeg --enable-debug3 --enable-shared --disable-static --disable-x86asm --enable-ffplaymake -jnproc && make install Q: 没有ff…

C++ 基础学习

提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream>using namespace std;int main() {cout<<"请输入字符串:";string str;getline(cin,str);int num0;int alp0;int spa0;int other0;int …

大语言模型-GPT3-Language Models are Few-Shot Learners

一、背景信息&#xff1a; GPT3是于2020 年由OpenAI 发布的预训练语言模型。 GPT3在自然语言处理&#xff08;NLP&#xff09;任务中表现出色&#xff0c;可以生成连贯的文本、回答问题、进行对话等。 GPT3的网络架构继续沿用GPT1、GPT2的是多层Transformer Decoder改的结构。…

论文笔记:GEO-BLEU: Similarity Measure for Geospatial Sequences

22 sigspatial 1 intro 提出了一种空间轨迹相似性度量的方法比较了两种传统相似度度量的不足 DTW 基本特征是它完全对齐序列以进行测量&#xff0c;而不考虑它们之间共享的局部特征这适用于完全对齐的序列&#xff0c;但不适用于逐步对齐没有太多意义的序列BLEU 适用于不完全…

MVSEP-MDX23容器构建详细教程

一、介绍 模型GitHub网址&#xff1a;MVSEP-MDX23-music-separation-model/README.md 在 main ZFTurbo/MVSEP-MDX23-音乐分离模型 GitHub 上 在音视频领域&#xff0c;把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有原始工程文件…

股指期货的交易规则有哪些?

股指期货作为一种金融衍生品&#xff0c;其合约条款和交易规则是投资者必须了解的重要内容。以下是关于股指期货合约条款及交易规则的详细解释&#xff1a; 一、合约乘数 沪深300指数期货合约的乘数为每点人民币300元。 中证500股指期货合约的乘数为每点200元。 上证50股指…

【iOS】Masonry学习

Masonry学习 前言NSLayoutConstraintMasonry学习mas_equalTo和equalToMasonry的优先级Masorny的其他写法 Masonry的使用练习 前言 Masonry是一个轻量级的布局框架。通过链式调用的方式来描述布局&#xff0c;是排版代码更加简洁易读。masonry支持iOS和Mac OS X。相比原生的NSL…

浅谈【数据结构】图-最短路径问题

目录 1、最短路径问题 2、迪杰斯特拉算法 3、算法的步骤 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#xff01;&#xff01; 希望我的文章内容能对你有帮助&#xff0c;一起努力吧&#xff0…