#芯片# SM25QH128M

article/2025/6/16 18:36:12

国产芯片

FLASH芯片 学习笔记

国微的SM25QH128M

百度上搜索的资料太少了。目前为止,百度只能搜到2条相关的文章。
该国产芯片与进口芯片W25Q128JV 很相似。可以参考W25Q128JV。

1. 简述

  • SM25QH128M是一种Nor FLash芯片。
  • 存储空间大小为128Mbit。
  • 工作环境满足国军标N1级要求。
  • 工作电压为2.7V到3.6V。
  • 支持SPI,Dual SPI,Quad SPI。SPI可以工作在mode0或者mode3模式下
  • 正常读取时钟为83MHz,快读频率最大支持104MHz。
  • 支持扇区擦除,块擦除,芯片擦除。支持页page编程写入数据。

2. 地址空间划分

  • 128Mbit空间,也就是16MByte。空间大小可以满足绝大多数应用场景。
  • 一个扇区有4KByte(4096字节)。共有4096个扇区。
  • 可以将8个扇区分为一个块,或者将16个扇区分成一个块。这点在进行块擦除时,值得注意。
    FLASH地址划分

3. 状态寄存器

与进口芯片不同,SM25QH128M官方手册表明,只有一个状态寄存器。如下图所示:

  • SRP位 为 状态寄存器保护位。
  • EBL位 为 使能锁定位。
    状态寄存器

4. 指令列表

指令表
根据上表,进行宏定义:

/*
2021年11月19日
根据官方手册,进行的用户宏定义。By Kshine。
*/
//配置,状态,信息
#define SM25QH128M_RESET_ENABLE 0x66 //复位使能    (第一字节写入)
#define SM25QH128M_RESET_DEVICE 0x99 //复位器件    (第一字节写入)
#define SM25QH128M_QPI_ENTER    0x38 //进入QPI模式 (第一字节写入)
#define SM25QH128M_QPI_EXIT     0xFF //退出QPI模式 (第一字节写入)
#define SM25QH128M_WRITE_ENABLE 0x06 //写入使能    (第一字节写入)
#define SM25QH128M_WRITE_DISABLE 0x04 //写入禁止   (第一字节写入)
#define SM25QH128M_STATUS_READ  0x05 //读状态寄存器 (第一字节写入)(第二字节读出状态)
#define SM25QH128M_STATUS_WRITE 0x01 //写状态寄存器 (第一字节写入)(第二字节写入状态)
#define SM25QH128M_MANUFACTURER 0x90 //读取制造商ID,设备ID (第一字节写入)(第2字节冗余)(第3字节冗余)(第4字节写入0x00或者0x01)(第5字节读出前数据)(第6字节读出后数据)
#define SM25QH128M_ID           0x9F //读取ID (第一字节写入)(第二字节制造商号)(第3字节ID高8位)(第4字节ID低8位)//读取指令
#define SM25QH128M_NORMAL_READ 0x03 //正常读取 (第一字节写入指令)(再写入3个字节的地址)(读出数据)
#define SM25QH128M_FAST_READ   0x0B //快速读取 
#define SM25QH128M_DUAL_OUTPUT_FAST_READ 0x3B
#define SM25QH128M_DUAL_IO_FAST_READ     0xBB
#define SM25QH128M_QUAD_IO_FAST_READ     0xEB
#define SM25QH128M_QUAD_OUTPUT_FAST_READ 0x6B//写指令
#define SM25QH128M_PAGE_PROGRAM 0x02 //页编程 (第一字节写入指令)(再写入3个字节的地址)(写入数据)
#define SM25QH128M_QUAD_PAGE_PROGRAM  0x32 //Quad 输入页编程//擦除
#define SM25QH128M_SECTOR_ERASE 0x20 //扇区擦除
#define SM25QH128M_BLOCK32KB_ERASE 0x52 //块擦除 32KB
#define SM25QH128M_BLOCK64KB_ERASE 0xD8 //块擦除 64KB
#define SM25QH128M_CHIP_ERASE  0xC7 //或者 0x60  //芯片擦除

5. SPI常用操作

(1)写入使能

在执行任何写入操作之前,需要先将WEL位置1。当操作完成之后,WEL自动复位到0状态
写入时能

