《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.3 SLC Nand Flash芯片

简介:

本节书摘来异步社区《嵌入式Linux软硬件开发详解——基于S5PV210处理器》一书中的第2章,第2.1节,作者:刘龙,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.3 SLC Nand Flash芯片

嵌入式Linux软硬件开发详解——基于S5PV210处理器

2.3.1 NOR Flash与NAND Flash对比

在嵌入式系统中,很多信息在系统关闭电源后不能够丢失,这些信息需要使用非易失性存储器来存储,我们可以使用NOR Flash和NAND Flash来实现。

NOR Flash和NAND Flash是现在市场上两种主要的非易失闪存技术。Intel公司于1988年首先开发出NOR Flash技术;1989年,东芝公司开发出NAND Flash技术。NAND Flash和NOR Flash的主要区别如表2-3所示。

4a8a0695d68390f24783f7bf2b19783c8b4f2088

2.3.2 SLC与MLC NAND Flash技术对比

在嵌入式设备中使用SLC和MLC这两种不同类型的NAND Flash闪存技术的设备都很常见。SLC全称为Single-Level Cell,单层单元闪存;MLC全称为Multi-Level Cell,多层单元闪存。两者的主要区别是SLC每一个单元储存一位数据,而MLC通过使用多个电压等级,每一个单元储存两位数据,数据密度比较大。

SLC生产成本较高,但在效能上大幅胜于MLC。SLC晶片可重复写入约10万次,而MLC晶片的写入次数约为1万次,目前三星采用的MLC芯片写入寿命在5000次左右。在读写速度上,相对于主流SLC芯片,MLC芯片理论速度较慢。MLC能耗大于SLC,在相同使用条件下比SLC要多15%左右的能耗,因为MLC理论写入次数上限相对较少,所以在相同使用情况下,使用寿命比SLC短。

两种闪存技术对应芯片区别如表2-4所示。

5469300fb4575c009da252b80d81aeff45c18e35

Smart210开发板无NOR Flash。采用的是SLC类型NAND Flash,容量为512MB,型号为K9F4G08UOB。

2.3.3 K9F4G08UOB引脚功能

K9F4G08UOB的引脚排列如图2-8所示,各个引脚的功能如表2-5所示。

94259fa5b5e23f5b8941a7b755a0a3a9098a6cb9 97e56a3a3d62cf34f67a74c31acfdc153618f319

I/O0~I/O7:地址、数据和命令输入/输出引脚。
CLE、ALE:命令锁存使能引脚和地址锁存使能引脚,用来选择I/O输入的信号是命令还是地址。
overline {{text{CE}}}、overline {{text{RE}}}、overline {{text{WE}}} :片选信号、读使能信号和写使能信号引脚。
overline {frac{{text{R}}}{{text{B}}}}:状态引脚,表示设备的状态,当数据写入、编程和随机读取时,overline {frac{{text{R}}}{{text{B}}}}处于高电平,表明芯片正忙,否则输出低电平。
K9F4G08UOB内部结构如图2-9所示。

419536e8730d7e63c47a44d70fcc27a9bb9f40d6

NAND Flash设备的存储容量是以页(Page)和块(Block)为单位,1Block=64Page,1Page=2112Byte(2048Byte用于存放数据,其余64Byte用于存放其他信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等)。

容量为512MB的NAND Flash存储结构为:2048Byte×64Page×4096Blocks。

芯片(Device)、块(Block)、页(Page)之间的关系如下。

1 Device = 4,096 Blocks = 4096×64 Pages = 256K Pages

1 Block = 64 Page

1 Page = 2112 Byte = 2048 Byte + 64 Byte

用于数据存储的单元有 2048 Bytes×64 Pages×4096 Blocks = 512 MB。

用于ECC校验或其他功能的单元有64 Bytes×64 Pages×4096 Blocks = 16MB 。

NAND Flash以页为单位进行读和编程(写)操作,一页为2048Byte;以块为单位进行擦除操作,一块为2048Byte×64page=128KB。

K9F4G08UOB的内部对每一页又进行了划分,每页分成前2048Byte的Main域和64Byte的Spare域,在Main域中,分成A、B、C、D四个扇区;Spare域中,分成E、F、G、H四个扇区。每个扇区占据不同的存储空间,具体分布情况如图2-10、图2-11所示。

2b62b66d162dcfd8114b9b58a83313122054b178

2.3.4 NAND Flash硬件设计

S5PV210和K9F4G08UOB的连接方式如图2-12所示。

