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

来源:互联网 发布:查看域名是否备案 编辑:程序博客网 时间:2024/05/25 01:36
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-A7send_addr(0x00);//列地址A8-A12send_addr((addr)&0xff);//行地址A13-A20send_addr((addr>>8) & (0xff));//行地址A21-A28send_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,周期就为10nsTACLS > 0 nsTWRPH0> 15nsTWRPH1 > 5ns TACLS的值 = HCLK x TACLS > 0nsTWRPH0的值 = HCLK x (TWRPH0 + 1) > 15nsTWRPH1的值 = HCLK x (TWRPH1 +1) > 5ns */#define TACLS 1#define TWRPH0 2#define TWRPH1 1void 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();//清除RnBclear_RnB();//发送命令send_cmd(0xff);//等待RnBwait_RnB();//取消选中deselect_chip();}








0 0
原创粉丝点击