镁光MT25QU01GXXX norflash调试笔记

目录

    • 前言
    • 一、芯片概述
    • 二、数据手册解释
      • 1. 数据手册获取
      • 2.内容概括
    • 三、几个操作的代码
      • 1.复位芯片操作
      • 2.读取芯片ID
      • 3.擦除芯片扇区
      • 4.向芯片存入数据
      • 5.读取存储的数据
      • 6.其它操作函数

前言

本笔记总结如何使用MCU对nor flash进行数据存储,包括芯片基本介绍,编程序列,关键过程代码编写;
对于使用linux内核的SOC控制此芯片的开发,内核中有比较成熟的框架可以使用;

一、芯片概述

通信协议
支持spi标准IO协议,D0为输入(MOSI),D1为输出(MISO),全双工;
支持dual IO协议,D0和D1同时为输入或者输出,半双工;
支持quad IO协议,D0 D1 D2 D3同时为输入或者输出,半双工;

时钟速率
对三种IO传输协议在单传输速率下时钟支持166Mhz最大时钟;
对三种IO传输协议在单传输速率下时钟支持90Mhz最大时钟;

数据传输速率
三种IO传输协议最大可以到 90MB/s的

容量
1Gb = 128MB;

地址模式
支持三字节或者四字节地址模式;
通过地址模式寄存器进行设置地址模式;
三字节地址模式只能访问到128Bb(16MB)存储区域;

一次可以擦除的容量大小
支持整个扇区擦除64KB;
支持子扇区擦除32KB或者4KB;

支持安全和扇区写保护
每个64KB扇区的易失性和非易失性锁定和软件写保护;
非易失性配置锁定;
密码保护;
硬件写保护:非易失性位(BP[3:0]和TB)定义保护区大小;
通电期间的编程/擦除保护;
CRC检测原始数据的意外更改;

二、数据手册解释

1. 数据手册获取

见https://www.findic.com/doc/browser/deYBpa6Pz?doc_id=113712255#locale=zh-CN

2.内容概括

1.器件特点介绍,如主要的功能,器件命令规则;
2.重要声明;
3.设备描述,主要介绍芯片内部逻辑结构;
4.封装介绍;
5.以Register为章节名的寄存器介绍;
6.器件ID数据定义说明
可以以此数据作为芯片调试的切入点以验证读写通路是否正常在这里插入图片描述

7.命令集定义,定义关于:
芯片软复位操作,
ID获取操作,
3字节和4字节地址读存储操作,
写使能操作,
读写寄存器操作,
3字节和4字节地址编程操作,
3字节和4字节地址擦除操作,
4字节地址模式设置操作,
扇区保护操作等命令的说明;

8.以Operations为标题的章节,主要是对命令集中各个命令的操作时序进行说明;

9.存储扇区分布
在这里插入图片描述

三、几个操作的代码

1.复位芯片操作

操作时序

在这里插入图片描述
复位使能命令和复位存储器命令必须先后发送且满足大于一定的时间间隔手册定义tSHSL2为最少30ns,图中S#片选信号的中间拉高的一段为两个指令之间的执行间隔;

代码示意

void XXXplateform_send_cmd(unsigned char cmd,unsigned char *indata,unsigned int indata_len,unsigned char *outdata)
{}
void chip_reset()
{unsigned char reseten_cmd=0x66;unsigned char resetmemory_cmd=0x99;cs_low;XXXplateform_send_cmd(reseten_cmd,NULL,NULL,NULL);cs_high;delay_ns(50);cs_low;XXXplateform_send_cmd(resetmemory_cmd,NULL,NULL,NULL);cs_high;
}

2.读取芯片ID

操作时序

在这里插入图片描述

代码示意

typedef struct chipID_info{unsigned char ManufacturerID; unsigned char DeviceID[2]; unsigned char UniqueID[17];
}chipID_info_t;unsigned char XXXplateform_read_data()
{unsigned char  data;///read codereturn data;
}
void XXXplateform_send_cmd(unsigned char cmd,unsigned char *indata,unsigned int indata_len,unsigned char *outdata)
{///write cmd +  data codeif (cmd == 0x9E && outdata){for(unsigned char i=0;i<22;i++){outdata[i] = XXXplateform_read_data();}}
}chipID_info_t read_chipID()
{unsigned char readId_cmd=0x9E;unsigned char dummy_data[20]={0x00};unsigned char chipId_data[20]={0x00};chipID_info_t  chipID;cs_low;
XXXplateform_send_cmd(readId_cmd,dummy_data,sizeof(dummy_data)/sizeof(dummy_data[0]),chipId_data);cs_high;chipID = (chipID_info_t)(chipId_data);return chipID;
}

3.擦除芯片扇区

操作时序

在这里插入图片描述

代码示意

