初学stm32 --- SPI驱动25Q128 NOR Flash

目录

SPI介绍

SPI结构框图介绍

 SPI外设对应的引脚

SPI数据发送与接收

 SPI工作原理

SPI 全双工模式的通信机制

从机返回主机之前保存的数据

 SPI工作模式介绍

SPI相关寄存器介绍(F1 / F4 / F7)

SPI控制寄存器1(SPI_CR1)

 SPI状态寄存器(SPI_SR)

SPI数据寄存器(SPI_DR)

SPI相关HAL库驱动介绍(F1 / F4 / F7 / H7 )

关键结构体

 NOR FLASH介绍

NM25Q128常用指令

写使能 Write Enable (06H)

 读状态寄存器Read Status Reg1(05H)

 读时序 Read Data Bytes(03H)

页写时序 PageProgram (02H)

扇区擦除时序 Sector Erase(20H)

状态寄存器表​编辑

 NM25Q128读操作步骤

NM25Q128擦除扇区步骤

NM25Q128写操作步骤(极简)

NOR FLASH基本驱动步骤

SPI配置步骤

NM25Q128驱动步骤


SPI介绍

          SPI:串行外设设备接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线。

   SPI接口主要应用在存储芯片、AD转换器以及LCD中。

SPI结构框图介绍

 SPI相关引脚

MOSI(输出数据线)        MISO(输入数据线)        SCK(时钟)        NSS(片选)

② 数据发送和接收

与缓冲区、移位寄存器以及引脚相关

③ 时钟信号

SPI时钟信号是通过SPI_CR1寄存器配置

④ 主控制逻辑

涉及两个控制寄存器SPI_CR1/2用于配置SPI工作,SPI_SR用于查看工作状态

 SPI外设对应的引脚

  STM32芯片有多个SPI外设,每个SPI外设输出的信号会到不同的GPIO口。

  STM32F1有三个SPI

  F4 / F7 / H7 系列芯片SPI外设都有6个,分别为SPI1SPI2SPI3SPI4SPI5SPI6

  不同系列的SPI外设用到的引脚是不一样的,具体可以查看芯片的datasheet

SPI数据发送与接收

 SPI工作原理

        主机只向从机进行写操作,可以忽略接收到的从机数据。

        主机要对从机进行读操作,需要发送一个空数据来引发从机发送数据。 

SPI 全双工模式的通信机制

  1. 全双工通信:

    • 在 SPI 协议的全双工模式下,数据的发送和接收是同时进行的。
    • SPI 使用 MOSI(主机输出从机输入)MISO(主机输入从机输出) 两根数据线,主机每发送一位数据的同时也会接收从机发送的一位数据。
  2. 数据交换特点:

    • SPI 的数据交换是同步的:当时钟(SCLK)产生一个脉冲时,MOSI 和 MISO 都会传输一位数据。
    • 主机写入的数据会通过 MOSI 发送给从机;从机同时在 MISO 上发送它当前准备好的数据给主机。

从机返回主机之前保存的数据

  • 当主机向从机发送数据时,从机会通过 MISO 返回一组数据。
  • 这组返回的数据来源:
    • 默认值: 如果从机的发送缓冲区没有被更新,返回的数据可能是从机的默认数据(通常为 0xFF 或 0x00,取决于硬件实现)。
    • 之前保存的数据: 如果从机在主机通信之前设置了要返回的数据(通过从机软件或硬件寄存器写入),它会返回这些数据。
    • 实时数据: 在某些情况下,从机可能会在主机发送数据时生成返回数据。例如:
      • 读取从机的状态寄存器。
      • 从存储器中获取数据。

 SPI工作模式介绍

        数据的有效是在电平跳变沿上,来读取或者写入数据的。

        通过配置时钟极性(CPOL)和时钟相位(CPHA)来选择采样边沿

时钟极性(CPOL)

        没有数据传输时时钟线的空闲状态电平

        0:SCK在空闲状态保持低电平

        1:SCK在空闲状态保持高电平

时钟相位(CPHA)

        时钟线在第几个时钟边沿采样数据

        0:SCK的第一(奇数)边沿进行数据位采样,数据在第一个时钟边沿被锁存

        1:SCK的第二(偶数)边沿进行数据位采样,数据在第二个时钟边沿被锁存

 

