日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)控制K9K8G08U0C NAND Flash讀寫(xiě)程序

          51單片機(jī)控制K9K8G08U0C NAND Flash讀寫(xiě)程序

          作者: 時(shí)間:2012-10-24 來(lái)源:網(wǎng)絡(luò) 收藏
          #include STC12C5A60S2.H>
          #include intrins.h>
          #include SMG.h>
          /********************************************/
          sbit NF_CLE=P0^3; //命令鎖存使能(輸出) CLE D3
          sbit NF_ALE=P3^4; //地址鎖存使能(輸出) ALE RS
          sbit NF_WE=P1^3; //NAND Flash寫(xiě)使能(輸出) /WE DB4
          sbit NF_RE=P1^2; //NAND Flash讀使能(輸出) /RE DB3
          sbit NF_CE=P3^7; //NAND Flash片選使能(輸出)/CE RD
          sbit NF_R_B=P3^5; //NAND Flash就緒/忙(輸入) r/b R/D_LCDEN
          sbit NF_WP=P3^6; //不用(已接到VCC) /WP
          #define NF_DATA P2
          /****************************************************/
          sbit DIOLA=P2^5;
          /**********************************************/
          //unsigned int DataArray[10];
          /*************************************************/
          // 12c5A60S2單片機(jī)初始化
          /*********************************************************/
          void MCU_Init()
          {
          P0M0=0x00;
          P0M1=0x00;
          P1M0=0x00;
          P1M1=0x00;
          P2M0=0x00;
          P2M1=0x00;
          P3M0=0x00;
          P3M1=0x00;
          AUXR=0x00;
          //TMOD=0x21;

          }
          /************************************************/
          void TimerInit()
          {

          TMOD=0x20; //設(shè)置定時(shí)器1為工作方式2 (0x22;)
          TH1=0xfd; //裝入初值 (0xef;)
          TL1=0xfd; //裝入初值 (0xef;)
          TR1=1; //啟動(dòng)定時(shí)器
          REN=1; //允許串口接收位
          SM0=1;SM1=0; //方式1
          SCON=0x50;
          ///////
          EA=1;
          ES=1;
          // PCON=0x80;
          //PS=1;
          //PT0=0;

          } //晶振:22.1184M 波特率:19200
          /**********************************************/
          //延時(shí)
          /*************************************************/
          void delay(unsigned int z)//延時(shí)參數(shù)(z)無(wú)反回值的子程序(void表示無(wú)反值)
          {
          unsigned int x,y;
          for(x=z;x>0;x--)
          for(y=100;y>0;y--);

          }





          /***************************************************
          //模 塊 名:控制的讀寫(xiě)程序

          //功能描述:NANDFLASH讀寫(xiě)程序

          //兼容性 :適合大部分的NANDFLASH,如需要根據(jù)手冊(cè)做簡(jiǎn)單修改即可

          //芯片型號(hào): STC89C516RD STC12C5A60S2等。

          ****************************************************/
          // NANDFLASH使能信號(hào)初始化
          ////////////////////////////////////////////////////////////////
          void NF_Initial()
          {
          NF_CLE=0;NF_ALE=0;NF_CE=1;
          NF_WE=1;NF_RE=1;NF_WP=1;
          }
          /********************************************************/
          /*****************************************************/
          //命令函數(shù) NAND Flash Command
          //Read1 00h/01h
          //Read2 50h
          //讀取芯片ID 90h
          //RESET FFh
          //寫(xiě)頁(yè) 80h 10h
          //塊擦除 60h D0h
          //讀取狀態(tài) 70h/7ah
          //******************************************
          void NF_Command(unsigned char command)
          {
          //P2=0xff;

          NF_ALE=0;
          //NF_CE=0;
          NF_CLE=1;
          NF_WE=0;
          NF_ALE=0;
          NF_DATA=command;
          NF_WE=1;
          NF_CLE=0;

          // NF_ALE=1;

          //P2=0xff;
          }
          /**************************************************/
          /**********************************************************/
          //讀取芯片ID函數(shù) NAND Flash Read_ID

          //讀取芯片ID 90h

          //******************************************
          unsigned char NF_ReadID()
          {
          unsigned char a,b,c,d;

          NF_Initial();
          NF_CE=0;

          NF_Command(0x90); //輸入命令

          NF_ALE=1;
          NF_WE=0;
          NF_DATA=0x00; //address,1cycle
          NF_WE=1;
          NF_ALE=0;


          NF_DATA=0xff;

          NF_RE=0;
          a=0xffNF_DATA; //ECH
          NF_RE=1;

          NF_DATA=0xff;
          NF_RE=0;
          b=0xffNF_DATA; //76H

          NF_RE=1;

          NF_DATA=0xff;

          NF_RE=0;
          c=0xffNF_DATA; //3fH

          NF_RE=1;

          NF_DATA=0xff;

          NF_RE=0;
          c=0xffNF_DATA; //00H
          NF_RE=1;

          NF_CE=1;

          /*NF_RE=0;
          a=0x00ffP2;
          NF_RE=1;

          P2=0xff;

          NF_RE=0;
          a=(P2*256)|a;
          NF_RE=1;
          NF_CE=1;
          */

          return a;
          }
          /************************************************/
          /***********************************************/
          //命令函數(shù) NAND Flash status

          //讀取狀態(tài) 70h/7ah

          //******************************************
          unsigned char NF_ReadStatus()
          {
          unsigned char s;

          NF_Initial();
          NF_CE=0;
          NF_Command(0x70);
          NF_DATA=0xff;
          NF_RE=0;_nop_();
          s=NF_DATA0x01;
          NF_RE=1;
          NF_CE=1;

          if(s==0x00) return (0xff); //正確
          else return (0x00); //錯(cuò)誤
          }
          /**************************************************/
          /************************************************/
          //塊擦除芯片 NAND Flash EraseBlock

          //塊擦除 60h D0h

          //******************************************
          unsigned char NF_EraseBlock(unsigned char Pageadd)
          {
          unsigned char s=0; //用來(lái)取狀態(tài),其實(shí)可以不要

          NF_Initial();
          NF_CE=0;

          NF_Command(0x60);
          NF_ALE=1;

          NF_WE=0;
          NF_DATA=Pageadd0xff; //NF_DATA=((Pageadd%256)%256)0xff;
          NF_WE=1;

          NF_WE=0;
          NF_DATA=(Pageadd>>8)0xff; //NF_DATA=((Pageadd%256)/256)0xff;
          NF_WE=1;

          NF_WE=0;
          NF_DATA=(Pageadd>>16)0xff; // NF_DATA=(Pageadd/256)0xff;
          NF_WE=1;

          NF_ALE=0;
          NF_Command(0xd0);

          NF_R_B=1;while(!NF_R_B); //檢查是否忙碌
          s=NF_ReadStatus(); //讀取狀態(tài):(0xff)正確 0x00)錯(cuò)誤

          NF_CE=1;

          return (s);
          }
          /********************************************************/
          /**********************************************/
          //發(fā)送地址 NAND Flash Send Addre

          //******************************************
          unsigned char NF_SendAddre(unsigned char Pageadd,unsigned char Columnadd)
          {

          NF_ALE=1;

          NF_WE=0;
          NF_DATA=Columnadd;
          NF_WE=1;
          //送地址第一個(gè)字節(jié),列地址(其實(shí)就是那512個(gè)字節(jié)地地址)
          NF_WE=0;
          NF_DATA=Pageadd0xff; //NF_DATA=((Pageadd%256)%256)0xff;
          NF_WE=1;
          //送地址第二個(gè)字節(jié),低五位是頁(yè)地址,高三位是塊地址的低三位(1block = 32page)
          NF_WE=0;
          NF_DATA=(Pageadd>>8)0xff; //NF_DATA=((Pageadd%256)/256)0xff;
          NF_WE=1;
          //送地址第三個(gè)字節(jié),塊地址
          NF_WE=0;
          NF_DATA=(Pageadd>>16)0xff; // NF_DATA=(Pageadd/256)0xff;
          NF_WE=1;
          //送地址第四個(gè)字節(jié),塊地址

          NF_ALE=0;
          P2=0xff;

          }
          /********************************************************/
          /********************************************************/
          //寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù) NAND Flash WirteByte
          //寫(xiě)入命令 80h 10h
          //******************************************
          unsigned char NF_WirteByte(unsigned char Pageadd,unsigned char Columnadd,unsigned char NF_dat)
          {
          unsigned char s=0;

          NF_Initial();
          NF_CE=0;

          // NF_Command(0x50);

          NF_R_B=1;while(!NF_R_B); //檢查是否忙碌

          NF_Command(0x80);

          NF_SendAddre(Pageadd,Columnadd);

          NF_WE=0;
          NF_DATA=NF_dat;
          NF_WE=1;

          NF_Command(0x10);

          NF_R_B=1;while(!NF_R_B); //檢查是否忙碌

          s=NF_ReadStatus(); //讀取狀態(tài):(0xff)正確 0x00)錯(cuò)誤

          NF_CE=1;

          }
          /****************************************************/
          /******************************************************/
          //讀取一個(gè)字節(jié) NAND Flash ReadByte
          //讀取命令 00h/01h (half)
          //******************************************
          unsigned char NF_ReadByte(unsigned char Pageadd,unsigned char Columnadd,unsigned char half)
          {
          unsigned char NF_dat,s=0;

          NF_Initial();
          NF_CE=0;

          NF_Command(half);

          NF_SendAddre(Pageadd,Columnadd);
          NF_R_B=1;while(!NF_R_B); //檢查是否忙碌

          NF_DATA=0xff;

          NF_RE=0;
          NF_dat=NF_DATA;
          NF_RE=1;

          NF_R_B=1;while(!NF_R_B); //檢查是否忙碌
          s=NF_ReadStatus(); //讀取狀態(tài):(0xff)正確 0x00)錯(cuò)誤

          NF_CE=1;

          return (NF_dat);
          }
          /***********************************************/
          /**********************************************/
          //寫(xiě)入多個(gè)字節(jié)的數(shù)據(jù) NAND Flash WirteByte
          //寫(xiě)入命令 80h 10h (PCS最大取512)
          //************************************************
          unsigned char NF_WirteNByte(unsigned char Pageadd,unsigned char Columnadd,unsigned char *P_NF,unsigned char pcs)
          {
          unsigned char s,i;

          NF_Initial();
          NF_CE=0;

          NF_R_B=1;while(!NF_R_B); //檢查是否忙碌

          NF_Command(0x00);
          NF_Command(0x80);

          NF_SendAddre(Pageadd,Columnadd);

          for(i=0;i pcs;i++)
          {
          NF_WE=0;
          NF_DATA=*P_NF;
          NF_WE=1;
          P_NF++;
          }

          NF_Command(0x10);

          while(!NF_R_B); //檢查是否忙碌

          s=NF_ReadStatus(); //讀取狀態(tài):(0xff)正確 0x00)錯(cuò)誤

          NF_CE=1;

          }
          /**************************************************/
          /*************************************/
          //讀取多個(gè)字節(jié) NAND Flash ReadByte
          //讀取命令 00h/01h (half)(PCS最大取512)
          //******************************************
          unsigned char NF_ReadNByte(unsigned char Pageadd,unsigned char Columnadd,unsigned char half,unsigned char *P_NF,unsigned char pcs)
          {
          unsigned char i,s=0;

          NF_Initial();
          NF_CE=0;

          NF_Command(half);

          NF_SendAddre(Pageadd,Columnadd);
          NF_R_B=1;while(!NF_R_B); //檢查是否忙碌

          NF_DATA=0xff;

          for(i=0;i pcs;i++)
          {
          NF_RE=0;
          *P_NF=NF_DATA;
          NF_RE=1;
          P_NF++;
          }


          NF_R_B=1;while(!NF_R_B); //檢查是否忙碌
          s=NF_ReadStatus(); //讀取狀態(tài):(0xff)正確 0x00)錯(cuò)誤

          NF_CE=1;

          // return (NF_dat);
          }
          /****************************************************

          51單片機(jī)相關(guān)文章:51單片機(jī)教程




          評(píng)論


          相關(guān)推薦

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

          關(guān)閉