at49bv1614.c

来自「51单片机读写nor flash 读出flash 的ID」· C语言 代码 · 共 205 行

C
205
字号


#include <REG51.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "STC89.h"
#include "At49bv1614.h"
#include "peripherals_control.h"


void  Delay_Nano_Seconds(int ntime)
{
   int i,j;
   for(i=0;i<ntime;i++)
      for(j=0;j<0xff;j++)
	  ;
}

int Erase_Entire_Chip()
{
        BYTE xdata   *Temp;

        /*  Issue the Sector Erase command   */

        Temp  = (BYTE xdata*)0x555; 
        *Temp = 0xAA;                   /* write data 0xAA to the address       */
        Temp  = (BYTE xdata*)0xAAA; 
        *Temp = 0x55;                   /* write data 0x55 to the address       */
        Temp  = (BYTE xdata*)0x555; 
        *Temp = 0x80;                  /* write data 0x80 to the address       */
        Temp  = (BYTE xdata*)0x555; 
        *Temp = 0xAA;                   /* write data 0xAA to the address       */
        Temp  = (BYTE xdata*)0xAAA; 
        *Temp = 0x55;                   /* write data 0x55 to the address       */
        Temp  = (BYTE xdata*)0x555; 
        *Temp = 0x10;                   /* write data 0x55 to the address       */

        Delay_Nano_Seconds(250);
        return (0);
		//        Delay_100_Milli_Seconds();      /* check DATABOOK for the most  */
                                        /* accurate value -- Tsce       */
}

int Erase_One_Sector( int iSector)
{
       int iBlockNum,iSectorNum12; 
       BYTE xdata  *Temp;

        /*  Issue the Sector Erase command */
        iBlockNum=iSector>>4;
		iSectorNum12=iSector%16; //BLOCK_SIZE;
		SELECT_PAGE(iBlockNum);

        Temp  = (BYTE xdata*)0x555; 
        *Temp = 0xAA;                   /* write data 0xAA to the address       */
        Temp  = (BYTE xdata*)0xAAA; 
        *Temp = 0x55;                  /* write data 0x55 to the address       */
        Temp  = (BYTE xdata*)0x555; 
        *Temp = 0x80;                   /* write data 0x80 to the address       */
        Temp  = (BYTE xdata*)0x555; 
        *Temp = 0xAA;                   /* write data 0xAA to the address       */
        Temp=(BYTE xdata*)0xAAA; 
        *Temp = 0x55;                   /* write data 0x55 to the address       */
         Temp = (BYTE xdata *)(iSectorNum12<<12);  /* set up starting address to be erased */
        *Temp = 0x30;                   

		 Delay_Nano_Seconds(250);
         return (0);
}


void Program_One_Byte (BYTE SrcByte,  int iSector, BYTE xdata *Dst)
{
       int iBlockNum; 
       BYTE xdata  *Temp;
       BYTE xdata  *DestBuf;

       iBlockNum=iSector>>4;
       SELECT_PAGE(iBlockNum);
       DestBuf = Dst;
       DestBuf=((int)DestBuf)|(iSector%16<<12);
		//        DestBuf =(BYTE xdata*)0x500;        

        Temp =  (BYTE xdata *)0x555; 
        *Temp = 0xAA;                   /* write data 0xAA to the address       */
        Temp =  (BYTE xdata *)0xAAA; 
        *Temp = 0x55;                   /* write data 0x55 to the address       */
        Temp =  (BYTE  xdata *)0x555; 
        *Temp = 0xA0;                   /* write data 0xA0 to the address       */
        *DestBuf = SrcByte;             /* transfer the byte to destination     */
    	Delay_Nano_Seconds(250);
 	    Check_Toggle_Ready(DestBuf);    /* wait for TOGGLE bit to get ready     */

}


void Program_One_Sector (BYTE  *Src, int iSector)
{
        BYTE xdata  *Temp;
        int iBlockNum; 
		BYTE xdata  *SourceBuf;
        BYTE xdata  *DestBuf;
        int Index;
        
        SourceBuf = Src;
        DestBuf =0; 
		DestBuf=(BYTE xdata*)(iSector%16<<12|((int)DestBuf));

        Erase_One_Sector(iSector);          /* erase the sector first */

        iBlockNum=iSector>>4;
    	SELECT_PAGE(iBlockNum);
	   
	    for (Index = 0; Index < SECTOR_SIZE; Index++)
        {
            Temp =  (BYTE xdata *)0x555; /* set up address to be A000:555h           */
            *Temp = 0xAA;                   /* write data 0xAA to the address           */
            Temp =  (BYTE xdata*)0xAAA; /* set up address to be A000:2AAAh          */
            *Temp = 0x55;                   /* write data 0x55 to the address           */
            Temp =  (BYTE xdata*)0x555; /* set up address to be A000:5555h          */
            *Temp = 0x80;                   /* write data 0xA0 to the address           */
            Temp =  (BYTE xdata *)0x555; /* set up address to be A000:555h           */
            *Temp = 0xAA;                   /* write data 0xAA to the address           */
            Temp =  (BYTE xdata*)0xAAA; /* set up address to be A000:2AAAh          */
            *Temp = 0x55;  
            Temp =  (BYTE xdata*)0x555; /* set up address to be A000:5555h          */
            *Temp = 0xA0; 
            Temp = DestBuf;                 /* save the original Destination address    */
            *DestBuf++ = *SourceBuf++;      /* transfer data from source to destination */
            Check_Toggle_Ready(Temp);       /* wait for TOGGLE bit to get ready         */
        }
}


void Check_Toggle_Ready (BYTE xdata *Dst)
{
        BYTE Loop = TRUE;
        BYTE PreData;
        BYTE CurrData;
        unsigned long TimeOut = 0;

        PreData = *Dst;
        PreData = PreData & 0x40;
        while ((TimeOut< 0x07FFFFFF) && (Loop))
        {
            CurrData = *Dst;
            CurrData = CurrData & 0x40;
            if (PreData == CurrData)
                    Loop = FALSE;   /* ready to exit the while loop */
            PreData = CurrData;
            TimeOut++;
        }

		if(Loop==TRUE)
		 while(1);
}



void Check_Data_Polling (BYTE  *Dst, BYTE TrueData)
{
        BYTE Loop = TRUE;
        BYTE CurrData;
        unsigned long TimeOut = 0;

        TrueData = TrueData &  0x80;
        while ((TimeOut< 0x07FFFFFF) && (Loop))
        {
                CurrData = *Dst;
                CurrData = CurrData & 0x80;
                if (TrueData == CurrData)
                        Loop = FALSE;   /* ready to exit the while loop  */
                TimeOut++;
        }
}


int Program_Flash(BYTE * src,int iSector,unsigned long ulLength)
{
   unsigned int i,j;
   unsigned long len;
   unsigned int SectorStart,numSector;
   len=ulLength;
   SectorStart=iSector;   //起始sector
   numSector=ulLength/SECTOR_SIZE;               //待擦除扇区数
   if(ulLength%SECTOR_SIZE)
      numSector++;
   for(i=0;i<numSector;i++)
     {
     
	   Erase_One_Sector(i+SectorStart);  //擦除FLASH
       len-=i*SECTOR_SIZE;
       if(len>=SECTOR_SIZE)
          Program_One_Sector (src+i*SECTOR_SIZE, SectorStart+i);  //写整个扇区
       else
	    {  
	      for(j=0;len>0;j++,len--)
		    Program_One_Byte (*(src+i+j),SectorStart+i,(BYTE xdata*)j);//写剩余字节
         }
	  }
	return (0);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?