K9F4G08UOB的访问地址、数据和控制命令只能在引脚I/O[7:0]上传递。对于不同的数据类型,S5PV210微处理器和NAND Flash之间是通过控制总线和一些命令序列来进行区分的。该NAND Flash芯片所支持的命令序列如表2-6所示。

51c9efeec94ce9bcd02b545320f9da4faa6f654b 699e9a5f338860762f30d005306bf047bfd311eb

通过表2-6我们可以看出,如果微处理器想要读NAND Flash的内容,可以在CLE和overline {{text{RE}}}引脚的配合下,通过I/O0~I/O7引脚先后发送00h与30h命令;如果想要读取NAND Flash的内部厂商内置的ID,可以在CLE和overline {{text{RE}}}引脚的配合下,发送90h命令;如果S5PV210想要对NAND Flash进行随机地址的写操作,可以在CLE和overline {{text{WE}}}引脚的配合下,首先发送85h命令,然后指定所要写的地址。

K9F4G08UOB容量为512MB,需要30根地址线确定微处理器要访问的地址,而K9F4G08UOB只有8个I/O口,所要操作的地址是在控制引脚的配合下,先后5次发送至Flash内部。发送地址时地址序列如表2-7所示。

dfe04f859bd870a4c7543d07cf9092dca579a98e

序列中列地址为A0~A11,行地址为A12~A29,L表示在写的时候置为0。对S5PV210访问NAND Flash地址的指定,只需要分5步将地址值写入S5PV210的NAND Flash控制寄存器即可,NAND Flash控制器会自动地通过8个I/O,在控制引脚帮助下,分五次通过I/O0~I/O7完成对NAND Flash地址的写操作。

相关文章
|
4小时前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
49 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
4小时前
|
安全 Linux API
Linux设备模型统一:桥接硬件多样性与应用程序开发的关键
在Linux的宏大世界中,各种各样的硬件设备如星辰般繁多。从常见的USB设备到复杂的网络接口卡,从嵌入式设备到强大的服务器,Linux需要在这些差异极大的硬件上运行。这就引出了一个问题:Linux是如何统一这些不同硬件的设备模型的呢?本文将探讨Linux是如何针对不同的硬件统一设备模型的,这一统一的设备模型对于应用程序开发人员来说又有何意义。让我们一探究竟🕵️‍♂️。
Linux设备模型统一:桥接硬件多样性与应用程序开发的关键
|
4小时前
|
JSON 机器人 Linux
推荐一款嵌入式Linux开源框架与封装-cpp-tbox
推荐一款嵌入式Linux开源框架与封装-cpp-tbox
59 3
|
4小时前
|
Linux Shell
嵌入式Linux系统脚本小技巧之启动脚本
嵌入式Linux系统脚本小技巧之启动脚本
19 2
|
4小时前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
48 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
4小时前
|
Linux C语言
|
4小时前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
27 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
4小时前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
该文指出了学习嵌入式Linux开发的两个常见误区。一是过分专注于学习桌面或服务器版Linux,而非关注嵌入式开发本身,实际上只需熟悉基本操作即可。二是试图在没有基础的情况下直接阅读Linux内核源代码,这是不切实际的,应先建立基础知识再进行源码学习。文章还提到了在嵌入式系统中获取和处理屏幕数据的示例,包括使用gsnap工具将framebuffer数据转为图像,以及涉及的交叉编译过程。
11 0
|
4小时前
|
前端开发 Linux iOS开发
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
【4月更文挑战第30天】Flutter扩展至桌面应用开发,允许开发者用同一代码库构建Windows、macOS和Linux应用,提高效率并保持平台一致性。创建桌面应用需指定目标平台,如`flutter create -t windows my_desktop_app`。开发中注意UI适配、性能优化、系统交互及测试部署。UI适配利用布局组件和`MediaQuery`,性能优化借助`PerformanceLogging`、`Isolate`和`compute`。
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
|
4小时前
|
编解码 Linux
FFmpeg开发笔记(十二)Linux环境给FFmpeg集成libopus和libvpx
在《FFmpeg开发实战》一书中,介绍了如何在Linux环境下为FFmpeg集成libopus和libvpx,以支持WebM格式的Opus和VP8/VP9编码。首先,下载并安装libopus。接着,下载并安装libvpx。最后,在FFmpeg源码目录下,重新配置FFmpeg,启用libopus和libvpx,编译并安装。通过`ffmpeg -version`检查版本信息,确认libopus和libvpx已启用。
30 1
FFmpeg开发笔记(十二)Linux环境给FFmpeg集成libopus和libvpx