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

📄 dsp2407nand_flash.c

📁 DSP 2407 烧写外部flash的源代码 开发环境:TI CCS 可用于将程序固化到外部存储器上
💻 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 + -