📄 nand 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 + -