void SM25QH128_WriteEnable(void)
{_CS = 0;WriteByte(SM25QH128M_WRITE_ENABLE);//0x06_CS = 1;
}void SM25QH128_WriteDisable(void)
{_CS = 0;WriteByte(SM25QH128M_WRITE_DISABLE );//0x04_CS = 1;
}

(2)读取制造商MID,设备ID

  • FLASH存储器有两个标准,CFI和JEDEC。本存储芯片很明显支持的是JEDEC。Joint Electron Device Engineering Council 即电子元件工业联合会。JEDEC是由生产厂商们制定的国际性协议,主要为计算机内存制定。工业标准的内存通常指的是符合JEDEC标准的一组内存。
  • jedec_id 信息,包括制造商ID,存储类型ID,容量ID。
    芯片ID
    这里我们使用的指令0x9F。
    ID
#define MANUFACTURER_ID 0x20
#define MEMMORY_TYPE_ID 0x7018
#define CAPACITY_ID     0x17
#define FLASH9FID       0x00207017
uint32_t  SM25QH128_ReadID(void)
{uint32_t ID = 0;_CS = 0;WriteByte(SM25QH128M_ID);//0x9FID |= readWriteByte(0xFF) << 16;ID |= readWriteByte(0xFF) << 8;ID |= readWriteByte(0xFF);_CS = 1;return ID;
}

(3)对芯片进行复位

芯片的复位操作需要 复位使能0x66复位操作0x99 一起执行,才能实现复位操作。
复位设备

void SM25QH128_ResetEnable(void)
{_CS = 0;WriteByte(SM25QH128M_RESET_ENABLE );//0x66_CS = 1;
}
void SM25QH128_Reset(void)
{_CS = 0;WriteByte(SM25QH128M_RESET_DEVICE);//0x99_CS = 1;
}void SM25QH128_init(void)
{uint8_t i=0;SM25QH128_WriteEnable();   //写使能SM25QH128_ResetEnable();   //复位使能SM25QH128_Reset();         //复位//SM25QH128_WriteDisable();//写禁止 (自动关闭)rt_thread_delay(50);//读取ID信息for(i = 0;i < 100;i++)	// 等待访问Flash OK{if(FLASH9FID == SM25QH128_ReadID()){i=0;break;}rt_thread_delay(50);	}if(i != 0) return 0; //失败return 1; //成功
}

(3)读状态寄存器

在执行编程,擦除,写入状态位时,通过读取状态寄存器0x05 ,WIP位,检测芯片的状态。WIP位可以看成 busy 指示位。
由下面的时序图,可以看到 有2个字节的状态寄存器值。(与上述定义的1字节 状态寄存器 不太相符,官方文档还需要更严谨才行)实际使用按照一个字节去读。
读状态寄存器

uint8_t SM25QH128_ReadStatus(void)
{uint8_t status = 0;_CS = 0;WriteByte(SM25QH128M_STATUS_READ);status = readWriteByte(0xFF);_CS = 1;return status;
}

(4)正常读取操作

正常读取操作频率为83MHz。
正常读取数据

uint32_t SM25QH128_Read(uint32_t addr, uint8_t *buff, uint32_t len)
{int i=0;uint8_t status = 0;uint8_t cmd[4] = {0};cmd[0] = SM25QH128M_NORMAL_READ;cmd[1] = (addr >> 16 ) & 0xFF;cmd[2] = (addr >> 8  ) & 0xFF;cmd[3] = (addr >> 0  ) & 0xFF;while(1){state = SM25QH128_ReadStatus(); if(state&0x01) continue;else           break; }_CS = 0;for(i = 0; i < 4; i++)    WriteByte(cmd[i]);for(i = 0; i < len; i++)  buff[i] = readWriteByte(0xff);_CS = 1;return len;
}

(5)快速读取数据

最高频率为104MHz。由时序图可以看到,发送完地址后,有一字节的无效数据。
快速读取数据

