加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

读nandflash---根据数据手册K9GAG08U0D

发布时间:2020-12-15 17:31:57 所属栏目:百科 来源:网络整理
导读:nandflash的操作单位: nandflash的操作包括读、写和擦除。其寻址单位是页,读写时是以页为单位,擦除时则以块为单位。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图1: 芯片(页)读操作时序图 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
nandflash的操作单位:
nandflash的操作包括读、写和擦除。其寻址单位是页,读写时是以页为单位,擦除时则以块为单位。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ?图1:芯片(页)读操作时序图? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ??
图2:命令字




按照芯片手册上的时序图得出芯片工作流程;由I/Ox读操作时序(图1)以及命令字(图2)得知

1、发送命令0x00
2、发送五个时序周期的地址:即两个列地址、三个行地址(先发低位、再发高位)
? ?图3 ? nandflash地址序列



3、发送命令0x30
4、等待R/B(就绪/忙输出信号线)变成高电平。
5、读取数据

操作nandflash还需一些公共的操作:
最先开始应先使能选中nandflash芯片,再查询nandflash的状态寄存器NFSTAT的0位等于1(?NAND Flash memory ready to operate)如下图
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?图4 :nandflash的状态寄存器NFSTAT的0位


之后再执行以上由时序图得出的命令。最后在失能未选中nandflash芯片。


总结以上从nandflash按页读取数据的步骤;
如下:
1、先使能选中nandflash芯片
2、查询nandflash的状态寄存器NFSTAT的0位等于1
3、发送命令0x00
4、发送五个时序周期的地址:即两个列地址、三个行地址(先发低位、再发高位)
5、发送命令0x30
6、等待R/B(就绪/忙输出信号线)变成高电平。
7、读取数据
8、失能未选中nandflash芯片。

按页读取的代码如下:
//nandflash按页读函数
//addr;读取的页地址
//buf:要存入的地址
void Nand_Read(unsigned long addr,unsigned char* buf)
{		
		int i;


		/* 1、先使能选中nandflash芯片 */
		select_chip();

		/* 2、查询nandflash的状态寄存器NFSTAT的0位等于1 或者 清除状态寄存器NFSTAT的第4位RnB;使其为高电平,代表前面的命令执行完毕*/
		clear_RnB();

		/* 3、发送命令0x00 */
		send_cmd(0x00);

		/* 4、发送五个时序周期的地址:依次发送两个列地址、三个行地址 (先发低位、再发高位)*/
		send_addr(0x00);//列地址A0-A7
		send_addr(0x00);//列地址A8-A12
		
		send_addr((addr)&0xff);//行地址A13-A20
		send_addr((addr>>8) & (0xff));//行地址A21-A28
		send_addr((addr>>16) & (0xff));//行地址A29-A31
		
		/* 5、发送命令0x30 */
		send_cmd(0x30);

		/* 6、等待R/B(就绪/忙输出信号线)变成高电平。*/
		wait_RnB();

		/* 7、读取数据 ;读取的整个页:4K*/
		
		 for(i = 0; i<1024*4; i++)
	    {
	    	buf[i] = NFDATA;
	    }
      
		 /* 8、失能未选中nandflash芯片。*/
		deselect_chip();
}




补充nandflash初始化(注意从时序图与芯片手册中得到时序参数值的方法):
1、初始化NFCONF(配置时序参数)
? ? ? ? ? ? ? ? ? ??图5:NFCONF需配置的三个时序数值 TACLS、TWRPH0、TWRPH1


由NANDflash芯片手册的命令时序图得出以上寄存器参数的值

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图6:NANDflash芯片手册的命令时序图




? ? ? ? ? ? ? ? ? ? ? ? ? ?图7:NANDflash芯片手册的命令时序时间参数




? ? ? ? ? ? ? ? ? ?图8:nandflash发送命令及地址操作时序图(6410芯片手册中)


比对图6、图7、图8得出?TACLS、TWRPH0、TWRPH1三个参数的大致值
TACLS:最小值0ns
TWRPH0 : 最小值15ns
TWRPH1 : 最小值15ns

2、初始化NFCONT(使nandflash工作,但不选中芯片)



3、复位(注意操作nandflash的次序:1、选中;2、清除RnB;3、发送命令;4、等待RnB;5、取消选中)


nandflash初始化代码如下
/*
HCLK的频率为100MHZ,周期就为10ns
TACLS > 0 ns
TWRPH0	> 15ns
TWRPH1 > 5ns
 
TACLS的值 = HCLK x TACLS > 0ns
TWRPH0的值 = HCLK x (TWRPH0 + 1) > 15ns
TWRPH1的值 = HCLK x (TWRPH1 +1) > 5ns 
*/
	
#define TACLS 1
#define TWRPH0 2
#define TWRPH1 1

void nand_init(void)
{

	/* 1、初始化NFCONF */
	NFCONF &= ~((7<<12)|(7<<8)|(7<<4)); //先清零
	NFCONF |= ((TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)); 
	
	/* 2、初始化NFCONT */
	
	NFCONT = 1 | (1<<1);//使nandflash工作,但不选中芯片
	
    /* 3、复位 */
	reset();
}
void reset(void)
{
//选中芯片
select_chip();
//清除RnB
clear_RnB();
//发送命令
send_cmd(0xff);
//等待RnB
wait_RnB();
//取消选中
deselect_chip();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读