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 + -
显示快捷键?