uint32_t SM25QH128_FastRead(uint32_t addr, uint8_t *buff, uint32_t len)
{int i=0;uint8_t status = 0;uint8_t cmd[5] = {0};cmd[0] = SM25QH128M_FAST_READ ;cmd[1] = (addr >> 16 ) & 0xFF;cmd[2] = (addr >> 8  ) & 0xFF;cmd[3] = (addr >> 0  ) & 0xFF;cmd[4] = 0xFF;while(1){state = SM25QH128_ReadStatus(); if(state&0x01) continue;else           break; }_CS = 0;for(i = 0; i < 5; i++)    WriteByte(cmd[i]);for(i = 0; i < len; i++)  buff[i] = readWriteByte(0xff);_CS = 1;return len;
}

(6)写入数据,页编程

  • Page页编程 0x02 操作,一次可以向芯片写入256字节的数据。
  • 在页编写之前,需要发送**写使能指令0x06 **,使得状态寄存器的WEL位z置1。完成操作以后,WEL 自动复位0。
  • 如果超过 256 bytes 数据被写入到芯片内,则芯片只会接收后面的 256 bytes 数据写入 Page 内部。
  • 如果小于 256 bytes 数据被写入到芯片内,则芯片会将对应地址的数据写入,而其他未涉及到的数据则保持不变。
    页编程
//一次可以向芯片写入256字节的数据
void SM25QH128_WirtePage(uint32_t addr, uint8_t *data, uint16_t len)
{uint8_t state = 0;uint16_t    i = 0;uint8_t cmd [4] = {0};cmd[0] = SM25QH128M_PAGE_PROGRAM;cmd[1] = (addr >> 16 ) & 0xFF;cmd[2] = (addr >> 8  ) & 0xFF;cmd[3] = (addr >> 0  ) & 0xFF;while(1){state = SM25QH128_ReadStatus(); if(state&0x01) continue;else           break; }SM25QH128_WriteEnable();_CS = 0;for(i = 0; i < 4; i++)   WriteByte(cmd[i]);for(i = 0; i < len; i++) WriteByte(data[i]);_CS = 1;//SM25QH128_WriteDisable();//写禁止 (自动关闭)
}int SM25QH128_Wirte(uint32_t addr, uint8_t *data, int len)
{int i = 0;int page_num = len / PAGE_SIZE;int last_len = len % PAGE_SIZE;for(i = 0; i < page_num; i++){SM25QH128_WirtePage((addr + (i * PAGE_SIZE)), data + (i * PAGE_SIZE), PAGE_SIZE);}if(last_len){SM25QH128_WirtePage((addr + (i * PAGE_SIZE)), data + (i * PAGE_SIZE), last_len);}return len;
}

(7)扇区擦除

  • 在执行扇区擦除操作之前,WEL 必须通过 **写使能指令0x06 **设置为 1,完成扇区擦除操作以后,WEL 自动复位。
  • 扇区擦除指令 0x20。
    扇区擦除
int SM25QH128_EraseSector(uint32_t addr)
{uint8_t state = 0;uint16_t    i = 0;uint8_t cmd [4] = {0};cmd[0] = SM25QH128M_SECTOR_ERASE;cmd[1] = (addr >> 16 ) & 0xFF;cmd[2] = (addr >> 8  ) & 0xFF;cmd[3] = (addr >> 0  ) & 0xFF;while(1){state = SM25QH128_ReadStatus(); if(state&0x01) continue;else           break; }SM25QH128_WriteEnable();_CS = 0;for(i = 0; i < 4; i++)   WriteByte(cmd[i]);_CS = 1;//SM25QH128_WriteDisable();//写禁止 (自动关闭)
}
#define PAGE_SIZE	0x100     //一页 256字节
#define SECTOR_SIZE	0x1000   //一个扇区有4KByte(4096字节)。共有4096个扇区
#define SECTOR_TO_ADDR(n) ((n)*0x1000)
void Flash_erase(uint32_t addr, uint32_t len)
{uint32_t i = 0;uint32_t start_sector = addr / SECTOR_SIZE;uint32_t sector_num = len / SECTOR_SIZE;if( addr % SECTOR_SIZE){start_sector = start_sector -1;sector_num++;}if(len % SECTOR_SIZE){sector_num++;}for(i = 0; i <= sector_num; i++){SM25QH128_EraseSector(SECTOR_TO_ADDR(start_sector+i));}
}

