2440裸机学习心得(下)
据写入到norflash的地址中。
复位函数: reset_en29lv160ab(void)
是向任一地址写入复位命令0xF0
擦除函数: en29lv160ab_sector_erase(U32 section_addr)
第一个周期是把命令0xAA写入地址为0x555的命令寄存器中,
第二个周期是把命令0x55写入地址为0x2AA命令寄存器中,
第三个周期是把命令0x80再写入地址为0x555命令寄存器中,
第四个周期是把命令0xAA写入地址为0x555的命令寄存器中,
第五个周期是把命令0x55再写入地址为0x2AA命令寄存器中,
第六个周期是把命令0x30写入要擦除块的首地址内
验证函数: check_toggle()
连续两次读取数据总线上的数据,判断数据总线上的第6位数值(DQ6)是否翻转,如果没有翻转则正确,否则还要判断第5位(DQ5),以确定是否是因为超时而引起的翻转。
读ID函数:get_en29lv160ab_id()
第一个周期是把命令0xAA写入地址为0x555的命令寄存器中,
第二个周期是把命令0x55写入地址为0x2AA命令寄存器中,
第三个周期是把命令0x90再写入地址为0x555命令寄存器中,
第四个周期为读取地址为0x100中的内容,即厂商ID(0x1C)。
读取设备ID的过程的前三个周期与读取厂商ID相同,第四个周期是读取地址为0x01中的内容,即设备ID(0x2249)
问题1:
原来真的是写得块地址问题,写到前面的0x400就行,写后一点如0xf0000就读不出来了,0x0000 0000–0x0800 0000为NorFlash,为什么后面的不行呢?
问题2:
本来擦除后写完能读出写的内容,但再复位后不写,只读回上次地址,发现读出不同的数据
而且好像擦除后就算返回return 1也没用,擦后读回那地址,也不是全部数据为0的,也是有值的
13、NANDFLASH操作
nandflash为K9F2G08U0A,它是8位的nandflash
一个劣势是很容易产生坏块,因此在使用nandflash时,往往要利用校验算法发现坏块并标注出来
K9F2G08U0A的一页为(2K+64)字节(加号前面的2K表示的是main区容量,加号后面的64表示的是spare区容量),它的一块为64页,而整个设备包括了2048个块
内存容量大小计算:
要实现用8个IO口来要访问这么大的容量,K9F2G08U0A规定了用5个周期来实现。
列地址是用于寻址页内空间,行地址用于寻址页,如果要直接访问块,则需要从地址A18开始。
CMD_STATUS读状态命令可以实现读取设备内的状态寄存器,通过该命令可以获知写操作或擦除操作是否完成(判断第6位),以及是否成功完成(判断第0位)。
自己编写NANDFLASH的步骤:(进行块擦除,页写,页读)
1、在头文件中列出相关的固量 和 函数 宏
常用的各种命令集;一些基于NANDFLASH控制器的基本函数
ECC应用和使能nandflash片选;NFSTAT寄存器
一些返回判断值的宏定义
2、写出几个基本的初始化函数:
管脚,寄存器初始化函数 ; 复位函数 ; 读NANDID号函数
3、相关的检测判断函数:
A、检测是否写擦除成功函数NF_toggle:通过NF_CMD(CMD_STATUS)状态位
B、测试是否坏块函数NF_testBadBlock:读取2054处坏块标志位
C、写坏块标志函数NF_MarkBadBlock:写标志到 2054处
4、读、写、擦除函数:
具体自己看代码了,有两点要注意了:
A、读操作 检测正确性是通过ECC检验码,而写和擦除是通过toggle函数
B、随机读写是 在读页,写页的基础上 加上列的部分
注意区别两个东西:
1、ECC检验码的判断
读操作来说,我们还要继续读取spare区的相应地址内容,已得到上次写操作时所存储的main区和spare区的ECC,并把这些数据分别放入NFMECCD0/1和NFSECCD的相应位置中。最后我们就可以通过读取NFESTAT0/1(因为K9F2G08U0A是8位IO口,因此这里只用到了NFESTAT0)中的低4位来判断读取的数据是否正确,其中第0位和第1位为main区指示错误,第2位和第3位为spare区指示错误。
2、坏块的判断
对于写页和擦除操作来说,通过toggle函数检测:
NF_CMD(CMD_STATUS); //读状态命令
//判断状态值的第6位是否为1,即是否在忙
//判断状态值的第0位是否为0,为0则写操作正确,否则错误
若第0位操作错误,则该块为 坏块
3、main区和spare区的解锁只为了产生ECC码,一旦产生后,就要锁上,打开另外区的,不要影响互相顺序的ECC码产生
扩展:从NANDFLASH启动程序
当检测到是由nandflash启动时,系统会自动把nandflash中的前4k字节的数据加载到Steppingstone中,然后把该Steppingstone映射为Bank0,因此系统会从Steppingstone开始运行程序,从而实现了s3c2440的nandflash自启动的功能
通过在Steppingstone中,把程序的其余部分复制到RAM中,程序运行时由Steppingstone转移到该RAM中,SRAM起始地址0x30000000
RdNF2SDRAM是C语言编写的一段把nandflash中
2440v裸机学 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)