RT thread 之 Nand flash 读写过程分析
文章目录
- 前言:什么是Nand Flash?
- 1、Nand Flash 读取步骤
- 2、从主存读到Cache
- 2.1 在标准spi接口下读取过程
- 2.2 测试时序(SPI频率30MHz)
- 3.从Cache读取数据
- 3.1在标准spi接口读取过程
- 测试时序
前言:什么是Nand Flash?
NAND Flash
是一种常见的闪存存储器类型,广泛应用于各种电子设备中,如手机、平板电脑、嵌入式系统等。它是一种非易失性存储器,可以持久地保存数据即使在断电情况下。
NAND Flash 与传统的 NOR Flash 相比具有较高的存储密度和较低的成本,但其随机访问速度较慢。它使用了一种称为 NAND 门的逻辑结构,使得数据存储和读取操作更加高效。
NAND Flash 存储器被组织为多个块(Block),每个块又由多个页(Page)组成。每个页通常包含一个数据区域和一个擦除区域,数据区域用于存储实际的用户数据,擦除区域用于擦除整个块。
NAND Flash 的基本操作包括读取、写入和擦除。读取操作通过指定页地址和偏移量来获取存储在特定位置的数据。写入操作将数据写入指定的页地址和偏移量。擦除操作会将整个块的数据擦除,使其变为可写状态。
在嵌入式系统中,使用 NAND Flash 存储器通常需要通过驱动程序与操作系统进行交互。驱动程序负责管理 NAND Flash 的读取、写入和擦除操作,并提供文件系统层面的接口供应用程序使用。
总的来说,NAND Flash 是一种常见的闪存存储器,具有高存储密度和低成本的优势。它在各种电子设备中广泛应用,并通过驱动程序与操作系统进行交互,提供数据存储和读取功能。
1、Nand Flash 读取步骤
NAND Flash 的读取步骤通常包括以下几个关键步骤:
-
选择芯片(Chip Select):如果系统中同时连接了多个 NAND Flash 芯片,首先需要选择要读取的芯片。这通常通过将芯片的片选引脚(CE)置为逻辑低电平来实现。
-
发送读取命令:向 NAND Flash 发送读取命令,以指示要读取的页地址和偏移量。读取命令通常是通过将命令字节序列发送到 NAND Flash 的命令/地址总线上实现的。
-
等待就绪状态:发送读取命令后,需要等待 NAND Flash 进入就绪状态,表示它已准备好进行读取操作。可以通过检查状态寄存器或等待足够的时间来实现等待。
-
读取数据:一旦 NAND Flash 进入就绪状态,就可以开始读取数据。读取的数据通常通过数据总线传输,并存储到指定的缓冲区中。
-
解码和处理数据:读取的数据可能需要进行解码和处理,以还原原始的用户数据。这通常涉及到 ECC(错误检测和纠正)算法,用于检测和纠正可能存在的位错误。
-
取消芯片选择:读取操作完成后,需要取消对芯片的选择,以释放总线资源。通常通过将芯片的片选引脚(CE)置为逻辑高电平来实现。
需要注意的是,具体的 NAND Flash 读取步骤可能会因芯片厂商和控制器的不同而有所差异。因此,在实际应用中,需要参考 NAND Flash 芯片的规格手册和相关的驱动程序文档,以了解具体的读取流程和命令序列。
- 从主存中读到Cache
- 从Cache读取数据
2、从主存读到Cache
2.1 在标准spi接口下读取过程
发送Page Read to Cache command(13H)
发送page地址 24位
检查寄存器位OIP,读取flash状态,等待主存读cache操作完成
读取hwecc
位,判断是否超过ecc
纠错的最大限度
rt_err_t spinand_read_dataload(struct rt_spi_device *spi, uint8_t u8Addr2, uint8_t u8Addr1, uint8_t u8Addr0)
{rt_err_t result = RT_EOK;uint8_t au8Cmd[4] = {CMD_PAGE_READ_TO_CACHE, u8Addr2, u8Addr1, u8Addr0};uint8_t u8SR;if ((result = rt_spi_send(spi, &au8Cmd[0], sizeof(au8Cmd))) == 0)goto exit_spinand_read_dataload;if (spinand_isbusy(spi)){result = -RT_EIO;goto exit_spinand_read_dataload;}u8SR = spinand_hwecc_status_get(spi);if ((u8SR != 0x00) && (u8SR != 0x01)){result = -RT_MTD_EECC;LOG_E("Error ECC status error[0x%x].", u8SR);}exit_spinand_read_dataload:return result > 0 ? RT_EOK : -RT_ERROR;
}
2.2 测试时序(SPI频率30MHz)
- 发送读取指令和地址:
- 检查寄存器位
OIP
,读取flash
状态,等待主存读cache
操作完成
OIP
位至0,主存读cache
操作完成
- 整个过程消耗时间
3.从Cache读取数据
3.1在标准spi接口读取过程
发送Read From Cache command(03H)
发送page地址 24位
发送数据
rt_err_t spinand_normal_read(struct rt_spi_device *spi, uint8_t u8AddrH, uint8_t u8AddrL, uint8_t *pu8Buff, uint32_t u32Count){uint8_t au8Cmd[4] = {CMD_READ_FROM_CACHE, u8AddrH, u8AddrL, DUMMY_BYTE};return rt_spi_send_then_recv(spi, &au8Cmd[0], sizeof(au8Cmd), pu8Buff, u32Count);
}
测试时序
发送读取指令和地址:
相关文章:

RT thread 之 Nand flash 读写过程分析
文章目录 前言:什么是Nand Flash?1、Nand Flash 读取步骤2、从主存读到Cache2.1 在标准spi接口下读取过程2.2 测试时序(SPI频率30MHz) 3.从Cache读取数据3.1在标准spi接口读取过程测试时序 前言:什么是Nand Flash&…...

独立站最全出单营销指南,新手卖家赶紧学起来吧!
这是一个需要投入大量时间和精力的挑战,但只有经过筛选在众多品牌和渠道中找到最适合自己的营销策略,才能成功。 新手商家经常会发现自己有很多可以改进的地方:品牌的颜色、字体以及其他一些细节。但真正走向成熟的商家会意识到,…...

Git移除commit过的大文件
前言:在提交推送本地更改至仓库时,误将大文件给提交了,导致push时报错文件过大,因此需要将已经commit的大文件移除后再push 若已知要删除的文件或文件夹路径,则可以从第4步开始 1.对仓库进行gc操作 $ git gc 2.查询…...

再见 Spring Boot 1.X ,Spring Boot 2.X 走向舞台中心
2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维护到2019年8月1日。 1.5.x 将会…...

Jsonp劫持
JSONP 介绍 jsonp是一种协议,准确的说,他是json的一种使用模式,为了解决Json受同源策略限制的问题。 基本语法 JSONP的基本语法为:callback({“name”:”test”, “msg”:”success”}) 常见的例子包括函数调用(如…...

STM32CubeIDE(串口)
目录 一、轮询模式 1.1 配置USART2为异步模式 1.2 500ms发送一次消息 1.3 通信结果 1.4 串口控制LED 二、中断收发 2.1 开启中断 2.2 中断发送接收 2.2.1 中断发送只需要调用接口 2.2.2 中断接收 2.3 实验结果 三、DMA模式与收发不定长数据 3.1 DMA通道配置 3.2 DMA…...

Python编程很简单,四步菜鸟到高手(文末送书5本)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...

Labview串口通信MSComm实现串口收发
文章目录 前言一、什么是 MSComm二、MSComm 控件下载三、MSComm 控件的注册四、使用 MSComm 控件1、前面板放置控件2、MSComm 的常用属性3、MSComm 控件的事件 五、实现串口收发1、搭建虚拟串口2、发送测试3、接收测试4、后面板核心程序框图 六、程序自取 前言 本文介绍使用 A…...
字节跳动 EB 级 Iceberg 数据湖的机器学习应用与优化
深度学习的模型规模越来越庞大,其训练数据量级也成倍增长,这对海量训练数据的存储方案也提出了更高的要求:怎样更高性能地读取训练样本、不使数据读取成为模型训练的瓶颈,怎样更高效地支持特征工程、更便捷地增删和回填特征。本文…...

CentOS 安装Mysql8
1.检查是否已经安装mysql,停止mysql服务,删除mysql ps -ef | grep -i mysql systemctl stop mysqld rpm -e mysql 2.配置仓库 更新秘钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 安装mysql8的yum源 rpm -Uvh https://dev.mysql.…...

3-Linux实操
Linux实践操作 开关机、重启、用户登陆注销关机&重启用户登陆和注销 用户管理添加用户修改用户密码删除用户查询用户信息切换用户查看当前用户用户组的添加和删除用户和组相关文件 实用指令指定运行级别init 命令帮助指令文件目录类时间日期类搜索查找类🔍压缩和…...
Yarn 集群的架构和工作原理
Yarn 的基本设计思想是将 MapReduce V1 中的 JobTracker 拆分为两个独立的服务:ResourceManager 和 ApplicationMaster。 ResourceManager 负责整个系统的资源管理和分配,ApplicationMaster 负责单个应用程序的管理。 ResourceManager RM 是一个全局的资…...
PostgreSQL-视图-03-查询对象依赖关系视图-dba_dependencies
PostgreSQL查询对象依赖关系视图 -- PostgreSQL查询对象依赖关系视图drop view if exists tzq.dba_dependencies; create view tzq.dba_dependencies as with source_obj as (select sp.oid,sp.proname,unnest(string_to_array(regexp_replace(regexp_replace(lower(sp.prosrc…...

Vue style中的 scoped 属性
Vue 中存在 scoped 属性,HTML5中也存在一个 scoped 属性,而且,这两者都是针对 css 样式处理的属性,所以很多文章在 解释 Vue scoped 的时候,都会把两者混为一谈,直接进把 HTML5 scoped 的定义搬到 Vue scop…...

移动端适配rem
1.安装amfe-flexible和postcss-pxtorem, npm install amfe-flexible --save npm install postcss-pxtorem5.1.1 (这里我使用的postcss-pxtorem是5.1.1版本)或者在pageage.json中写入 "amfe-flexible": "^2.2.1","postcss-pxtorem": …...

Go语言开发小技巧易错点100例(八)
往期回顾: Go语言开发小技巧&易错点100例(一)Go语言开发小技巧&易错点100例(二)Go语言开发小技巧&易错点100例(三)Go语言开发小技巧&易错点100例(四)Go…...

100个网络安全测试面试题
1、Burpsuite常用的功能是什么? 2、reverse_tcp和bind_tcp的区别? 3、拿到一个待检测的站或给你一个网站,你觉得应该先做什么? 4、你在渗透测试过程中是如何敏感信息收集的? 5、你平时去哪些网站进行学习、挖漏洞提交到…...

7.26 作业 QT
1.继续完善登录框,当登录成功时,关闭登录界面,跳转到新的界面中: 结果图: second.h: #define SECOND_H#include <QWidget> #include<QDebug> //信息调试类,用于打印输出的 #inc…...

Python - Opencv应用实例之树叶自动分割、标签及统计分析系统
Python - Opencv应用实例之树叶自动分割、标签及统计分析系统 本文通过Python+opencv 实现这样的需求:输出位置和角度(x, y, r),并标记出轮廓基于传统图像处理算法实现,算法原理:输入图像 -> 灰度化 -> 二值化 -> 形态学处理 -> 轮廓提取 -> 树叶中心定位 -…...
IC设计工程师,参加IC面试应该注意哪些细节?
秋招已至,诸多IC设计企业,比如联发科、长鑫、大疆、燧原、地平线、复旦微、兆易创新、百度昆仑芯等,都已经陆续开启了提前批招聘。 很多人对各种关于秋招、面试、简历的比较感兴趣,所以今天就来跟大家分享关于秋招求职面试中的一…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...