(8)块擦除

  • 在执行扇区擦除操作之前,WEL 必须通过 **写使能指令0x06 **设置为 1,完成扇区擦除操作以后,WEL 自动复位。
  • 块擦除指令 32KB的0x52 、64KB的0xD8。
    块擦除

(9)芯片擦除

  • 在执行扇区擦除操作之前,WEL 必须通过 **写使能指令0x06 **设置为 1,完成扇区擦除操作以后,WEL 自动复位。
  • 芯片擦除指令0xC7 、0x60。
    芯片擦除

6. 软件初始化与应用

7. 应用电路

SM25QH128M


http://chatgpt.dhexx.cn/article/xGVERTNq.shtml

相关文章

继i.MX 6、i.MX 8之后,NXP发布性能强劲的i.MX 9

关注星标公众号&#xff0c;不错过精彩内容 编排 | strongerHuang 微信公众号 | 嵌入式专栏 最近&#xff0c;NXP在i.MX 6、 i.MX 7、 i.MX 8之后&#xff0c;发布了全新的i.MX 9应用处理器。 i.MX 9 集成Arm Ethos-U65 microNPU&#xff0c;并采用采用了恩智浦&#xff08;NXP…

编写 Matlab mexFunction (C mex)

资料一 MATLAB的MEX文件编写和调试 1. MEX的编写格式 写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写。 编写MEX程序的编辑器可以使用MATLAB的代码编辑器,也可使用自己的C++编辑器,如VS2008等。 用MATLAB的编辑器的好处是,MEX函数会加粗…

matlab和C/C++混合编程--Mex

最近的项目需要matlab和C的混合编程&#xff0c;经过一番努力终于完成了项目要解决的问题。现在就将Mex的一些经验总结一下&#xff0c;当然只是刚刚开始&#xff0c;以后随着学习的深入继续添加。首先讲讲写Mex的一些常规规定&#xff0c;然后我们会重点关注混合编程中最难解决…

R语言【多因素方差分析】

《R语言与大数据编程实战》 学习笔记

三、单因素方差分析例题(R语言)

题目 程序及结果 程序&#xff1a; X<-c(80,203,236,252,284,368, 133,180,100,160,200,195, 156,295,320,448,465,481, 194,214,272,330,386,475) A<-factor(rep(1:4,each6)) miscellany<-data.frame(X,A) aov.mis<-aov(X~A,datamiscellany) summary(aov.mis)…

SPSS教程:单因素重复测量方差分析,超详细图文教程

一、问题与数据 研究者想知道锻炼是如何降低心脏病发生风险的&#xff0c;于是他关注了一种与心脏病相关的蛋白——C反应蛋白&#xff08;C-Reactive Protein, CRP&#xff09;&#xff1a;CRP的浓度越高&#xff0c;发生心脏病的风险越高。研究者想知道锻炼对CRP浓度的影响。…

正交试验设计例题及答案_正交试验设计中的方差分析-例题分析

正交试验设计中的方差分析-例题分析 正交试验设计中的方差分析-例题分析 二&#xff0e;正交试验设计的方差分析的步骤和格式 * 三&#xff0e;实际应用举例 例8&#xff1a;用原子吸收光谱测定铝合金中痕量铁时&#xff0c;需要选择以下三个因素的最适宜条件&#xff1a;1)酸…

R语言双因素方差分析

R语言双因素方差分析 条件: 各个样本是相互独立的随机; 各个样本来自正态总体; 具有方差齐性; 用途: 检验两个或多样本均数间的差异有无统计学意义;注:本均数的比较可以采用 t检验或 F检验,两个以上样本均数的比较只 能用 F检验。 回归方程的线性假设检验; 检验两…

【数据分析】双因素方差分析

0.双因素方差分析的分类 无交互作用的方差分析 假定因素 A A A和因素 B B B的效应之间是相互独立的&#xff0c;不存在相互关系。有交互作用的方差分析 假定因素 A A A和因素 B B B的结合会产生出一种新的效应。 无交互作用的双因素方差分析 1.形式 假定要考察两个因素 A , …

【数据分析】单因素方差分析(含MATLAB和Python实现)

1.基本概念 试验指标&#xff1a;在试验中要考察的指标&#xff0c;如产品质量等。因素&#xff1a;影响试验指标的条件。包括可控因素和不可控因素。单因素试验&#xff1a;在一项试验中只有一个因素在改变的试验。多因素试验&#xff1a;在一项试验中多于一个因素在改变的试…

