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

news2025/1/18 16:20:39

目录

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,遵循:读、改、写 的原则

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

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

相关文章

数据库基础练习1(创建表,设置外键,检查,不为空,主键等约束)安装mysql详细步骤

安装MySQL详细步骤 1. 下载 MySQL 安装程序 访问 MySQL 官方网站:MySQL Downloads。在下载页面,选择 "MySQL Community (GPL) Downloads"。在 "MySQL Community Server" 部分,根据你的操作系统(Windows&…

[c语言日寄](bit)位检查——初探字节之下

哈喽大家好啊,在今天的快乐刷题中,我遇到了一个很有意思的题目: 题目 统计二进制中1的个数 基本思路 没错……这道题的对象比较特殊。 不同于过去常见的题目,之前的题目的对象都是基本数据类型,而这道题的对象却是…

基于SpringCloud的广告系统设计与实现(一)

一、广告系统概论 广告系统中计费方式:CPM 千次广告展现收费/CPT 按时间段/CPC用户点击类广告收费。 Mysql:进行广告数据的存储,以及检索系统监听Mysql做增量索引 Kafka:实现各微服务之间的通信 比如地域维度,时间维度 二、微服务…

React Native的现状与未来:从发展到展望

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Python在多个Excel文件中找出缺失数据行数多的文件

本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件内、某一列数据的特征,对其加以筛选,并将符合要求与不符合要求的文件分别复制到另外两个新的文件夹中的方法。 首先,我们来明确一下本…

【JSqlParser】Java使用JSqlParser解析SQL语句总结

简述 Java解析SQL语句有很多工具都可以做到,比如Mybatis、Druid、目前用来用去最全面的仍然是Jsqlparser,它是一个Github上的开源项目,JSqlParser是一个用于解析SQL语句的Java库,它可以帮助开发者分析和操作SQL语句的结构。无论是…

WINFORM - DevExpress -> alertControl1提示信息框

第一个按钮为常规按钮, 单击触发 ButtonClick 事件. 第二个按钮有选中和未选中状态. 单击触发 ButtonDownChanged 事件。 if (e.ButtonName "alertButton2") { } 在dev用户界面中进行提示(usecontrolwinform) AlertInfo info new AlertInfo("提示",…

springboot全局异常处理示例

这种错误交给前端无法处理。 需要自定义一些错误响应类给前端 package cn.yam.bloomfilter.exception;import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.ht…

Windows远程桌面网关出现重大漏洞

微软披露了其Windows远程桌面网关(RD Gateway)中的一个重大漏洞,该漏洞可能允许攻击者利用竞争条件,导致拒绝服务(DoS)攻击。该漏洞被标识为CVE-2025-21225,已在2025年1月的补丁星期二更新中得到…

Shell正则表达式与文本处理三剑客(grep、sed、awk)

一、正则表达式 Shell正则表达式分为两种: 基础正则表达式:BRE(basic regular express) 扩展正则表达式:ERE(extend regular express),扩展的表达式有、?、|和() 1.1 基本正则表…

基于 Spring Boot 和 Vue.js 的全栈购物平台开发实践

在现代 Web 开发中,前后端分离的架构已经成为主流。本文将分享如何使用 Spring Boot 和 Vue.js构建一个全栈购物平台,涵盖从后端 API 开发到前端页面实现的完整流程。 1. 技术栈介绍 后端技术栈 JDK 1.8:稳定且广泛使用的 Java 版本。 Spring…

Golang Gin系列-3:Gin Framework的项目结构

在Gin教程的第3篇,我们将讨论如何设置你的项目。这不仅仅是把文件扔得到处都是,而是要对所有东西的位置做出明智的选择。相信我,这些东西很重要。如果你做得对,你的项目会更容易处理。当你以后不再为了找东西或添加新功能而绞尽脑…

网络编程-UDP套接字

文章目录 UDP/TCP协议简介两种协议的联系与区别Socket是什么 UDP的SocketAPIDatagramSocketDatagramPacket 使用UDP模拟通信服务器端客户端测试 完整测试代码 UDP/TCP协议简介 两种协议的联系与区别 TCP和UDP其实是传输层的两个协议的内容, 差别非常大, 对于我们的Java来说, …

3.数据库系统

3.1数据库的基本概念 3.1.1:数据库体系结构 3.1.1.1集中式数据库系统 数据是集中的 数据管理是集中的 数据库系统的素有功能(从形式的用户接口到DBMS核心)都集中在DBMS所在的计算机 3.1.1.2C/S结构 客户端负责数据表示服务服务器主要负责数据库服务 数据库系统分为前端和后端…

探索 Transformer²:大语言模型自适应的新突破

目录 一、来源: 论文链接:https://arxiv.org/pdf/2501.06252 代码链接:SakanaAI/self-adaptive-llms 论文发布时间:2025年1月14日 二、论文概述: 图1 Transformer 概述 图2 训练及推理方法概述 图3 基于提示的…

【北京迅为】iTOP-4412全能版使用手册-第八十七章 安装Android Studio

iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

LDD3学习8--linux的设备模型(TODO)

在LDD3的十四章,是Linux设备模型,其中也有说到这个部分。 我的理解是自动在应用层也就是用户空间实现设备管理,处理内核的设备事件。 事件来自sysfs和/sbin/hotplug。在驱动中,只要是使用了新版的函数,相应的事件就会…

Jira中bug的流转流程

Jira中bug的状态 1. 处理Bug的流程2. bug状态流转详述bug的状态通常包括 1. 处理Bug的流程 2. bug状态流转详述 bug的状态通常包括 未解决 1. 测试人员创建一个bug,填写bug的详细信息,如概要、bug级别、复现步骤、现状、预期结果等 2. 定位bug&#x…

解决关于Xcode16提交审核报错

# 问题描述 The following issues occurred while distributing your application. Asset validation failed Invalid Executable. The executable xxx.app/Frameworks/HappyDNS.framework/HappyDNS contains bitcode.(lD:ef5dd249-731f-4731-8173-8e4a12519352) Asset valida…

windows下安装并使用node.js

一、下载Node.js 选择对应你系统的Node.js版本下载 Node.js官网下载地址 Node.js中文网下载地址??? 这里我选择的是Windows64位系统的Node.js20.18.0(LTS长期支持版本)版本的.msi安装包程序 官网下载: 中文网下载: 二、安…