程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> S5PV210學習筆記——Nand配置

S5PV210學習筆記——Nand配置

編輯:C++入門知識

S5PV210的Nand flash跟2440和6410的Nand flash配置差不多,不同的是S5PV210的功能更加強大,尤其是S5PV210的硬件ECC(本文不涉及S5PV210中Nand ECC配置)。整體上來講,S5PV210的Nand flash配置還是非常簡單的。 其實,配置一個模塊往往需要以下幾個步驟: (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的初始化函數就出來了: [cpp]   void nand_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_reset,通常是Nand flash配置完成之後就進行一次reset,這樣使Nand flash恢復到最初狀態。 這樣,Nand flash初始化好了,但是要訪問Nand flash還需要按照時序對其操作,Nand方式啟動時只需要實現Nand flash的讀操作,為此,這裡只列舉一下幾個讀相關的操作: (1)Nand flash reset [cpp]   static void nand_reset(){       nand_select_chip();       nand_cmd(0xff);       nand_wait();       nand_deselect_chip();   }   (2)Nand flash寫地址 [cpp]   static void nand_addr(unsigned long page_addr, unsigned long page_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;   }   (3)Nand flash讀ID [cpp]  void nand_read_id(char id[]){       int i;          nand_select_chip();       nand_cmd(0x90);          NFADDR = 0;          for (i = 0; i < 5; i++)           id[i] = nand_read();          nand_deselect_chip();   }   (4)Nand flash讀頁數據 [cpp]   void nand_read_page(unsigned char* buf, unsigned long page_addr){       int i;       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的芯片手冊,原理都是相通的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved