#芯片# SM25QH128M

news/2024/2/28 11:26:07

国产芯片

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://www.ppmy.cn/news/119011.html

相关文章

大唐杯设备专栏

BBU安装流程 AAU安装流程 安装准备&#xff1a; 机房内有较好的灯光照射&#xff0c;四周墙壁有220V电源插座&#xff08;三芯&#xff09; 机房四周及天花板需粉刷 安装线缆的走线架和线缆出口应该在设备进入机房前安装完毕 EMB6116主设备为室内设备&#xff0c;GPS子系统为室…

【大唐杯备考】——5G网元功能与接口(学习笔记)

&#x1f4d6; 前言&#xff1a;本期介绍5G网元功能与接口。 目录 &#x1f552; 1. 5G移动通信系统整体网络架构&#x1f558; 1.1 5G核心网架构&#x1f558; 1.2 5G接入网架构 &#x1f552; 2. 5G主要网元功能&#x1f558; 2.1 UPF&#xff08;用户面功能&#xff09;&…

国腾GM系列,GM8284DD(GM8284DR,LT8218A)、 GM8285C、GM7123C,LVDSTTL转TTL,TTL转成单路LVDS,TTL数字信号转换成VGA

1.GM8284DD(GM8284DR,LT8218A) 功能&#xff1a;GM8284DD是一颗将单路LVDSTTL信号转换成TTL信号的转接芯片&#xff0c;其应用图如下&#xff1a; 产品特征&#xff1a; 输入&#xff1a;Single link LVDS 输入时钟频率&#xff1a;25MHz&#xff5e;85MHz&#xff1b; 输…

【直流电机】基于matlab直流电机双闭环调速系统仿真【含Matlab源码 2368期】

⛄一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【直流电机】基于matlab直流电机双闭环调速系统仿真【含Matlab源码 2368期】 点击上面蓝色字体,直接付费下载,即可。 获取代码方式2: 付费专栏Matlab物理应用(初级版) 备注: 点击上面蓝色字体付费专栏Mat…

【大唐杯备考】——5G系统勘察设计(学习笔记)

&#x1f4d6; 前言&#xff1a;本期介绍5G系统勘察设计。 目录 &#x1f552; 1. 概述&#x1f558; 1.1 5G网络预规划&#x1f564; 1.1.1 5G建网需求确认&#x1f564; 1.1.2 4G现网评估&#x1f564; 1.1.3 站点规模估算&#x1f564; 1.1.4 5G仿真评估 &#x1f558; 1.2 …

【大唐杯备考】——5G基站开通与调测(学习笔记)

&#x1f4d6; 前言&#xff1a;本期介绍5G基站开通与调测。 目录 &#x1f552; 1. 概述&#x1f552; 2. 5G基站开通与调测基础&#x1f558; 2.1 3.5GHz单模100MHz配置&#xff08;S111&#xff09;&#x1f558; 2.2 3.5GHz单模100MHz配置&#xff08;S111111&#xff09;&…

机智云工业级4G Cat.1 DTU全面升级数据采集485/232 GC521

如今&#xff0c;构建物联网&#xff08;loT&#xff09;已是大势所趋&#xff0c;在云计算、大数据、人工智能等先进技术的推动下&#xff0c;物联网应用越来越广泛&#xff0c;物联网通信设备层出不穷&#xff0c;诸多无线终端产品纷纷脱颖而出。其中DTU数据传输设备因其强大…

大唐集团参数分析

文章目录 前言相关参数ssxmod_itna环境值 前言 网址&#xff1a;aHR0cHM6Ly93d3cuY2R0LWVjLmNvbS9ub3RpY2UvbW9yZUNvbnRyb2xsZXIvdG9Nb3JlP2dsb2JsZVR5cGU9NA 水一下&#xff0c;简单的看下机密流程呀。 相关参数 第一个参数和上一篇文章感觉应该差不多&#xff0c;问题不大。…

高性能办公娱乐迷你主机——Maxtang大唐AMD5600U

今天给大家介绍一款AMD5600U迷你主机&#xff0c;说起这款处理器大家应该并不陌生&#xff0c;像联想小新、YOGA以及ThinkBook等很多款用的都是这个型号&#xff0c;不过笔记本的价格基本都在3999-4999这个价位区间&#xff0c;同样的处理器&#xff0c;笔记本卖那么贵&#xf…

电子合同签署协议开源版系统开发

