新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > s3c2440對K9F2G08UOB Nand Flash的簡單操作函數

        s3c2440對K9F2G08UOB Nand Flash的簡單操作函數

        作者: 時間:2016-11-10 來源:網絡 收藏
        功能:先擦除一塊nand flash地址,然后往里面寫一字符串,最后再讀出來

        實現,擦除、寫、讀功能。 芯片型號:K9F2G08UOB

        /****************************************************
        擦除nand flash 0x500000 地址
        主函數:erase.c
        ****************************************************/
        #define NFCONF *(volatile unsigned long *)0x4E000000
        #define NFCONT *(volatile unsigned long *)0x4E000004
        #define NFCMMD *(volatile unsigned long *)0x4E000008
        #define NFADDR *(volatile unsigned long *)0x4E00000C
        #define NFDATA *(volatile unsigned char *)0x4E000010
        #define NFSTAT *(volatile unsigned long *)0x4E000020

        void (*printf)(char *, ...) = 0x33f9291C;
        void erase_nand(unsigned long addr);

        void _start(void)
        {
        //configure for nand flash controller
        NFCONF = (0x2 << 12) | (0x7 << 8) | (0x1 << 4);

        //control
        //NAND flash 開始工作
        NFCONT = 1;

        //設置擦除地址
        erase_nand(0x500000);

        }

        //------發送地址參照K9F2G08UOA數據手冊第9頁--------
        void send_addr(unsigned long addr)
        {
        NFADDR = (addr >> 11) & 0xff;
        NFADDR = (addr >> 19) & 0xff;
        NFADDR = (addr >> 27) & 0x1;
        }

        /*****************************************
        塊擦除
        對照K9F2G08UOA手冊第28頁
        ******************************************/
        void erase_nand(unsigned long addr)
        {
        unsigned int stat;

        //發送指令60h塊擦除設置指令
        NFCMMD = 0x60;

        //發送三次行地址
        send_addr(addr);

        //nandflash ready
        //發送d0擦除指令
        NFCMMD = 0xd0;

        //等待忙狀態
        while(!(NFSTAT & 0x1))
        ;


        // 發送70h讀狀態指令
        NFCMMD = 0x70;

        //讀取數據
        stat = NFDATA;

        //最后一位判斷成功與否
        if(stat & 0x1){
        printf("erase nand flash device errn");
        return ;
        }

        printf("erase nand flash device successn");
        }

        /****************************************************
        寫nand flash 0x500000 地址 一個字符串
        主函數:write.c
        ****************************************************/
        #define NFCONF *(volatile unsigned long *)0x4E000000
        #define NFCONT *(volatile unsigned long *)0x4E000004
        #define NFCMMD *(volatile unsigned long *)0x4E000008
        #define NFADDR *(volatile unsigned long *)0x4E00000C
        #define NFDATA *(volatile unsigned char *)0x4E000010
        #define NFSTAT *(volatile unsigned long *)0x4E000020


        void (*printf)(char *, ...) = 0x33f9291C;
        void write_nand(char *buf, unsigned long addr, int size);
        char buf[11];

        void _start(void)
        {
        int i;

        //configure for nand flash controller
        NFCONF = (0x2 << 12) | (0x7 << 8) | (0x1 << 4);

        //control
        NFCONT = 1;

        //準備一個全寫a的數組
        for(i = 0; i < 11; i++)
        {
        buf= a;
        }

        //往0x500000寫字符串buf 11個字節
        write_nand(buf, 0x500000, 11);

        }

        //------發送地址參照K9F2G08UOA數據手冊第9頁--------
        void send_addr(unsigned long addr)
        {
        NFADDR = addr & 0xff;
        NFADDR = (addr >> 8) & 0x7;
        NFADDR = (addr >> 11) & 0xff;
        NFADDR = (addr >> 19) & 0xff;
        NFADDR = (addr >> 27) & 0x1;
        }

        /*****************************************
        寫數據
        對照K9F2G08UOA手冊第25頁
        ******************************************/
        void write_nand(char *buf, unsigned long addr, int size)
        {
        int i;
        unsigned int stat;

        //發80h串口數據輸入指令
        NFCMMD = 0x80;

        //發送兩次列地址,三次行地址
        send_addr(addr);

        //nandflash 數據準備
        for(i = 0; i < (size); i++)
        {
        NFDATA = buf;
        }

        //發送10h寫指令
        NFCMMD = 0x10;

        //等待忙狀態
        while(!(NFSTAT & 0x1))
        ;

        // 發送70h讀狀態指令
        NFCMMD = 0x70;
        stat = NFDATA;

        //最后一位判斷成功與否
        if(stat & 0x1){
        printf("write nand flash device errn");
        return ;
        }
        printf("write nand flash device successn");
        }

        /****************************************************
        讀nand flash 0x500000 地址 10個字節
        主函數:read.c
        ****************************************************/

        #define NFCONF *(volatile unsigned long *)0x4E000000
        #define NFCONT *(volatile unsigned long *)0x4E000004
        #define NFCMMD *(volatile unsigned long *)0x4E000008
        #define NFADDR *(volatile unsigned long *)0x4E00000C
        #define NFDATA *(volatile unsigned char *)0x4E000010
        #define NFSTAT *(volatile unsigned long *)0x4E000020


        void (*printf)(char *, ...) = 0x33f9291C;
        void read_nand(char *buf, unsigned long addr, int size);

        void _start(void)
        {
        char buf[11];


        //configure for nand flash controller
        NFCONF = (0x2 << 12) | (0x7 << 8) | (0x1 << 4);

        //control
        NFCONT = 1;

        //往0x500000讀數據
        read_nand(buf, 0x500000, 10);
        buf[11] = 0;

        printf("read from nandflash: %sn", buf);
        }

        //------發送地址參照K9F2G08UOA數據手冊第9頁--------
        void send_addr(unsigned long addr)
        {
        NFADDR = addr & 0xff;
        NFADDR = (addr >> 8) & 0x7;
        NFADDR = (addr >> 11) & 0xff;
        NFADDR = (addr >> 19) & 0xff;
        NFADDR = (addr >> 27) & 0x1;
        }

        /*****************************************
        讀數據
        對照K9F2G08UOA手冊第23頁
        ******************************************/
        void read_nand(char *buf, unsigned long addr, int size)
        {
        int i;

        NFCMMD = 0x00;

        send_addr(addr);

        NFCMMD = 0x30;

        while(!(NFSTAT & 0x1 ))
        ;

        //nandflash ready
        for(i = 0; i < (size); i++)
        {
        buf= NFDATA;
        }

        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 安达市| 绵阳市| 科技| 吉安县| 徐州市| 宁蒗| 蒙山县| 吉木萨尔县| 任丘市| 礼泉县| 阿拉善盟| 万年县| 洞口县| 田林县| 清新县| 衡南县| 泌阳县| 汕头市| 崇阳县| 五华县| 绥芬河市| 运城市| 东城区| 南投县| 澄江县| 扶余县| 华亭县| 分宜县| 吉隆县| 博爱县| 思茅市| 苏尼特左旗| 集安市| 南城县| 南郑县| 曲周县| 霍林郭勒市| 靖西县| 平南县| 马尔康县| 宕昌县|