当前位置: 首页 > article >正文

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


http://www.kler.cn/a/505374.html

相关文章:

  • 《leetcode-runner》如何手搓一个debug调试器——指令系统
  • 字符串提取数字求和⭐
  • 16_Redis Lua脚本
  • Windows 环境下安装和启动 Redis 服务
  • WORD转PDF脚本文件
  • Docker常用命令大全
  • day08_Kafka
  • C++实现设计模式---状态模式 (State)
  • MySQL程序之:指定程序选项
  • Kotlin 协程基础十 —— 协作、互斥锁与共享变量
  • python 爬虫学习
  • 学习第六十八行
  • 稳定144帧!云游戏体验,ToDesk搭载独立满血显卡
  • MyBatis-XML映射配置
  • Vue.js组件开发-如何实现路由懒加载
  • 代码随想录算法【Day21】
  • 【C++】B2112 石头剪子布
  • OpenStack 网络服务的插件架构
  • 诡异的Spring @RequestBody驼峰命名字段映射失败为null问题记录
  • Android Studio 警告信息:Use start instead of left to ensure...
  • 基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
  • 非PHP开源内容管理系统(CMS)一览
  • 【ArcGIS技巧】如何给CAD里的面注记导入GIS属性表中
  • 解锁C++性能密码:TCMalloc深度剖析
  • 麒麟操作系统服务架构保姆级教程(十)rewrite跳转
  • linux环境使用docker部署多个war项目