void  write_enable(unsigned char cmd)
{cs_low;XXXplateform_send_cmd(cmd,NULL,NULL,NULL);cs_high;
}
void  erase_sector(unsigned char cmd,unsigned int addr)
{unsigned char addr[4];write_enable(0x06)//enable writedelay_ns(50);//>30nscs_low;//以3字节地址为例,addr的值见存储分布说明addr[0]=addr&0xFF;addr[1]=(addr>>8)&0xFF;addr[2]=(addr>>16)&0xFF;XXXplateform_send_cmd(cmd,addr,3,NULL); //cmd 20h:4KB  52h:32KB  DBh:64KB  C4h:整片擦除cs_high;delay_ns(50);//>30nswrite_enable(0x04)//disable write
}

4.向芯片存入数据

写入前先擦除,如果其中存有数据先读出再擦除;

操作时序
在这里插入图片描述

代码示意

void program_operations(unsigned char cmd,unsigned int addr,unsigned char *indata,unsigned int  indata_len)
{unsigned char addr[4];unsigned char data[4099];//3bytes addr  +  4096bytes datawrite_enable(0x06)//enable writedelay_ns(50);//>30nscs_low;//以3字节地址为例,addr的值见存储分布说明addr[0]=addr&0xFF;addr[1]=(addr>>8)&0xFF;addr[2]=(addr>>16)&0xFF;memcpy(data,addr,3);memcpy(&data[3],indata,indata_len);XXXplateform_send_cmd(cmd,data,indata_len+3,NULL); cs_high;delay_ns(50);//>30nswrite_enable(0x04)//disable write
}

5.读取存储的数据

操作时序
在这里插入图片描述
代码示意


void XXXplateform_send_cmd(unsigned char cmd,unsigned char *indata,unsigned int indata_len,unsigned char *outdata)
{///write cmd +  data codeif (cmd == 0x03 && outdata) //read memory data{for(unsigned char i=0;i<indata_len+1;i++){outdata[i] = XXXplateform_read_data(); //outdata[0]:cmd outdata[1]~outdata[3]:addr  outdata[4]~outdata[indata_len]:实际获取的存储数据}}
}
void readmemory_operations(unsigned char cmd,unsigned int addr,unsigned char *outdata,unsigned int  outdata_len)
{unsigned char addr[4];unsigned char dummy_data[4099]={0x35};//3bytes addr  +  4096bytes datacs_low;//以3字节地址为例,addr的值见存储分布说明addr[0]=addr&0xFF;addr[1]=(addr>>8)&0xFF;addr[2]=(addr>>16)&0xFF;memcpy(dummy_data,addr,3);memcpy(&dummy_data[3],dummy_data,outdata_len);XXXplateform_send_cmd(cmd,dummy_data,outdata_len+3,outdata); cs_high;
}

6.其它操作函数

略,看手册实现即可

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt界面设计时使各控件依据窗口缩放进行栅格布局的方法

图1 最终效果 想要达成上述图片的布局效果&#xff0c;具体操作如下&#xff1a; 新建一窗体&#xff1a; 所需控件如下&#xff1a; Table View控件一个&#xff1b; Group Box控件一个&#xff1b; Push Button控件2个&#xff1b; Horiziontal Spacer控件2个&#xf…

【Git】:Git基本操作

目录 创建、配置本地仓库 创建本地仓库 配置本地仓库 认识工作区、暂存区、版本库 修改文件 版本回退 撤销修改 删除文件 创建、配置本地仓库 创建本地仓库 我们通常可以通过以下两种方式之一获取 Git 存储库&#xff1a; 自己在本地目录创建一个本地仓库 从其它服务…

CANDENCE: 绘制好的封装元件 刷新(Refresh) 和 替换 (Replace)焊盘

绘制好的封装元件 刷新(Refresh) 和 替换 &#xff08;Replace&#xff09;焊盘 一、刷新(Refresh) 1、以下面这个bga484封装的元件为例 2、打开bga的焊盘文件 3、我们对上面这个焊盘稍加修改&#xff0c;如下&#xff0c;然后保存 4、在封装编辑页面&#xff0c;如下操作 5…

HarmonyOS:使用ArkWeb构建页面

一、简介 页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 页面加载过程中&#xff0c;若涉及网络资源获取&#xff0c;需要配置ohos.permission.INTERNET网络访问权限。 二、…

修改一下达梦disql 提示符

经常用disql的有时某些信息希望提示一下&#xff0c;默认的只显示SQL> 为了方便使用&#xff0c;可以在 glogin.sql 中增加些内容。 vi $DM_HOME/bin/disql_conf/glogin.sql增加以下几行 set time on set lineshow offcol global_name new_value global_name SELECT ins…

跨境出海安全:如何防止PayPal账户被风控?

今天咱们聊聊那些让人头疼的事儿——PayPal账户被风控。不少跨境电商商家反馈&#xff0c;我们只是想要安安静静地在网上做个小生意&#xff0c;结果不知道为什么&#xff0c;莫名其妙账户就被冻结了。 但其实每个封禁都是有原因的&#xff0c;今天就来给大家分享分享可能的原…

