读nandflash---根据数据手册K9GAG08U0D
发布时间:2020-12-15 17:31:57 所属栏目:百科 来源:网络整理
导读:nandflash的操作单位: nandflash的操作包括读、写和擦除。其寻址单位是页,读写时是以页为单位,擦除时则以块为单位。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 图1: 芯片(页)读操作时序图 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
nandflash的操作单位:
nandflash的操作包括读、写和擦除。其寻址单位是页,读写时是以页为单位,擦除时则以块为单位。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ?图1:芯片(页)读操作时序图? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
按照芯片手册上的时序图得出芯片工作流程;由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(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |