nand flash按照我的理解,在開(kāi)發(fā)板上就類(lèi)似我們所用的電腦中的硬盤(pán),用來(lái)保存系統(tǒng)運(yùn)行的操作系統(tǒng),應(yīng)用程序,數(shù)據(jù)等,掉電之后還可以永久得保存數(shù)據(jù)(不包括臨時(shí)數(shù)據(jù))。通過(guò)控制或配置NAND Flash的控制器寄存器,即可完成對(duì)nand的操作:包括讀、寫(xiě)、擦除等。
而控制、配置這些寄存器是根據(jù)板子的原理圖、用戶(hù)手冊(cè)以及nand flash芯片手冊(cè)上的說(shuō)明來(lái)配置的。
通過(guò)原理圖,可見(jiàn)nand flash與cpu之間的數(shù)據(jù)傳輸主要是通過(guò)LDDATA0~7這8根引腳線,其中傳輸?shù)摹皵?shù)據(jù)”可以是地址、數(shù)據(jù),也可以是命令,這就要靠CLE、ALE引腳的狀態(tài)進(jìn)行選擇。
對(duì)于命令的傳輸,主要是對(duì)NFCMD寄存器寫(xiě)以上相對(duì)應(yīng)的命令值,但這個(gè)命令是分兩個(gè)周期進(jìn)行的。
而對(duì)于數(shù)據(jù)的傳輸,在數(shù)據(jù)傳輸模式下,傳輸數(shù)據(jù)也是要根據(jù)以上的格式去進(jìn)行傳輸,分5個(gè)周期,每一個(gè)周期傳輸?shù)臄?shù)據(jù)都十分講究,這就要求要有一個(gè)符合這種格式的巧妙算法(在接下來(lái)的代碼中體現(xiàn))。
了解了這些命令、數(shù)據(jù)的傳輸格式之后,就是要對(duì)具體的寄存器進(jìn)行相應(yīng)的配置了。首先要介紹這些寄存器的作用(數(shù)據(jù)手冊(cè)上對(duì)各寄存器都有說(shuō)明):
(1)NFCONF:用來(lái)設(shè)置時(shí)序參數(shù),設(shè)置位寬。
(2)NFCMD:命令寄存器。
(3)NFADDR:地址寄存器。
(4)NFDATA:數(shù)據(jù)寄存器,用于讀寫(xiě)數(shù)據(jù)。
(5)NFSTAT:狀態(tài)寄存器,只用到最低1位,表示是否忙碌。
編程舉例:
實(shí)現(xiàn)從nand flash中拷貝程序到sdram中運(yùn)行,其中涉及到啟動(dòng)代碼的編程,初始化內(nèi)存控制器,讀取并拷貝nand flash上的數(shù)據(jù)。(只展示部分核心代碼)
head.S
.text .global _start _start: ldr sp,=4096 @設(shè)置堆棧 bl disable_watch_dog @關(guān)閉看門(mén)狗 bl set_mem @設(shè)置內(nèi)存控制器 bl nand_init @nand初始化 ldr r0,=0x30000000 ldr r1,=4096 ldr r2,=4096 @傳遞參數(shù) bl nand_read @從nand中拷貝 ldr sp,=0x38000000 ldr lr, =halt @設(shè)置返回地址 ldr pc, =main halt: b halt
nand.c
typedef struct s3c2440_nand { unsigned int NFCONF; unsigned int NFCONT; unsigned int NFCMMD; unsigned int NFADDR; unsigned int NFDATA; unsigned int NFMECCD0; unsigned int NFMECCD1; unsigned int NFSECCD; unsigned int NFSTAT; unsigned int NFESTAT0; unsigned int NFESTAT1; unsigned int NFMECC0; unsigned int NFMECC1; unsigned int NFSECC; unsigned int NFSBLK; unsigned int NFEBLK; }s3c2440_nand; //定義nandflash控制器的起始地址 static s3c2440_nand* nand_base = (s3c2440_nand*)0x4E000000; //片選 void select_chip_or_not(int flag)//0不片選,1片選 { if(flag == 1) { nand_base->NFCONT |= (0x1<<1); } if(flag == 0) { nand_base->NFCONT &= ~(0x1<<1); } } void write_command(unsigned char cmd) { volatile unsigned char *p = (volatile unsigned char *)&nand_base->NFCMMD; *p = cmd; } void write_addr(unsigned int addr) { int i; volatile unsigned char* p = (volatile unsigned char *)nand_base->NFADDR; *p = addr & 0xff; for(i=0; i<10; i++); *p = (addr >> 9) & 0xff; for(i=0; i<10; i++); *p = (addr >> 17) & 0xff; for(i=0; i<10; i++); *p = (addr >> 25) & 0xff; for(i=0; i<10; i++); } //等待nand flash就緒 void wait_ldle(void) { volatile unsigned char* p = (volatile unsigned char*)nand_base->NFSTAT; int flag = *p & 1; while(!flag) { int i; for(i=0;i<20;i++); } } unsigned char read_data(void) { volatile unsigned char *p= (volatile unsigned char*)nand_base->NFDATA; return *p; } void nand_read(unsigned char* buf,unsigned char base_addr,unsigned int size) { int i,j; //片選 select_chip_or_not(1); //復(fù)制數(shù)據(jù) for(i=base_addr;i<base_addr+size;) { write_command(0);//發(fā)送讀命令 write_addr(i); //發(fā)送地址 write_command(0x30); wait_ldle(); for(j=0;j<512;j++,i++) { *buf = read_data(); //讀取數(shù)據(jù),一次讀取一頁(yè)(512個(gè)字節(jié)) buf++; } } select_chip_or_not(0);//取消片選 } void nand_reset(void) { select_chip_or_not(1);//片選 write_command(0xff); wait_ldle(); select_chip_or_not(0); } void nand_init(void) { nand_base->NFCONF = (0<<12)|(3<<8)|(0<<4); nand_base->NFCONT = (1<<4)|(1<<1)|(1<<0); nand_reset(); }
還要說(shuō)下Makefile
objs := head.o init.o nand.o main.o nand.bin : $(objs) arm-linux-ld -Tnand.lds $^ -o nand_elf arm-linux-objcopy -O binary -S nand_elf $@ %.o : %.S arm-linux-gcc -c $< -o $@ %.o : %.c arm-linux-gcc -c $< -o $@ clean : rm -f nand.bin *.o nand_elf
平時(shí)寫(xiě)的Makefile不一樣,這里使用了一個(gè)名為nand.lds的鏈接腳本,這樣做主要是為了試驗(yàn)讓編譯好的程序在鏈接時(shí)存放的地址和理論運(yùn)行地址都不同且不在同一個(gè)存儲(chǔ)設(shè)備上,方便看試驗(yàn)效果。
nand.lds
SECTIONS { first 0x00000000 : {head.o init.o nand.o} second 0x30000000 : AT(4096) {main.o} }
鏈接腳本上的第一段是放head.S init.c nand.c編譯出的內(nèi)容,從0地址開(kāi)始存放和執(zhí)行,而main.o則是需要從nand flash手動(dòng)復(fù)制到sdram中去執(zhí)行。
實(shí)現(xiàn)的效果如圖:
創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。
網(wǎng)頁(yè)題目:NANDFlash裸板編程-創(chuàng)新互聯(lián)
當(dāng)前URL:http://www.rwnh.cn/article36/doposg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、定制網(wǎng)站、服務(wù)器托管、企業(yè)網(wǎng)站制作、網(wǎng)站策劃、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
全網(wǎng)營(yíng)銷(xiāo)推廣知識(shí)