📄 dsp2407nand_flash.c
字号:
// 主程序
// 该程序用于实验NAND FLASH
#include "register.h"
#define BVIS 0 /*10-9 BUS Visibility*/
#define ISWS 7 /*9-7 IS BUS Waitstate 0-7*/
#define DSWS 0 /*5-3 IS BUS Waitstate 0-7*/
#define PSWS 0 /*2-0 IS BUS Waitstate 0-7*/
// WSGR=((BVIS<<9)+(ISWS<<6)+(DSWS<<6)+PSWS);
///////////////////////////////////////////////
ioport unsigned portC002; //地址端口
ioport unsigned portC001; //命令端口
ioport unsigned portC000; //数据端口;
//ioport unsigned port8001; //写port8001,NAND_CE=0;
//ioport unsigned port8002; //写port8002,NAND_CE=1;
///////////////////////////////////////////////////////
unsigned int BUF[512];
#define NAND_ALE_REG (portC002) //*(Uint16 *)0x2010
#define NAND_CLE_REG (portC001) //*(Uint16 *)0x2020
#define NAND_DATA_REG (portC000) //*(Uint16 *)0x2000
#define COMMREG(x) ((unsigned int)((x)))
#define DATAREG ((unsigned int)((NAND_DATA_REG)))
////////////////////////////////////////////////
#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
////////////////////////////////////////////////
void NAND_CE0();
void NAND_CE1();
/////////////////////////////////////////////////
void delay(unsigned int);
void ldelay(unsigned int);
void READ_ID();
////////////////////////////////////////////////
unsigned int MakerID=0,DeviceID=0;
//unsigned int BUF[2048];
/////////////////////////////////////////////////
void NAND_CE0()
{
MCRB = MCRB&0XFFFC;
PCDATDIR = PCDATDIR|0X0100;
PCDATDIR = PCDATDIR&0XFFFE;
}
void NAND_CE1()
{
MCRB = MCRB&0XFFFC;
PCDATDIR = PCDATDIR|0X0101;
}
////////////////////////////////////////////////////////////////
void waitH()
{
unsigned int temp=0;
MCRB = MCRB&0XFFFC;
while (temp!=0X0002)
{
temp=PCDATDIR&0X0002;
}
}
//////////////////////////////////////////////////////////////
void READ_ID()
{
MakerID=0;
DeviceID=0;
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);
waitH(); //while ( GpioDataRegs.GPBDAT.bit.GPIOB10==0);
delay(100);
for(;buflen>0;buflen--,databuf++)
{
*databuf=(DATAREG)&0x00ff;
// *databuf=(DATAREG)&0x00ff;
// *databuf=(DATAREG)&0x00ff;
// *databuf=(DATAREG)&0x00ff;
}
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);
// NAND_DATA_REG=tempaddr1=(*databuf);
// NAND_DATA_REG=tempaddr1=(*databuf);
// NAND_DATA_REG=tempaddr1=(*databuf);
}
NAND_CLE_REG=COMMREG(COMM_PagePGM2);
delay(100);
waitH(); //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);
waitH(); // 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 ldelay(unsigned int k)
{
while(k>0)
{
k--;
delay(200);
}
}
void delay(unsigned int t)
{
while(t>0)
t--;
}
///////////////////////////////////////////////////////////////////////////
void InitDSP()
{
asm(" SETC INTM");
asm(" CLRC SXM");
asm(" CLRC OVM");
asm(" CLRC CNF"); ///B0---data
SCSR1=0x83FE; // CLKIN=10M,CLKOUT=2*CLKIN=20M
WDCR =0x0E8;
IMR =0x00;
IFR =0x0FFFF;
WSGR=((BVIS<<9)+(ISWS<<6)+(DSWS<<6)+PSWS);
// WSGR = 0x07F;
}
///////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
void main(void)
{
unsigned int k,i;
InitDSP();
READ_ID();
k=FLASH_ERASE(0);
if (k==1)
FLASH_READ_PAG(0,0,BUF,512);
i=0;
while(i<512) {BUF[i]=i;i++;};
if (k==1)
k=FLASH_WRITE_PAG(0,0,BUF,512);
i=0;
while(i<512){ BUF[i]=0;i++;}
if (k==1)
FLASH_READ_PAG(0,0,BUF,512);
}
///////////////////////////////////////////////////////////
// 直接返回中断服务程序
void interrupt nothing( )
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -