⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nand flash.c

📁 fm2812下flash读写范例程序
💻 C
字号:
//I2C LED   
#include "DSP28_Device.h"

#define NAND_SEL_REG *(Uint16 *)0x2004
#define NAND_CE0  NAND_SEL_REG=0X06
#define NAND_CE1  NAND_SEL_REG=0X07
#define NAND_ALE_REG *(Uint16 *)0x2010
#define NAND_CLE_REG *(Uint16 *)0x2020
#define NAND_DATA_REG *(Uint16 *)0x2000
#define COMMREG(x)   ((unsigned int)((x)<<8))
#define DATAREG      ((unsigned int)((NAND_DATA_REG&0xff00)>>8))

///GpioDataRegs.GPBDAT.bit.GPIOB10=NAND RNB
////////////////////////////////////////////////
#define COMM_ReadID      	0x90
#define COMM_SerialRead1 	0x00
#define COMM_SerialRead2 	0x30
#define COMM_Reset       	0xFF
#define COMM_ReadBack1   	0x00
#define COMM_ReadBack2   	0x35
#define COMM_PagePGM1    	0x80
#define COMM_PagePGM2    	0x10
#define COMM_CachePGM1  	0x80
#define COMM_CachePGM2  	0x15
#define COMM_CopyBackPGM1   0x85
#define COMM_CopyBackPGM2   0x10
#define COMM_BlockErase1  	0x60
#define COMM_BlockErase2  	0xD0
#define COMM_ReadStatus  	0x70
////////////////////////////////////////////////
unsigned  	int  *ExRamStart = (unsigned  int *)0x80000;
/////////////////////////////////////////////////

void delay(unsigned int);
void ldelay(unsigned int); 
void READ_ID();
////////////////////////////////////////////////
unsigned int MAKERID,DEVICEID; 
unsigned int BUF[2048];
/////////////////////////////////////////////////
////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////

void READ_ID()
{
    
	NAND_CE0;
	NAND_CLE_REG=COMMREG(COMM_ReadID);	
	NAND_ALE_REG=COMMREG(0x00);
	MAKERID=DATAREG;
	DEVICEID=DATAREG;
	NAND_CE1;
}

/////////////////////////////////////////////////////////////////////////////
//function: read flash 
//input: PageADDR:  flash row address(PAGE address),17 bit width refer to datasheet   
 //   ByteADDR:12bit  col addr
 //  databuf: out data buffer pointer 
 //  buflen:  unsigned char num from flash 
//////////////////////////////////////////////////////////////
void FLASH_READ_PAG(unsigned long PageADDR, unsigned int ByteADDR ,unsigned int *databuf,unsigned int buflen) 
{ 
  
	unsigned int tempaddr1,tempaddr2;

	NAND_CE0;
	NAND_CLE_REG=COMMREG(COMM_SerialRead1);	
	NAND_ALE_REG=COMMREG(ByteADDR);
	NAND_ALE_REG=COMMREG(ByteADDR>>8);
	tempaddr1=(unsigned int)(PageADDR);
	tempaddr2=(unsigned int)(PageADDR<<16);
	NAND_ALE_REG=COMMREG(tempaddr1);
	NAND_ALE_REG=COMMREG(tempaddr1>>8);
	NAND_ALE_REG=COMMREG(tempaddr2);
    NAND_CLE_REG=COMMREG(COMM_SerialRead2);
    delay(100); 
    while (	GpioDataRegs.GPBDAT.bit.GPIOB10==0);
    delay(100); 	
    for(;buflen>0;buflen--,databuf++) 
   *databuf=DATAREG; 
   NAND_CE1;

} 

//////////////////////////////////////////////////////////////////

