<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          K9F5608程序

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

          下面是我寫的一些程序。

          本文引用地址:http://www.ex-cimer.com/article/201611/316608.htm

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

          /*
          *********************************************************************************************************
          * 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日調(diào)試完成*/
          #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;

          /*
          -------------------------------------------------------------------------------------------
          輸 入:編程的數(shù)據(jù)開始地址,數(shù)據(jù)讀出的間接地址.
          輸 出:返回編程是否正確.
          功 能:可以編一頁的空間.最大地址在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); //發(fā)送0x10;

          K9FDetectBusy();

          K9FCEHIGH;

          if(K9FStatusRead())
          {

          return TRUE;
          }
          else
          {
          return FALSE;
          }

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

          K9FWriteComm(K9FWRITECOMMAND); //0x80

          K9FWriteAdd(columndata,pageh,pagel);

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

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

          K9FDetectBusy();

          K9FCEHIGH;

          if(K9FStatusRead())
          {

          return TRUE;
          }
          else
          {
          return FALSE;
          }

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

          K9FWriteComm(0x00);

          K9FWriteAdd(columndataA,pagehA,pagelA);

          K9FDetectBusy();

          K9FWriteComm(0x8a);

          K9FWriteAdd(columndataB,pagehB,pagelB);

          K9FDetectBusy();

          K9FCEHIGH;

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

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

          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;

          }

          /*
          -------------------------------------------------------------------------------------------
          輸 入:選擇塊區(qū);要讀出的頁數(shù);數(shù)據(jù)讀的開始地址.及讀出存放的地址.
          輸 出:數(shù)據(jù)存放在指針?biāo)傅牡刂分?返回數(shù)據(jù)是否讀出正確.
          功 能:可以實現(xiàn)從A,B,C任意塊開始讀,可以讀一頁甚至多頁,
          -------------------------------------------------------------------------------------------
          */
          unchar K9FReadSequenceData(unchar comm, /*選擇是A、B、還是C;暫時考慮不使用C*/
          unchar pages, /*讀出的頁數(shù) */
          unchar columndata, /*數(shù)據(jù)的開始位置 */
          unchar pageh, /*數(shù)據(jù)開始的高地址 */
          unchar pagel, /*數(shù)據(jù)開始的低地址 */
          volatile unchar xdata *xramadd) /*數(shù)據(jù)存放的開始地址 */
          {
          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) //然后讀出是一整頁的數(shù)據(jù).順序存放在間接地址中.
          {
          for (i=0; i{
          *xramadd=K9FADD;
          xramadd++;
          }
          pages--; //直到要求讀的頁數(shù)為0,則停止.

          K9FDetectBusy();
          }

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

          K9FWriteAdd(columndata,pageh,pagel);

          K9FDetectBusy();

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

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

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

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

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

          K9FWriteAdd(columndata,pageh,pagel);

          K9FDetectBusy();

          i=K9FADD;

          K9FCEHIGH; //拉高片選,完成讀數(shù)據(jù).
          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);
          }
          /*
          -------------------------------------------------------------------------------------------
          輸 入:要擦除的頁高低地址.
          輸 出:返回是否擦除成功標(biāo)志.
          功 能:共有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
          返 回:讀狀態(tài)是否正常,為1正常.
          實現(xiàn)功能:讀寫操作完成后,芯片是否正常完成操作.
          -------------------------------------------------------------------------------------------
          */
          unchar K9FStatusRead(void)
          {
          unchar rdata;

          K9FCELOW;

          K9FWriteComm(K9FSTATUSCOMMAND); //0x70

          rdata=K9FADD; //讀數(shù)據(jù).

          K9FCEHIGH;

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

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

          K9FDetectBusy();

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



          關(guān)鍵詞: K9F5608程序統(tǒng)一尋

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();