SPI相关寄存器介绍(F1 / F4 / F7)

SPI控制寄存器1SPI_CR1

         

 SPI状态寄存器(SPI_SR

 TXE位置1时,表示数据已经全部发送出去

 RXE位置1时,表示已经接收到数据

SPI数据寄存器(SPI_DR

SPI相关HAL库驱动介绍(F1 / F4 / F7 / H7 

关键结构体

SPI_HandleTypeDef:
SPI_TypeDef		*Instance
SPI_InitTypeDef 		Init

SPI_InitTypeDef:
uint32_t Mode				/* SPI模式(主机)  */
uint32_t Direction			/* 工作方式(全双工) */
uint32_t DataSize			/* 帧格式(8位) */
uint32_t CLKPolarity			/* 时钟极性(CPOL = 0) */
uint32_t CLKPhase			/* 时钟相位 (CPHA = 0)*/
uint32_t NSS				/* SS控制方式(软件) */
uint32_t BaudRatePrescaler		/* SPI波特率预分频值 */
uint32_t FirstBit				/* 数据传输顺序(MSB)*/
uint32_t TIMode				/* 帧格式:Motorola / TI  */
uint32_t CRCCalculation		/* 设置硬件CRC校验 */
uint32_t CRCPolynomial		/*  设置CRC校验多项式 */
…
(对于F7/H7来说,还有一些附加功能相关成员(NSS/CRC/IOSwap))

 NOR FLASH介绍

        FLASH是常用的用于储存数据的半导体器件,它具有容量大,可重复擦写、按“扇区/块”擦除、掉电后数据可继续保存的特性。

          FLASH是有一个物理特性:只能写0,不能写1,写1靠擦除。

          FLASH主要有NOR FlashNAND Flash两种类型,NORNAND是两种数字门电路。

https://blog.csdn.net/ffdia/article/details/87437872

 NM25Q128 简介

        NM25Q128,串行闪存器件,属于NOR FLASH中的一种,容量为128 Mb。擦写周期可达10W次,可以将数据保存达20年之久。 

SPI数据传输时序:支持模式0CPOL = 0 , CPHA = 0)和模式3CPOL = 1, CPHA = 1

数据格式:数据长度8位大小,先发高位,再发低位(MSB)

传输速度:支持标准模式104M bit/s

CS : 片选信号输入        SO : 数据输出         WP : 写保护功能

HOLD : 暂停通讯         CLK : 时钟输入        SI : 数据输入

NM25Q128存储结构

        地址范围(0x0 ~ 0xFFFFFF)

        25Q128存储容量为128M bit,即16M Byte

NM25Q128常用指令

NOR FLASH的指令总数比较多, 但是如果只需要实现基本操作, 还是比较简单的.

一般我们只需要:5条指令即可完成对NOR FLASH的基本使用(以NM25Q128为例)

写使能 Write Enable (06H)

        执行 Page Program页写,Sector Erase扇区擦除,Block Erase块擦除,Chip Erase片擦除,

Write Status Register状态寄存器等指令前,需要写使能

 读状态寄存器Read Status Reg105H

 读时序 Read Data Bytes03H

页写时序 PageProgram (02H)

页写命令最多可以向FLASH传输256个字节的数据‘

扇区擦除时序 Sector Erase20H

状态寄存器表

BUSY位:

        指示当前状态     0:空闲状态(硬件自动清除)    1:当前处于忙碌状态

WEL位:

        执行WriteEnable指令该位为1,可以页写/扇区oror片擦除/写状态寄存器  

        0:写禁止,不能页编程/扇区oror片擦除/写状态寄存器

 NM25Q128读操作步骤

1,发送读命令(03H

        发送0X03读数据指令

2,发送地址(24位)

        地址范围:0 ~ 0XFFFFFF,分3次发送

3,读取数据

        发送空字节(0XFF),读取数据,支持连续读

NM25Q128擦除扇区步骤

1,发送写使能命令(06H

        发送0X06,写使能命令

2,等待空闲

        等待NOR FLASH空闲

3,发送擦除扇区命令(20H

        发送擦除扇区命令0X20

4,发送地址(24位)

        发送要擦除的字节地址,自动擦除该地址所在扇区

5,等待空闲

        等待擦除完成(等待空闲状态)

NM25Q128写操作步骤(极简)

1,擦除扇区(20H

        通过前面的擦除步骤实现

2,发送写使能命令(06H

        发送0X06,写使能命令

3,发送页写命令(02H

        发送页写命令后,一次最多写入256字节

4,发送地址(24位)

        发送要写入的地址

5,发送数据

        发送要写入的数据,一次最多写入256字节

6,等待空闲

        等待写入完成(等待空闲状态)

NOR FLASH基本驱动步骤

SPI配置步骤

1SPI工作参数配置初始化

        HAL_SPI_Init        工作模式、时钟极性、时钟相位等

2、使能SPI时钟和初始化相关引脚

        HAL_SPI_MspInit        GPIO模式设为复用推挽输出模式

3、使能SPI

        __HAL_SPI_ENABLE

4SPI传输数据

        HAL_SPI_Transmit 发送数据

        HAL_SPI_Receive 接收数据

        HAL_SPI_TransmitReceive 进行发送与接收

5、设置SPI传输速度

        操作SPI_CR1寄存器中的波特率控制位(需要先失能SPI,然后设置好后,在使能SPI)

NM25Q128驱动步骤

1、初始化片选引脚与SPI接口

        相关GPIO初始化、SPI初始化(模式、位数、分频、MSB等)

2NM25Q128 读取

        0x03指令 + 24位地址 + 读取数据

3NM25Q128 扇区擦除

        0x06指令 + 等待空闲 + 0x20指令 + 24位地址 + 等待空闲

4 NM25Q128 写入

        擦除扇区(可选)+ 0x06指令 + 0x02指令+ 24位地址 + 写入数据 + 等待空闲

NOR FLASH驱动核心在写数据,写数据需要注意:

1,是否需要擦除?

2,写入数据(是否需要换页?是否需要换扇区?)

3,遵循:读、改、写 的原则

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yum系统报错:SyntaxError: multiple exception types must be parenthesized

执行yum相关步骤报错如下: File "/usr/bin/yum", line 30except KeyboardInterrupt, e:^^^^^^^^^^^^^^^^^^^^ SyntaxError: multiple exception types must be parenthesized原因:python解释器版本错误,yum运行版本为python 2.7&am…

STM32第5章、IWDG

一、简介 IWDG:全称是Independent watchdog,即独立看门狗。本质上是一个能产生系统复位信号的计数器。 特性: 是一个递减计数器。 时钟信号由独立的RC振荡器提供,可在待机和停止模式下运行。 看门狗被激活后,当递减计…

快速上手 HarmonyOS 应用开发

一、DevEco Studio 安装与配置 1. DevEco Studio 简介 DevEco Studio 是 HarmonyOS 的一站式集成开发环境(IDE),提供了丰富的工具和功能,支持 HarmonyOS 应用开发的全流程。 2. DevEco Studio 下载与安装 下载地址&#xff1a…

ThinkPHP 8的一对一关联

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

像JSONDecodeError: Extra data: line 2 column 1 (char 134)这样的问题怎么解决

问题介绍 今天处理返回的 JSON 的时候,出现了下面这样的问题: 处理这种问题的时候,首先你要看一下当前的字符串格式是啥样的,比如我查看后发现是下面这样的: 会发现这个字符串中间没有逗号,也就是此时的J…

国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)

1 扩展脚本:在当前文件目录下新建同类型文件 1.1 应用场景 用户在进行编程语言学习时,比如:Python,经常做完一个小练习后,又需要新建一个文件,在新建文件的时候,不但要选择文件类型&#xff0c…

Java+Maven+GDAL

下载已经编译好的压缩包,下载地址 解压 jar 包 release-1930-x64-dev.zip\release-1930-x64\bin\gdal\java 目录下 打成Maven依赖 mvn install:install-file -Dfilegdal-3.10.1.jar -DgroupIdorg.gdal -DartifactIdgdal -Dversion3.10.1 -Dpackagingjar -Dgener…

个人主页搭建全流程(Nginx部署+SSL配置+DCDN加速)

前言 最近开始准备秋招,打算做一个个人主页,以便在秋招市场上更有竞争力。 目前,现有的一些搭建主页的博文教程存在以下一些问题: 使用Github Page进行部署,这在国内访问容易受阻使用宝塔面板等框架,功能…

【Linux探索学习】第二十五弹——动静态库:Linux 中静态库与动态库的详细解析

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在 Linux 系统中,静态库和动态库是开发中常见的两种库文件类型。它们在编译、链接、内存管理以及程序的性能和可维护性方面有着…

【Rust自学】12.4. 重构 Pt.2:错误处理

12.4.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数读取…

算法-贪心算法简单介绍

下面是贪心算法视频课的导学内容. 目录 1. 什么是贪心算法?2. 贪心算法简单的三个例子:1. 找零问题2. 最小路径和问题3. 背包问题 3. 贪心算法的特点4. 贪心算法学习的方式? 1. 什么是贪心算法? 简单来说, 我们称以局部最优进而使得全局最优的一种思想实现出来的算法为贪心…

Node.js - Express框架

1. 介绍 Express 是一个基于 Node.js 的 Web 应用程序框架,主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一,具有轻量级、灵活和功能丰富的特点。 核心概念包括路由,中间件,请求与响应&a…

day08_Kafka

文章目录 day08_Kafka课程笔记一、今日课程内容一、消息队列(了解)**为什么消息队列就像是“数据的快递员”?****实际意义**1、产生背景2、消息队列介绍2.1 常见的消息队列产品2.2 应用场景2.3 消息队列中两种消息模型 二、Kafka的基本介绍1、…

459. 重复的子字符串【力扣】——kmp拼接字符串解法

常规kmp解答 class Solution { public:void getNext(int *next,string s){int j0;next[0]0;for(int i1;i<s.size();i){while(j>0 && s[i]!s[j]){jnext[j-1];}if(s[i]s[j]) j;next[i]j;}}bool repeatedSubstringPattern(string s) {if(s.size()0) return false;i…

浅谈云计算06 | 云管理系统架构

云管理系统架构 一、云管理系统架构&#xff08;一&#xff09;远程管理系统&#xff08;二&#xff09;资源管理系统&#xff08;三&#xff09;SLA 管理系统&#xff08;四&#xff09;计费管理系统 二、安全与可靠性保障&#xff08;一&#xff09;数据安全防线&#xff08;…

【STM32】HAL库USB实现软件升级DFU的功能操作及配置

【STM32】HAL库USB实现软件升级DFU的功能操作及配置 文章目录 DFUHAL库的DFU配置修改代码添加条件判断和跳转代码段DFU烧录附录&#xff1a;Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作位带代码位带宏…

PHP答题考试系统

&#x1f50d; 这是一款由PHP与Uniapp强强联手打造的小程序答题考试系统&#xff0c;它如同智慧教育领域中的一颗璀璨明珠&#xff0c;凭借其强大的功能和灵活多变的应用&#xff0c;牢牢吸引了无数求知者的目光。系统全面覆盖了多种试题类型&#xff0c;从基础易懂的判断题、单…

瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 视频硬件编解码-代码版

前言 在上一篇文章中&#xff0c;我们讲解了如何使用 ffmpeg-rockchip 通过命令来实现 MPP 视频硬件编解码和 RGA 硬件图形加速&#xff0c;在这篇文章&#xff0c;我将讲解如何使用 ffmpeg-rockchip 用户空间库&#xff08;代码&#xff09;实现 MPP 硬件编解码。 本文不仅适…

Element Plus 之 el-table相同行合并(通用函数),相同列合并(自行判断需合并的字段以及相应的列下标)

展示 代码 <el-table :data"tableData" border style"width: 100%" :span-method"objectSpanMethod"><el-table-column prop"date" label"Date" width"180" align"center" /><el-table…

深入理解计算机系统阅读笔记-第十二章

第12章 网络编程 12.1 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。根据这个模型&#xff0c;一个应用时由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源&#xff0c;并且通过操作这种资源来为它的客户端提供某种服务。例如&#xf…