//function: Write flash 
//input: PageADDR:  flash row address(PAGE address),17 bit width refer to datasheet   
//    ByteADDR:12bit  col addr
//   databuf: out data buffer pointer 
//  buflen:  unsigned char num from flash 
//////////////////////////////////////////////////////////////
unsigned int FLASH_WRITE_PAG(unsigned long PageADDR, unsigned int ByteADDR ,unsigned int *databuf,unsigned int buflen) 
{ 
  
	unsigned int tempaddr1,tempaddr2,Status;

	NAND_CE0;
	NAND_CLE_REG=COMMREG(COMM_PagePGM1);	
	NAND_ALE_REG=COMMREG(ByteADDR);
	NAND_ALE_REG=COMMREG(ByteADDR>>8);
	tempaddr1=(unsigned int)(PageADDR);
	tempaddr2=(unsigned int)(PageADDR<<16);
	NAND_ALE_REG=COMMREG(tempaddr1);
	NAND_ALE_REG=COMMREG(tempaddr1>>8);
	NAND_ALE_REG=COMMREG(tempaddr2);
    for(;buflen>0;buflen--,databuf++) 
    NAND_DATA_REG=tempaddr1=(*databuf)<<8; 
    NAND_CLE_REG=COMMREG(COMM_PagePGM2); 
    delay(100); 
    while (	GpioDataRegs.GPBDAT.bit.GPIOB10==0);	
	NAND_CLE_REG=COMMREG(COMM_ReadStatus);
	delay(100); 
    Status=DATAREG; NAND_CE1;
    if (Status&0x01) return 0 ;else return 1;
   
	
} 
///////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////

//function: Erase flash 
//input: PageADDR:  flash row address(PAGE address),17 bit width refer to datasheet   

//////////////////////////////////////////////////////////////
unsigned int FLASH_ERASE(unsigned long PageADDR) 
{ 

	unsigned int tempaddr1,tempaddr2,Status;
	if ((unsigned int)(PageADDR%64)==0) 
	
	{
	tempaddr1=(unsigned int)(PageADDR);
	tempaddr2=(unsigned int)(PageADDR<<16);
	
	NAND_CE0;
	NAND_CLE_REG=COMMREG(COMM_BlockErase1);	

    
	NAND_ALE_REG=COMMREG(tempaddr1<<6);
	NAND_ALE_REG=COMMREG(tempaddr1>>8);
	NAND_ALE_REG=COMMREG(tempaddr2);
    NAND_CLE_REG=COMMREG(COMM_BlockErase2);
    delay(100);  
    while (	(Status=GpioDataRegs.GPBDAT.bit.GPIOB10)==0);	
	NAND_CLE_REG=COMMREG(COMM_ReadStatus);
	delay(100);
    Status=DATAREG;NAND_CE1;
    if (Status&0x01) return 0 ;else return 1;
 	}
 	return 1;
} 
///////////////////////////////////////////////////
void ReadBUFtoEXRAM(unsigned int *databuf)
{
	Uint16	i;
	for	(i=0;i<2048;i++)		*(ExRamStart+ i) = *(databuf +i);
}
////////////////////////////////////
void InitExRam(Uint16	Start)
{
	Uint16	i;
	for	(i=0;i<2048;i++)		*(ExRamStart + Start + i) = i;
}
///////////////////////////////////////////////////////////////
void InitExRamZero(Uint16	Start)
{
	Uint16	i;
	for	(i=0;i<2048;i++)		*(ExRamStart + Start + i) = 0;
}

/////////////////////////////////////////////////////////////////////////
void ReadEXRAMtoBUF(unsigned int *databuf)
{
	Uint16	i;
	for	(i=0;i<2048;i++)	*(databuf +i)=*(ExRamStart+ i);
}
////////////////////////////////////////////////////////////////////

void main(void)
{   
    unsigned int k,i;
 	
	InitSysCtrl();			//初始化系统

	DINT;				//关中断 
	IER = 0x0000;
	IFR = 0x0000;

	InitPieCtrl();			//初始化PIE控制寄存器
	InitPieVectTable();		//初始化PIE参数表 
	InitPeripherals();		//初始化外设寄存器 
	InitGpio();				//初始化IO口

	EINT;				//Enable INTM
	ERTM;				//Enable DBGM
    k=0;
   
   
    READ_ID();
    k=FLASH_ERASE(0);
    InitExRam(0);
    FLASH_READ_PAG(0,0,BUF,2048);
    for (i=0;i<2048;i++) BUF[i]=i;
    ReadEXRAMtoBUF(BUF);
    if (k==1) 
    k=FLASH_WRITE_PAG(0,0,BUF,2048);
   
    for (i=0;i<2048;i++) BUF[i]=0;
    InitExRamZero(0);
    if (k==1) 
    FLASH_READ_PAG(0,0,BUF,2048);
	ReadBUFtoEXRAM(BUF);
} 	

	
void ldelay(unsigned int k)
{
	while(k>0)
	{
		k--;
		delay(20000);
	}
}	

void delay(unsigned int t)
{
	while(t>0)
		t--;
}



	

⌨️ 快捷键说明

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