十六、 方差分析--使用Python进行双因素方差分析

双因素方差分析 对于两因素的方差分析&#xff0c;基本思想和方法与单因素的方差分析相似&#xff0c;前提条件仍然是要满足独立、正态、方差齐性。所不同的是在双因素方差分析中有时会出现交互作用&#xff0c;即二因素的不同水平交差搭配对指标产生影响。下面先讨论无交互作…

单因素试验固定效应模型方差分析

单因素试验固定效应模型方差分析 观测值的线性模型平方和与自由度分解例题与SPSS求解非平衡单因素试验SPSS求解 一、观测值的线性模型 单因素试验线性可加模型为&#xff1a; Yij为第i个处理的第j个观测值&#xff1b;U为所有观测值的平均值&#xff1b;Ti为第i个处理效应&am…

spss方差分析_SPSS统计案例:考虑交互作用的双因素方差分析

某工厂使用3种机型的机器生产同一款产品,现在老板想考察不同机型以及不同操作工人对产品的影响,为此他简单设计了一个小实验,让甲、乙、丙、丁四个工人操作机器Ⅰ、Ⅱ、Ⅲ各三天,其产品产量如下表所示,试分析工人和机器对产品产量是否有显著影响? 简单分析一下,机器有3个…

R语言——双因素方差分析

双因素方差分析&#xff0c;顾名思义&#xff0c;讨论有两种影响因素的样本的方差分析。 一、不考虑交互作用 1.代码示例 agriculture<-data.frame( Yc(325, 292, 316, 317, 310, 318, 310, 320, 318, 330, 370, 365), Agl(4,3), Bgl(3,1,12)); agriculture.aov <- ao…

双因素方差分析(R)

目录 原理 双因素等重复试验的方差分析 假设前提和模型设定 离差平方和分解 检验统计量和拒绝域 例题 应用 双因素无重复试验的方差分析 假设前提和模型设定 离差平方和分解 检验统计量和拒绝域 例题 应用 原理 在单因素方差分析的基础上&#xff0c;双因素方差分…

应用统计学方差分析之单因素方差分析原理解析(含Python代码)

基本概念&#xff1a; 在试验中&#xff0c;把考察的指标称为试验指标&#xff0c;影响试验指标的条件称为因素。因素可分为两类,-类是人为可控的测量数据&#xff0c;比如温度、身高等;一类是不可控的随机因素&#xff0c;例如&#xff0c;测量误差&#xff0c;气象条件等。因…

统计学——单因素方差分析

概念 方差分析&#xff1a;又称变异分析&#xff0c;是英国统计学家R.A.Fisher于1923年提出的一种统计方法&#xff0c;故有时也称为F检验。 可简写为ANOVA。用于多组均数 之间的显著性检验。 要求&#xff1a;各组观察值服从正态分布或近似正态分布&#xff0c;并且各组之间的…

单因素方差分析的计算步骤

假定实验或观察中只有一个因素&#xff08;因子&#xff09;A&#xff08;比如说试剂浓度&#xff09;&#xff0c;有m个水平。各在每一种水平下&#xff0c;做n次实验。 X i j X_{ij} Xij​表示第j个水平下的第i次实验。 实验次数A1水平A2水平…Am水平1 X 11 X_{11} X11​ X …

数据分析 第七篇:方差分析(单因素方差分析)

在试验中&#xff0c;把考察的指标称为试验指标&#xff0c;影响试验指标的条件称为因素。因素可分为两类&#xff0c;一类是人为可控的测量数据&#xff0c;比如温度、身高等&#xff1b;一类是不可控的随机因素&#xff0c;例如&#xff0c;测量误差&#xff0c;气象条件等。…

统计学 —— 单因素方差分析的应用与Excel实现

单因素方差分析的应用 前言概念:使用要求&#xff1a;基本思想&#xff1a;计算原理&#xff1a;分析步骤&#xff1a; 例题 前言 无论是什么活动&#xff0c;影响产品质量和产品的因素都有多种&#xff0c;如影响农作物产量的因素有品种、天气、施肥量、肥料的种类等等。如果…