S5PV210(TQ210)学习笔记——Nand配置
其实,配置一个模块往往需要以下几个步骤:
(1)根据原理图,理清模块的接线方式,对于Nand flash来说,就是看看Nand flash接到了哪些GPIO上,然后把对应的GPIO配置为Nand功能即可。
(2)阅读S5PV210手册,掌握相关模块控制器的功能、操作方式及寄存器配置。
(3)阅读模块芯片手册,掌握模块的访问控制时序。
我们按照以上步骤进行配置,首先是模块GPIO的配置,我的开发板是TQ210,Nand flash芯片是K9K8G08U0B,接线方式如下图:
其中:
(1)Xm0FRnB0~Xm0FRnB3,Xm0FCLE,Xm0FALE,Xm0FWEn,Xm0FREn这八根脚连接到了MP0_3上,查看MP0_3控制寄存器可知,需将MP0_3CON配置为0x22222222;
(2)Xm0CSn2~Xm0CSn5四根脚连接到了MP0_1的2~5脚上,故MP0_1CON的8~23位应该配置为0x3333;
(3)Xm0DATA0~Xm0DATA7这八根脚连接到了MP0_6上,故MP0_6应该配置为0x22222222;
这样,GPIO配置好了,接下来我们配置下Nand flash的控制寄存器,大体浏览下Nand flash的寄存器功能后我们可以发现,如果不使用ECC功能可以只配置NFCONF和NFCONT两个寄存器,我们的Nand flash是SLC型Nand,Page大小为2048,写入地址需要5个周期(这些从Nand flash芯片手册上很容易找到),故NFCONF应该配置如下:
NFCONF=(3<23)|(1<12)|(2<8)|(0<4)|(1<1); //依次为:禁止ECC,TACLS,TWPRH0,TWPRH1,SLC、2K、5周期。
其中TACLS、TWPRH0和TWPRH1需要阅读手册来确定,韦东山老师讲述了确定方式,但是,我配置时完全按照手册上的最小时间设置时没有能够正常访问,我是自己尝试出来的,先将三个参数都设置为7,然后慢慢减小,最后测试出来设置为1、2、0,但是这样不一定是最稳定的,一般来讲,数值略大一些会更稳定,但是为了不影响访问效率,这个值也不能设太大,先按照最小情况设置,当发现有读取错误或其他不稳定现象时再适当提高参数值。
然后就是NFCONT寄存器,NFCONT的配置就更简单了,我们不设置ECC,只需要设置0位和1位就可以了:
NFCONT = (1<1)|(1<0);//禁止片选,使能Nand
这样,Nand flash的初始化函数就出来了:
- voidnand_init(){
- NFCONF=(3<23)|(1<12)|(2<8)|(0<4)|(1<1);
- NFCONT=(1<0)|(1<1);
- MP0_1CON&=~(0xffff<8);
- MP0_1CON|=0x3333<8;
- MP0_3CON=0x22222222;
- MP0_6CON=0x22222222;
- nand_reset();
- }
这样,Nand flash初始化好了,但是要访问Nand flash还需要按照时序对其操作,Nand方式启动时只需要实现Nand flash的读操作,为此,这里只列举一下几个读相关的操作:
(1)Nand flash reset
- staticvoidnand_reset(){
- nand_select_chip();
- nand_cmd(0xff);
- nand_wait();
- nand_deselect_chip();
- }
- staticvoidnand_addr(unsignedlongpage_addr,unsignedlongpage_offset){
- NFADDR=(page_offset>>0)&0xFF;
- NFADDR=(page_offset>>8)&0x7;
- NFADDR=(page_addr)&0xFF;
- NFADDR=(page_addr>>8)&0xFF;
- NFADDR=(page_addr>>16)&0x07;
- }
- voidnand_read_id(charid[]){
- inti;
- nand_select_chip();
- nand_cmd(0x90);
- NFADDR=0;
- for(i=0;i<5;i++)
- id[i]=nand_read();
- nand_deselect_chip();
- }
- voidnand_read_page(unsignedchar*buf,unsignedlongpage_addr){
- inti;
- nand_select_chip();
- nand_cmd(0);
- nand_addr(page_addr,0);
- nand_cmd(0x30);
- nand_wait();
- for(i=0;i!=PAGE_SIZE;++i){
- *buf++=nand_read();
- }
- nand_deselect_chip();
- }
上面是几个比较重要的Nand flash读相关的操作函数,到这里,您自己补充一下引用到的小函数就可以正常的进行Nand flash操作了,我把我写的代码上传到我的CSDN资源里,如果需要的话可以拿去参考。另外,如果需要编写Nand flash写操作的代码可以参考一下本人博客中6410的Nand flash配置部分和Nand flash的芯片手册,原理都是相通的。
S5PV210Nand配 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)