新聞中心

        K9F5608程序

        作者: 時間:2016-11-11 來源:網絡 收藏
        最近使用K9F5608做個項目,用到大容量的存貯器,寫了對K9F的操作程序,但是因為其是NAND FLASH,出廠時會有一定的壞塊,在主程序中,只用到了在擦除塊中檢測狀態,如果狀態不對,則不用此塊,這種辦法,一直感覺不是很好,現在對FLASH的YAFFS文件系統,還沒有看明白,因此如果有機會希望和大家交流,對于數據采集系統的大容量存貯的實現。

        下面是我寫的一些程序。

        本文引用地址:http://www.104case.com/article/201611/316608.htm

        注意一個問題:如果用51單片機的話,在做硬件時,不要把K9F的CE片選腳用51的片外尋址來統一尋址,這樣在寫數據的時候是不對的,因為芯片要求在等待內部操作時要求CE為低,而這是51統一尋址辦不到的,所以CE要單獨的一個引腳用來控制。這是要注意的,別的按統一尋址操作就可以。

        /*
        *********************************************************************************************************
        * NOTE:The programme of send data to the FLASH.
        *
        * (c) Copyright ************Electronic Co.,Ltd
        * All Rights Reserved
        *
        *
        *
        * File : K9FData.c
        * By :david4383 @163.com

        * Data : 2007.08.07
        * Version : V0.1
        *********************************************************************************************************
        */
        /*本文件2007.08.24日調試完成*/
        #include "cygnal.h"
        #include "macro.h"
        #include "common.h"
        #include
        #include "variable.h"
        #include "function.h"
        sbit KRB =P0^4;
        extern void delay(unint i);

        volatile unchar xdata K9FADD _at_ 0x3000;

        /*
        -------------------------------------------------------------------------------------------
        輸 入:編程的數據開始地址,數據讀出的間接地址.
        輸 出:返回編程是否正確.
        功 能:可以編一頁的空間.最大地址在528.
        -------------------------------------------------------------------------------------------
        */
        unchar K9FProgramData(unchar columndata, /* */
        unchar pageh, /* */
        unchar pagel, /* */
        volatile unchar xdata *xramadd) /* */
        {
        unint i;

        K9FCELOW;

        K9FWriteComm(K9FWRITECOMMAND); //0x80

        K9FWriteAdd(columndata,pageh,pagel);


        for (i=columndata ; i<512 ; i++)
        {
        K9FADD=*xramadd;
        xramadd++;
        }

        K9FWriteComm(K9FENDPROGRAMFLASH); //發送0x10;

        K9FDetectBusy();

        K9FCEHIGH;

        if(K9FStatusRead())
        {

        return TRUE;
        }
        else
        {
        return FALSE;
        }

        }
        /*
        -------------------------------------------------------------------------------------------
        輸入:編程的字節個數,頁開始地址,塊高,塊低,編程的數據存貯器.
        輸出:編程是否成功.
        功能:程序要編程n個字節,也不是頁體.
        -------------------------------------------------------------------------------------------
        */
        unchar K9FProgramNData(unchar n,/*編程字節個數 */
        unchar columndata, /*頁開始地址 */
        unchar pageh, /*塊地址高 */
        unchar pagel, /*塊地址低 */
        volatile unchar xdata *xramadd) /*編程數據存貯器*/
        {
        unint i;
        i=0;
        K9FCELOW;

        K9FWriteComm(K9FWRITECOMMAND); //0x80

        K9FWriteAdd(columndata,pageh,pagel);

        while (i{
        K9FADD=*xramadd;
        xramadd++;
        i++;
        }

        K9FWriteComm(K9FENDPROGRAMFLASH); //發送0x10;

        K9FDetectBusy();

        K9FCEHIGH;

        if(K9FStatusRead())
        {

        return TRUE;
        }
        else
        {
        return FALSE;
        }

        }
        /*
        -------------------------------------------------------------------------------------------
        輸 入:塊A的地址,塊B的地址.
        輸 出:塊復制是否正確的標志.
        功 能:當一個塊檢測到錯誤時,從一個塊保存到另一個塊.
        -------------------------------------------------------------------------------------------
        */
        unchar K9FCopyBackProgramData(unchar columndataA,
        unchar pagehA,
        unchar pagelA, /*塊復制源地址 */
        unchar columndataB,
        unchar pagehB,
        unchar pagelB) /*塊復制目的地址 */
        {
        K9FCELOW;

        K9FWriteComm(0x00);

        K9FWriteAdd(columndataA,pagehA,pagelA);

        K9FDetectBusy();

        K9FWriteComm(0x8a);

        K9FWriteAdd(columndataB,pagehB,pagelB);

        K9FDetectBusy();

        K9FCEHIGH;

        if(K9FStatusRead())
        {
        return TRUE;
        }
        else
        {
        return FALSE;
        }

        }
        /*
        -------------------------------------------------------------------------------------------
        輸入:頁高地址,頁低地址,存放數據的連續空間
        輸出:坊數據是否成功
        功能:用來讀取正好一頁的內容.
        -------------------------------------------------------------------------------------------
        */

        void K9FReadPageData(unchar pageh,
        unchar pagel,
        volatile unchar xdata *xramadd)
        {
        unint i;
        K9FCELOW;

        K9FWriteComm(K9FREADCOMMAND); //命令鎖存.

        K9FWriteAdd(0x00,pageh,pagel); //地址鎖存.

        K9FDetectBusy();

        for (i=0x00 ; i<512 ; i++)
        {
        *xramadd=K9FADD;
        xramadd++;
        }

        K9FCEHIGH;

        }

        /*
        -------------------------------------------------------------------------------------------
        輸 入:選擇塊區;要讀出的頁數;數據讀的開始地址.及讀出存放的地址.
        輸 出:數據存放在指針所指的地址中.返回數據是否讀出正確.
        功 能:可以實現從A,B,C任意塊開始讀,可以讀一頁甚至多頁,
        -------------------------------------------------------------------------------------------
        */
        unchar K9FReadSequenceData(unchar comm, /*選擇是A、B、還是C;暫時考慮不使用C*/
        unchar pages, /*讀出的頁數 */
        unchar columndata, /*數據的開始位置 */
        unchar pageh, /*數據開始的高地址 */
        unchar pagel, /*數據開始的低地址 */
        volatile unchar xdata *xramadd) /*數據存放的開始地址 */
        {
        unint max;
        unint i;

        if (pages==0x00)
        {
        return FALSE;
        }

        if (comm==0x00)
        {
        max=528; //256+256+16;
        }
        else if (comm==0x01)
        {
        max=272; //256+16;
        }
        else if (comm==0x50)
        {
        max=16;
        }
        else
        {
        return FALSE;
        }

        K9FCELOW;

        K9FWriteComm(comm); //0x01或者0x00;

        K9FWriteComm(K9FWRITECOMMAND); //0x80;

        K9FWriteAdd(columndata,pageh,pagel);

        for (i=columndata; i{
        *xramadd=K9FADD;
        xramadd++;
        }

        K9FDetectBusy();

        pages--;
        while (pages!=0x00) //然后讀出是一整頁的數據.順序存放在間接地址中.
        {
        for (i=0; i{
        *xramadd=K9FADD;
        xramadd++;
        }
        pages--; //直到要求讀的頁數為0,則停止.

        K9FDetectBusy();
        }

        K9FCEHIGH; //拉高片選.結束讀數據.
        }
        /*
        -------------------------------------------------------------------------------------------
        輸 入:讀一個字節的地址
        輸 出:字節是否正確讀出.
        功 能:可以只讀一個字節.也可以讀N個字節,使用片選線結束繼續讀下面的數據.返回為數據讀出
        是否正確.
        -------------------------------------------------------------------------------------------
        */
        unchar K9FReadNData(
        unchar comm, /*A,B,還是C? */
        unchar n, /*讀出數據的個數 */
        unchar columndata, /*單個數據的開始地址 */
        unchar pageh, /* */
        unchar pagel, /* */
        volatile unchar xdata *xramadd) /*讀出的數據存放的位置 */
        {
        unchar i;
        i=0;
        K9FCELOW; //拉低片選.
        if(comm!=0x00)
        {
        K9FWriteComm(comm);
        }
        K9FWriteComm(K9FREADCOMMAND);

        K9FWriteAdd(columndata,pageh,pagel);

        K9FDetectBusy();

        while (i {
        *xramadd=K9FADD;
        xramadd++;
        i++;
        }

        K9FCEHIGH; //拉高片選,完成讀數據.
        return (TRUE);

        }
        /*
        -------------------------------------------------------------------------------------------

        -------------------------------------------------------------------------------------------
        */
        unchar K9FReadAData(unchar comm,
        unchar columndata, /*單個數據的開始地址 */
        unchar pageh, /* */
        unchar pagel) /* */
        {
        unchar i;

        K9FCELOW; //拉低片選.
        if (comm!=0x00)
        {
        K9FWriteComm(comm);
        }
        K9FWriteComm(K9FREADCOMMAND);

        K9FWriteAdd(columndata,pageh,pagel);

        K9FDetectBusy();

        i=K9FADD;

        K9FCEHIGH; //拉高片選,完成讀數據.
        return (i);

        }
        /*
        -------------------------------------------------------------------------------------------
        輸 入:void
        輸 出:廠家號碼及型號號碼.
        功 能:一個UNINT型量,讀出是否是正常的芯片碼.
        -------------------------------------------------------------------------------------------
        */
        unint K9FReadID(void)
        {
        unint a;

        K9FCELOW;

        K9FWriteComm(K9FREADIDCOMMAND);

        ALEHIGH;
        K9FADD=0x00;
        ALELOW;

        a=0x00ff&K9FADD;
        a=a*256;
        a=a|K9FADD;

        K9FCEHIGH;

        return (a);
        }
        /*
        -------------------------------------------------------------------------------------------
        輸 入:要擦除的頁高低地址.
        輸 出:返回是否擦除成功標志.
        功 能:共有2048個塊,每個塊16K(8BIT),
        -------------------------------------------------------------------------------------------
        */
        unchar K9FEraseBlockData(unchar pageh,unchar pagel)
        {

        K9FCELOW;

        K9FWriteComm(K9FERISESETUPCOMMAND); //0x60 擦除命令.

        ALEHIGH;
        K9FADD=pagel; //地址,先送低,再送高.
        K9FADD=pageh;
        ALELOW;

        K9FWriteComm(K9FERISECOMMAND); //0xd0;

        K9FDetectBusy();

        K9FCEHIGH;

        if(K9FStatusRead())
        {
        return TRUE;
        }
        else
        {
        return FALSE;
        }
        }
        /*
        -------------------------------------------------------------------------------------------
        輸 入:void
        返 回:讀狀態是否正常,為1正常.
        實現功能:讀寫操作完成后,芯片是否正常完成操作.
        -------------------------------------------------------------------------------------------
        */
        unchar K9FStatusRead(void)
        {
        unchar rdata;

        K9FCELOW;

        K9FWriteComm(K9FSTATUSCOMMAND); //0x70

        rdata=K9FADD; //讀數據.

        K9FCEHIGH;

        if((rdata&0x01)==0x00) //編程是不是正確.
        {
        return TRUE; //
        }
        else
        {
        return FALSE;
        }
        }
        /*
        -------------------------------------------------------------------------------------------
        輸 入:數據寫入的開始地址,頁的高低字節.
        輸 出:void
        功 能:給芯片發送等待操作的地址.
        -------------------------------------------------------------------------------------------
        */
        void K9FWriteAdd(unchar columndata,unchar pageh,unchar pagel)
        {
        ALEHIGH; /*數據開始地址*/ /*頁高*/ /*頁低*/
        K9FADD=columndata;
        K9FADD=pagel;
        K9FADD=pageh;
        ALELOW;
        }
        /*
        -------------------------------------------------------------------------------------------
        輸 入:寫入芯片的指令.
        輸 出:void
        功 能:給芯片發送命令指令.
        -------------------------------------------------------------------------------------------
        */
        void K9FWriteComm(unchar command)
        {
        CLEHIGH;
        K9FADD=command;
        CLELOW;
        }
        /*
        -------------------------------------------------------------------------------------------
        輸 入:void
        輸 出:void
        功 能:在不正常的情況下可以使芯片復位
        -------------------------------------------------------------------------------------------
        */
        void K9FReset(void)
        {
        K9FCELOW;

        K9FWriteComm(0xff); //0xff為復位命令

        K9FDetectBusy();

        K9FCEHIGH;
        }
        void K9FDetectBusy(void)
        {
        KRB=1;
        while (!KRB);
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 离岛区| 沛县| 乌兰察布市| 伊春市| 乌苏市| 东明县| 富平县| 壶关县| 绥棱县| 西乌珠穆沁旗| 扶风县| 波密县| 西青区| 荃湾区| 大竹县| 南部县| 东兴市| 桐城市| 赣州市| 通州市| 无为县| 红桥区| 万源市| 桐城市| 阿图什市| 长沙市| 赞皇县| 綦江县| 新竹县| 津市市| 靖远县| 中牟县| 马尔康县| 松原市| 宜春市| 东兴市| 宜宾市| 桓仁| 台南县| 三河市| 崇文区|