如何读论文【论文精读·1】

第一遍题目 摘要 结论 方法 实验 是不是适合自己看看自己适不适合这篇文章。&#xff08;花时最少&#xff0c;做海选&#xff09; 不需要懂太具体的公式。这一遍阅读之后&#xff0c;你需要再继续思考一下这篇论文的质量以及和自己研究方向的契合程度&#xff0c;决定一下自己…

【模块一】kubernetes容器编排进阶实战之pod生命周期、探针简介、类型及示例

kubernetes pod生命周期、探针简介、类型及示例 kubernetes pod生命周期 pod的生命周期(pod lifecycle)&#xff0c;从pod start时候可以配置postStart检测&#xff0c;运行过程中可以配置livenessProbe和 readinessProbe,最后在 stop前可以配置preStop操作 探针简介 探针是由…

医学AI公开课·第一期|Machine LearningTransformers in Med AI

小罗碎碎念 从这周开始&#xff0c;我计划每个周末录一个视频&#xff0c;分享一些医学人工智能领域的进展。 作为第一期视频&#xff0c;我打算介绍一下机器学习和Transformer在医学AI领域中的应用。 为了准备这期视频&#xff0c;总共做了24页PPT&#xff08;三部分内容&…

[代码随想录Day21打卡] 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇

669. 修剪二叉搜索树 给定一个二叉搜索树root&#xff0c;给定一个范围[low, high]&#xff0c;修剪二叉搜索树&#xff0c;使修建后的二叉搜索树的值的范围在[low, high]内。 思想&#xff1a;当前节点的值和给定的范围之间的关系&#xff0c;如果当前节点的值大于high那么就…

apr共享内存

下载&#xff1a; Download - The Apache Portable Runtime Project 编译&#xff1a; 使用cmake-gui生成库&#xff1a; apr-1.lib aprapp-1.lib libapr-1.lib libaprapp-1.lib libapr-1.dll 在Developer PowerShell for VS 2019中&#xff1a; 执行nmake -f Makefile.win来…

借助算力云跑模型

算力平台&#xff1a;FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤&#xff08;因为我也不熟练&#xff09;。 【注】&#xff1a;进入平台&#xff0c;注册登录账号后&#xff0c;才能租用。学生认证&#xff0b;实名认证会有免费的算力资源&#xff0…

聚水潭与MySQL数据集成案例分享

聚水潭数据集成到MySQL的技术案例分享 在现代数据驱动的业务环境中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接成为企业关注的焦点。本次案例将详细介绍如何通过轻易云数据集成平台&#xff0c;将聚水潭的数据无缝集成到MySQL数据库中&#xff0c;实现从“聚水谭…

C语言中const char *字符进行切割实现

将127.0.0.1以“”“.”来进行切割&#xff0c;实现如下&#xff1a; const char * ip "127.0.0.1";char *test new char[100];strcpy(test, ip);const char *split ".";char *final;final strtok(test, split);while (final){printf("%s\n"…

java基础知识(常用类)

一、包装类&#xff08;Wrapper) &#xff08;1&#xff09;包装类与基本数据的转换 装箱&#xff1a;基本类型->包装类型 拆箱&#xff1a;包装类型->基本类型 java5以后是自动装箱和拆箱的方式&#xff0c;自动装箱底层调用的是valueOf方法&#xff0c;比如Integer.…

【Python系列】字典灵活的数据存储与操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

neo4j图数据库community-5.50创建多个数据库————————————————

1.找到neo4J中的conf文件&#xff0c;我的路径是&#xff1a;D:\Program Files\neo4j-community-5.5.0-windows\neo4j-community-5.5.0\conf 这里找自己的安装路径&#xff0c; 2.用管理员模式打开conf文件&#xff0c;右键管理员&#xff0c;记事本或者not 3.选中的一行新建一…

AVL树实现

1. AVL的概念 AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性质的⼆叉搜索树&#xff1a;它的 左右⼦树都是AV树&#xff0c;且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树&#xff0c; 通过控制⾼度差去控制平…

jvm发展历程介绍

初始阶段&#xff1a;JDK 1.0 - JDK 1.1 • 经典JVM&#xff1a;这是JVM的早期实现&#xff0c;主要特点是使用解释器&#xff08;Interpreter&#xff09;来逐行解释执行Java字节码。这种方式虽然简单直接&#xff0c;但执行效率相对较低。 • JIT编译器&#xff08;Just-In-T…

准备阶段 Profiler性能分析工具的使用(一)

Unity 性能分析器 (Unity Profiler) 性能分析器记录应用程序性能的多个方面并显示相关信息。使用此信息可以做出有关应用程序中可能需要优化的事项的明智决策&#xff0c;并确认所做的优化是否产生预期结果。 默认情况下&#xff0c;性能分析器记录并保留游戏的最后 300 帧&a…