电子合同签署协议开源版系统开发 H5TP6mysqlphp 源码开源不加密 以下是电子合同系统可能包含的功能列表&#xff1a; 用户注册和登录&#xff1a;用户可以注册并登录系统&#xff0c;以便创建、签署和管理合同。合同创建&#xff1a;用户可以创建新合同&#xff0c;包括填写合…

国内主流AI大模型盘点

今年年初&#xff0c;轰动科技圈的大事就是ChatGPT的面世&#xff0c;它的到来打响了AI智能时代的第一枪&#xff0c;同时展开了一场别开生面的智能科技革命。 随着ChatGPT迅速走红,国内各大企业纷纷发力认知大模型领域。经过一段时间的酝酿&#xff0c;国内的AI领域也开启了“…

全网最多最全计算机编程学习资源大合集

程序员免费编程书籍资源汇总&#xff0c;不定期分享编程开发相关的编程书籍、技术文章、学习资源、实用软件、互联网相关技术等。供各位小伙伴们学习参考&#xff0c;同时也方便自己提升&#xff0c;欢迎 Watch、Star。 收集整理不易&#xff0c;如果觉得对你有对您有帮助&…

apexords安装 (集成weblogic)

1、下载apex_4.2.4.zip&#xff08;apex_4.2.4.zip&#xff0c;进入apex目录 2、使用sys的dba身份登录sqlplus 3、运行安装Apex Runtime的SQL脚本&#xff1a; SQL> apxrtins.sql SYSAUX SYSAUX TEMP02 /i/ 临时表空间可以通过下面SQL确认&#xff1a;select property_…

执行jar包时出现:Exception in thread “main“ java.lang.UnsupportedClassVersionError

文章目录 错误样式 Exception in thread “main” java.lang.UnsupportedClassVersionError: net/army/boot/ProfileDemo01Application has been compiled by a more rece nt version of the Java Runtime (class file version 55.0), this version of the Java Runtime only …

java读取zip/jar包中的文件

1、jar vs zip&#xff1a; jar 文件和 zip 文件都是归档文件&#xff0c;并且都经过压缩。事实上&#xff0c;jar 文件使用与 zip 文件相同的存档和压缩技术&#xff0c;所以 jar 文件实际上是一种特定类型的 zip 文件。(JAR 文件本质上是一个包含可选 META-INF 目录的 zip 文…

如何成为编程界的璀璨新星:从入门到精通的完整指南

随着信息技术的快速发展&#xff0c;编程已经成为一个越来越重要的技能。那么&#xff0c;我们该如何入门编程呢&#xff1f;本文将为你提供一条全面的指南&#xff0c;带你从编程零基础到精通。 一、自学编程需要注意什么&#xff1f; 自学编程需要注意以下几点&#xff1a;…

DELL Poweredge R320 U盘安装2008R2系统

用U盘安装2008R2系统&#xff0c;需要加载RAID H310驱动&#xff0c;下载并解压到U盘后在Windows安装加载&#xff0c;raid驱动下载链接如下(https://downloads.dell.com/FOLDER01460337M/9/SAS-RAID_Driver_R2_4R5XT_A03_6.801.5.0_ZPE.exe)

magnetX,资源搜索神器!老司机快上车!

magnetX 中文版是一款非常好用的资源搜索神器&#xff0c;界面干净简洁并且不会有弹窗。而且可以通过关键字搜索&#xff0c;或者网址过滤这两种方式快速找到你想要的资源&#xff0c;并且还能配合WebTorrent在线播放&#xff0c;还可以配合下载工具进行一键下载资源&#xff0…

达人评测 rtx3080ti和rx6900xt怎么选

AMD Radeon RX 6900 XT 显卡采用 AMD RDNA 2 架构&#xff0c;具有 80 个强大的增强型计算单元、128 MB 全新 AMD Infinity Cache 和 16GB 专用 GDDR6 显存&#xff0c;带来超高帧率以及高水准的 4K 分辨率画面游戏体验。选RX6900XT还是 RTX3080ti的这些点很重要!看完你就知道了…

4070ti显卡和RX 7900XT显卡对比 rtx4070ti和RX 7900XT性能差距

RX 7900XT 基于旗舰级 Navi31处理器。它包含5376个流处理器、336个纹理映射单元 &#xff08;TMU&#xff09;、192个渲染输出单元 (ROP) 和84个光线追踪核心。它还具有基于宽320位总线的20GB GDDR6显存 显卡选3080ti还是RTX 4070TI这些点很重要 http://www.adiannao.cn/dq RTX…
最新文章