在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > S3C2440對Nand Flash操作和電路原理(基于K9F2G08U0A)

            S3C2440對Nand Flash操作和電路原理(基于K9F2G08U0A)

            作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏

            該段程序先判斷該頁所在的壞是否為壞塊,如果是則退出。在最后寫操作失敗后,還要標(biāo)注該頁所在的塊為壞塊,其中所用到的函數(shù)rNF_IsBadBlock和rNF_MarkBadBlock,我們在后面介紹。我們再總結(jié)一下該程序所返回?cái)?shù)值的含義,0x42:表示該頁所在的塊為壞塊;0x43:表示寫操作失敗,并且在標(biāo)注該頁所在的塊為壞塊時(shí)也失敗;0x44:表示寫操作失敗,但是標(biāo)注壞塊成功;0x66:寫操作成功。

            擦除是以塊為單位進(jìn)行的,因此在寫地址周期是,只需寫三個(gè)行周期,并且要從A18開始寫起。與寫操作一樣,在擦除結(jié)束前還要判斷是否擦除操作成功,另外同樣也存在需要判斷是否為壞塊以及要標(biāo)注壞塊的問題。下面就給出一段具體的塊擦除操作程序:

            U8 rNF_EraseBlock(U32 block_number)

            {

            char stat, temp;

            temp = rNF_IsBadBlock(block_number); //判斷該塊是否為壞塊

            if(temp == 0x33)

            return 0x42; //是壞塊,返回

            NF_nFCE_L(); //打開片選

            NF_CLEAR_RB(); //清RnB信號

            NF_CMD(CMD_ERASE1); //擦除命令周期1

            //寫入3個(gè)地址周期,從A18開始寫起

            NF_ADDR((block_number << 6) & 0xff); //行地址A18~A19

            NF_ADDR((block_number >> 2) & 0xff); //行地址A20~A27

            NF_ADDR((block_number >> 10) & 0xff); //行地址A28

            NF_CMD(CMD_ERASE2); //擦除命令周期2

            delay(1000); //延時(shí)一段時(shí)間

            NF_CMD(CMD_STATUS); //讀狀態(tài)命令

            //判斷狀態(tài)值的第6位是否為1,即是否在忙,該語句的作用與NF_DETECT_RB();相同

            do{

            stat = NF_RDDATA8();

            }while(!(stat&0x40));

            NF_nFCE_H(); //關(guān)閉Nand Flash片選

            //判斷狀態(tài)值的第0位是否為0,為0則擦除操作正確,否則錯(cuò)誤

            if (stat & 0x1)

            {

            temp = rNF_MarkBadBlock(page_number>>6);//標(biāo)注該塊為壞塊

            if (temp == 0x21)

            return 0x43 //標(biāo)注壞塊失敗

            else

            return 0x44; //擦除操作失敗

            }

            else

            return 0x66; //擦除操作成功

            }

            該程序的輸入?yún)?shù)為K9F2G08U0A的第幾塊,例如我們要擦除第2001塊,則調(diào)用該函數(shù)為:rNF_EraseBlock(2001)。

            K9F2G08U0A除了提供了頁讀和頁寫功能外,還提供了頁內(nèi)地址隨意讀、寫功能。頁讀和頁寫是從頁的首地址開始讀、寫,而隨意讀、寫實(shí)現(xiàn)了在一頁范圍內(nèi)任意地址的讀、寫。隨意讀操作是在頁讀操作后輸入隨意讀命令和頁內(nèi)列地址,這樣就可以讀取到列地址所指定地址的數(shù)據(jù)。隨意寫操作是在頁寫操作的第二個(gè)頁寫命令周期前,輸入隨意寫命令和頁內(nèi)列地址,以及要寫入的數(shù)據(jù),這樣就可以把數(shù)據(jù)寫入到列地址所指定的地址內(nèi)。下面兩段程序?qū)崿F(xiàn)了隨意讀和隨意寫功能,其中隨意讀程序的輸入?yún)?shù)分別為頁地址和頁內(nèi)地址,輸出參數(shù)為所讀取到的數(shù)據(jù),隨意寫程序的輸入?yún)?shù)分別為頁地址,頁內(nèi)地址,以及要寫入的數(shù)據(jù)。

            U8 rNF_RamdomRead(U32 page_number, U32 add)

            {

            NF_nFCE_L(); //打開Nand Flash片選

            NF_CLEAR_RB(); //清RnB信號

            NF_CMD(CMD_READ1); //頁讀命令周期1

            //寫入5個(gè)地址周期

            NF_ADDR(0x00); //列地址A0~A7

            NF_ADDR(0x00); //列地址A8~A11

            NF_ADDR((page_number) & 0xff); //行地址A12~A19

            NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27

            NF_ADDR((page_number >> 16) & 0xff); //行地址A28

            NF_CMD(CMD_READ2); //頁讀命令周期2

            NF_DETECT_RB(); //等待RnB信號變高,即不忙

            NF_CMD(CMD_RANDOMREAD1); //隨意讀命令周期1

            //頁內(nèi)地址

            NF_ADDR((char)(add&0xff)); //列地址A0~A7

            NF_ADDR((char)((add>>8)&0x0f)); //列地址A8~A11

            NF_CMD(CMD_RANDOMREAD2); //隨意讀命令周期2

            return NF_RDDATA8(); //讀取數(shù)據(jù)

            }

            U8 rNF_RamdomWrite(U32 page_number, U32 add, U8 dat)

            {

            U8 temp,stat;

            NF_nFCE_L(); //打開Nand Flash片選

            NF_CLEAR_RB(); //清RnB信號

            NF_CMD(CMD_WRITE1); //頁寫命令周期1

            //寫入5個(gè)地址周期

            NF_ADDR(0x00); //列地址A0~A7

            NF_ADDR(0x00); //列地址A8~A11

            NF_ADDR((page_number) & 0xff); //行地址A12~A19

            NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27

            NF_ADDR((page_number >> 16) & 0xff); //行地址A28

            NF_CMD(CMD_RANDOMWRITE); //隨意寫命令

            //頁內(nèi)地址

            NF_ADDR((char)(add&0xff)); //列地址A0~A7

            NF_ADDR((char)((add>>8)&0x0f)); //列地址A8~A11

            NF_WRDATA8(dat); //寫入數(shù)據(jù)

            NF_CMD(CMD_WRITE2); //頁寫命令周期2

            delay(1000); //延時(shí)一段時(shí)間

            NF_CMD(CMD_STATUS); //讀狀態(tài)命令

            //判斷狀態(tài)值的第6位是否為1,即是否在忙,該語句的作用與NF_DETECT_RB();相同

            do{

            stat = NF_RDDATA8();

            }while(!(stat&0x40));

            NF_nFCE_H(); //關(guān)閉Nand Flash片選

            //判斷狀態(tài)值的第0位是否為0,為0則寫操作正確,否則錯(cuò)誤

            if (stat & 0x1)

            return 0x44; //失敗

            else

            return 0x66; //成功

            }

            下面介紹上文中提到的判斷壞塊以及標(biāo)注壞塊的那兩個(gè)程序:rNF_IsBadBlock和rNF_MarkBadBlock。在這里,我們定義在spare區(qū)的第6個(gè)地址(即每頁的第2054地址)用來標(biāo)注壞塊,0x44表示該塊為壞塊。要判斷壞塊時(shí),利用隨意讀命令來讀取2054地址的內(nèi)容是否為0x44,要標(biāo)注壞塊時(shí),利用隨意寫命令來向2054地址寫0x33。下面就給出這兩個(gè)程序,它們的輸入?yún)?shù)都為塊地址,也就是即使僅僅一頁出現(xiàn)問題,我們也標(biāo)注整個(gè)塊為壞塊。

            U8 rNF_IsBadBlock(U32 block)

            {

            return rNF_RamdomRead(block*64, 2054);

            }

            U8 rNF_MarkBadBlock(U32 block)

            {

            U8 result;

            result = rNF_RamdomWrite(block*64, 2054, 0x33);

            if(result == 0x44)

            return 0x21; //寫壞塊標(biāo)注失敗

            else

            return 0x60; //寫壞塊標(biāo)注成功

            }

            關(guān)于Nand Flash的基本操作就介紹到這吧


            上一頁 1 2 3 下一頁

            關(guān)鍵詞: S3C2440NandFlashK9F2G08U0

            評論


            技術(shù)專區(qū)

            關(guān)閉