读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
- 读nandflash---根据数据手册K9GAG08U0D
- nandflash驱动分析 针对K9GAG08U0D uboot1.1.6(上)
- nandflash驱动分析 针对K9GAG08U0D uboot1.1.6(下)
- 读nandflash详解
- SylixOS NandFlash读CACHE
- nandflash
- NandFlash
- NANDflash
- nandflash
- 根据AT24C02的手册读写AT24C02
- Linux数据备份手册
- MAX1480B中文数据手册
- iEthernet W5200数据手册
- bash数据手册
- Hi3516D 数据手册
- CC1110数据手册截图
- 大数据部署手册
- 1103272-1数据手册
- UISlider样式修改
- 笨小熊
- python 列表小总结
- thinking in java 笔记 思维导图 第三章操作符
- shell中$0,$?,$!等的特殊用法
- 读nandflash---根据数据手册K9GAG08U0D
- DirectUI通用动画框架
- thinking in java 笔记 思维导图 第四章 控制执行流程
- RHEL 7 & CentOS 7禁用IPV6
- Chrome的多线程模型
- 实习记——(六)关于数据分页
- 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现
- thinking in java 笔记 思维导图 第五章初始化与清理
- sql injection – sqlmap