Nandflash

一、Nandflash原理介绍

  1. Nandflash的内部结构
    在这里插入图片描述 (1)Nandflash由2048Block组成,每个Block包含64个Page,每个Page大小为2KB+64B;
    (2)Page是由2KB的存储区域+64Byte的oob区域组成,oob区的作用是存储ECC校验码,不存储数据,CPU会自动忽略掉oob区的存在。
    (3)ECC校验是升级版的奇偶校验,8bit数据需要5bitECC校验码,此后数据位每增加1倍,ECC校验码就增加1位;

  2. Nandflash的电路图
    在这里插入图片描述(1)LDATA0 ~ LDATA7:8位数据总线,一次性可以传输1Byte数据,Nandflash不含地址总线,所以8条线可以CLE和ALE的不同来传输命令、地址、数据;
    (2)CLE、ALE:CLE拉高——传输命令;ALE拉高——传输地址;CLE、ALE同时拉低——传输数据
    (3)RnB、nFCE、nFWE、nFRE:状态信号、片选引脚、读信号、写信号是由Nandflash控制器来控制的,当CPU发出地址/读/写信号后,Nandflash会自动控制这些引脚拉底或升高。
    (4)nandflash是8bit设备,I/O0直接与LDATA0相连无需错开。

  3. 操作原理
    (1)Nandflash是有8根总线,因此一次可以传输8bit数据,但Nandflash容量为128M,因此当CPU发出地址后,Nandflash需要将地址拆分后多次传给Nandflash;
    (2)Nandflash同Norflash一样都是外接设备,但Norflash可以向内存一样读,所以可以通过指针间接获取数据,而Nandflash无法向内存一样读写,因此CPU对Nandflash的操作都需要参考Nandflash的芯片手册向Nandflash发出命令;
    (3)由于Nandflash是8bit设备,I/O0直接与LDATA0相连,因此可以直接向Nandflash发送地址而无需左移;

二、实验编程
在这里插入图片描述

  1. 命令函数
    (1)于操作Nandflash是外设,因此对Nandflash的操作需要参考芯片手册在这里插入图片描述
int nand_cmd(char cmd)		//命令函数
{
	NFCMMD = cmd;
}
int nand_addr(int addr)		//地址函数
{
	NFADDR = addr;
}
char nand_data()			//数据函数
{
	return NFDATA;
}

(2)由于Norflash是外部设备,因此在擦除和写命令发出后,CPU需要等待Norflash工作完成,才能进行下一步操作。在这里插入图片描述

while(!(NFSTAT & 1));		//操作等待

2、初始化Nandflash控制器
包括:设置时序、使能Nandcon、禁止片选、使能ECC
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

	NFCONF = (0<<12) | (1<<8) | (0<<4);		//设置时序
	NFCONT = (1<<4) | (1<<1) | (1<<0);		//初始化NFCONT
  1. 扫描ID
    在这里插入图片描述
	nand_select();			//片选信号
	nand_cmd(0x90);			//发出命令
	nand_addr(0x00);		//发出地址

在这里插入图片描述在这里插入图片描述

	//获取数据
	str[0] = nand_data();
	str[1] = nand_data();
	str[2] = nand_data();
	str[3] = nand_data();
	str[4] = nand_data();
  1. 读取数据
    在这里插入图片描述
    由于Nandflash的读和写一次只能操作1Page的数据,因此需要考虑要读取的数据长度是否大于1Page,如果大于1Page就需要换Page;
//获取地址
int addr = get_uint();		
int col = addr & 2047;
int row = addr / 2048;
//片选信号
nand_select();	
//发出命令、地址			
nand_cmd(0x00);				
nand_addr(col & 0xff);		
nand_addr((col>>8) & 0xff);
nand_addr(row & 0xff);
nand_addr((row>>8) & 0xff);
nand_addr((row>>16) & 0xff);
nand_cmd(0x30);				
//等待操作
nand_wait();
//得到数据
while((i < len) && (col < 2048))
{
	data[i++] = nand_data();
	col ++;
}
if(i == len)
{
	break;
}
row++;
col = 0;
}
//取消片选
nand_deselect();
  1. 写数据
    在这里插入图片描述
    写数据同样需要考虑操作的范围问题,如若大于1Page就需要Page+1。
//发出命令、地址
nand_cmd(0x80);
nand_addr(col & 0xff);
nand_addr((col>>8) & 0xff);
nand_addr(row & 0xff);
nand_addr((row>>8) & 0xff);
nand_addr((row>>16) & 0xff);
//发送数据
while((i < len) && (col < 2048))
{
	NFDATA = data[i];
	i++;
	col++;
}
//发送命令
nand_cmd(0x10);
  1. 擦除命令
    在这里插入图片描述
    Nandflash一次即便只想擦除1Byte数据,也必须擦除1个blocks(2048642)

//发出命令、地址
nand_cmd(0x60);
nand_addr(row & 0xff);
nand_addr((row>>8) & 0xff);
nand_addr((row>>16) & 0xff);
nand_cmd(0xD0);
//等待操作
nand_wait();
### NAND Flash 技术原理 NAND Flash 的工作基于浮栅晶体管结构,其中每个存储单元由一个浮动门和控制门组成。当对控制门施加电压时,电子可以通过量子隧穿效应进入或离开浮动门,从而改变其电荷状态并表示二进制信息[^1]。 #### 存储单元及操作原理 NAND Flash 中的数据是以页为单位进行读写的,而擦除则是按块执行。每一页包含多个字节的数据区以及少量冗余区域用于错误校验码(ECC)。这种设计使得 NAND Flash 能够实现高密度集成,在相同面积下容纳更多比特数的信息[^2]。 对于写入过程而言,如果仅需修改部分页面中的少数几位,则仍需先将整个数据块加载到缓存中再做相应更改最后重新编程回原位置——这被称为“重写”。此特性决定了即使是对极少量数据的操作也可能会涉及较大范围内的改写动作[^3]。 ### 应用场景分析 鉴于上述特点,NAND Flash 广泛应用于需要高效处理大批量连续数据的应用场合: - **固态硬盘 (SSD)**:作为主要非易失性存储介质之一,提供了快速随机访问性能的同时保持了相对低廉的价格; - **移动设备**:智能手机和平板电脑内部常采用 eMMC 或 UFS 形式的嵌入式 NAND 解决方案来满足本地文件系统的运行需求; - **工业级产品**:如监控录像机、行车记录仪等长时间不间断录制视频流的产品也会依赖于 NAND 提供稳定可靠的长期保存能力。 ```python # 示例代码展示如何通过 Python 接口与 SSD 进行交互 import os def write_data_to_ssd(file_path, data): with open(file_path, 'wb') as f: f.write(data.encode()) write_data_to_ssd('/path/to/ssd/device', 'example content') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值