概述
说明:以下所有结论均经过在JZ2440(S3C2440A芯片)开发板验证,并一致通过。
**1、Nandflash是如何被控制工作的?**它是由2440的Nandflash控制器控制的;
它的内部寄存器组合是如何协调工作的?
答:根据Nandflash具体操作(读内存/编程内存/擦除)的时序图,辅助以指令集。
2.当开发板从Norflash启动时,可以读取Nandflash?反之?
答:当开发板从Norflash启动时,可以实现对Nandflash存储器的全部操作,包括读ID,读内存,擦除和写入均成功!!!!
但当开发板从Nandflash启动时,可以实现对Norflash存储器的全部操作,包括读ID,读内存,擦除和写入,但是擦除和写入操作均无效!!!!但如若把基地址从0x0改为0xxxxx(即Norflash地址)会如何?有机会了验证一下。
3、Norflash和Nandflash核心操作方法的区别:
答:1)Norflash是以指令集合表为参照,而Nandflash是以具体操作时序图为主,辅以指令集合表。
2)Nandflash需要设置的时间参数只有三个:
#define TACLS 0
#define TWRPH0 1
#define TWRPH1 0
/* Nandflash初始化 */
void nand_init(void)
{
NFCONF = ((TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4));
NFCONT = ((1<<4) | (1<<1) | (1<<0));
}
4、头文件的具体外部要声明的函数,是全部声明,还是只需要声明外部程序要调用的函数?
答:未解决
5、程序在中断课程烧写到Nandflash没有问题,刚进入Norflash课程,再烧写到Nandflash就会不停地打印乱码,打印如下:
(补充:Nandflash控制器已经设置完毕)
600000db Undefined instruction exception! 600000d3swi exception!
00000123 200000db Undefined instruction exception! 000000d3swi exception!
00676e69000000db Undefined instruction exception! 00000050swi exception!
000000b060000050 Undefined instruction exception!
在Norflash课程之前程序都小于4K,可以直接在SRAM运行; 超过4K的程序就会崩溃,为什么?
答:代码超过4K,超过部分不能在SRAM运行,如要执行,需要重定位到SRAM;
但当恰好重定位代码的程序在4K之外时,程序就不能重定位,执行之外的程序时就会崩溃…
6、Norflash与Nandflash的读/写操作对比
1)nor
读出/写入以字节为单位,擦除以扇区(block/sector)为单位;但由于Norflash位宽16bit,一般把数据构造成16bit然后再写进Norflash中。
写入之前
可以从任意地址开始读出任意字节长度的数据并打印;
可以从任意地址开始写入任意字节长度的数据并打印;
从任意地址执行擦除操作都会自动完成对该地址所在的扇区的擦除;
不擦除直接写,虽然可以改写存储空间,但写入的都是乱码;
读内存:Norflash只需要CPU发出读命令和地址,等待Nor准备好数据,直接读需要的地址上的数据即可(刚上电或者重启Nor处于read存储单元状态);
问:片选的操作?是内存控制器自动帮助Nor的片选置位? 答:未知;
几何结构:chip–sector(区块)–block(扇区);
数据位宽:16bit; 容量:2M
读操作:读nor内存是随便读,一个地址读1字/字节;单位:字节/字(可以16bit)
擦除操作:单位:1block,8K/16K/32K/64K;
写操作:单位:字节/字(可以16bit)
写/擦除操作之后需:wait_ready( ) ;
Norflash不需要初始化;
2)nand
读出/写入以字节为单位, 擦除以块(block)为单位;
可以从任意地址开始读出任意字节长度的数据并打印;
可以从任意地址开始写入任意字节长度的数据并打印;
不擦除直接写,虽然可以改写存储空间,但写入的都是乱码;
//从任意地址执行擦除操作都会自动完成对该地址所在的扇区的擦除;–未经验证;
读内存步骤:
读操作时选中片选,发出5个地址(2纵3行),等就绪然后读出,读结束时关闭片选;需要手动完成对片选CE的操作;
写操作同理,选中片选,发出5个地址(2纵3行),等就绪然后开始写,写结束时关闭片选;需要手动完成对片选CE的操作;
几何结构:chip–block(块)–page(页)
数据位宽:8bit; 容量:256M
读操作:读nand内存前后各需一条命令,发出一个地址(2列3行共5次)后,反复读寄存器NFDATA可得本页内该地址及之后的连续flash空间的内容;单位:字节;
写操作:写nand内存前后各需一条命令,发出一个地址(2列3行共5次)后,反复写数据到寄存器NFDATA可即可把数据写入从该地址及之后的连续flash空间中 ;单位:字节;
擦除操作:单位:1block,128K;
写操作:单位:字节;
读/写/擦除操作之后均需:wait_ready( ) ;
Nandflash需要初始化,然后才能使用!
3)SDRAM
问:片选的操作?是内存控制器自动帮助SDRAM的片选置位?
答:未知;可能在寄存器BANKCON6/7中设置了nGCS6,nWE及其他引脚的工作状态。
SDRAM需要进行sdram_init(),之后才能使用,但是使用的时候不需要任何别的预操作,即可从任意地址开始直接读/写任意长度。
7、对Nandflash读内存操作时,对于地址addr:
unsigned int addr; //长度是否足够?
int page = addr/2048; //0~2^11: page;
int col = addr & (2048 - 1); //211~221: col;
但是列地址有2个,行地址有3个; 数据位宽8bit?
答:unsigned int寻址长度4G,足够;
8、对Nand_init.c的功能增加
a) 可以打印所有读到的数据 按照:地址,长度?
b) 实现NAND测试菜单中的 [r] Read nand flash
c) 读OOB检测坏块, 改进nand_read实现碰到坏块就跳过 // lib_nand
答:坏块检测暂时未实现;
9、NOR,NAND,SDRAM的区别
1)flash闪存是非易失存储器, sdram是易失存储器
2)Nor擦除和写都是以block(扇区)为单位,先擦除后写,读写操作是以字节为单位的任意地址任意长度字节;
擦除地址:(必须?)扇区地址,整块擦除,无需擦除长度;
Nand擦除是以block(块)为单位,读写操作是以字节为单位的任意地址任意长度字节;
擦除地址:(必须?)扇区地址,擦除长度为1block长度整数倍,也是整块擦除;
3)Norflash能存程序也能执行程序; Nandflash能存程序但不能执行程序; SDRAM和SRAM都不能存程序,但能执行程序;
4)Norflash无需任何命令可以直接读(可用指针对地址循环加,读连续空间,然后打印);
Nandflash需要发两次命令和地址才能读(读连续空间,不可用指针循环加读,需先读出转存,然后打印);
5)nandflash擦除之后才可以写入,不然无效; 连续写入虽然可以改写,但是打印是乱码!
6)Nandflash擦除之后:I/O 0 =0 Successful Erase;
I/O 0 =1 Error in Erase;
注意:
当擦除Norflash代码区(特别是重定位及其之前的引导程序)时,主函数执行全局变量写操作的flash测试时死机(为什么?),并且复位之后也死机!
当擦除Nandflash代码区(特别是重定位及其之前的引导程序)时,复位之后死机!
具体还有别的现象的产生,可根据擦除破坏的内存地址和该地址所存储的代码具体分析。
10、jz2440_Nandflash芯片手册:读、擦除、写命令序列
最后
以上就是典雅香氛为你收集整理的【S3C2440】第16课、Nandflash之学习笔记的全部内容,希望文章能够帮你解决【S3C2440】第16课、Nandflash之学习笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复