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

📄 flash.c

📁 DSP对K9F5608U0A芯片的操作。已经经过验证!包括对K9F5608U0A的读写
💻 C
字号:
/*******************************************
 *                                         *
 *     Copyright (c) WinterSun Corp.       *
 *     Jcy For Chongqing                   *
 *     Flash Operation                     *
 *     flash16M.c                          *
 *     by SunWood                          *
 *     02-12-28 21:39                      *
 *                                         *
 *******************************************/
/* flash chip: K9F2808U0A
 * 16M x 8 Bit, 1024 Block, 32 Page/Block, 528 Bytes/Page
 */
#define		_FLH_GLOBALS
#include	"DSP281x_Device.h"
#include    "flash.h"
                   
Uint16 pTmpR[256],pTmpW[256];  
//Uint16 FlashNowPage;
//Uint16 FlashNowBlock;
//Uint16 FlashID;                 
	

void FlashInit(void)
{
// Set GPIO A port pins,AL(Bits 7:0)(input)-AH(Bits 15:8) (output) 8bits
// Input Qualifier =0, none
     EALLOW;
     GpioMuxRegs.GPFMUX.bit.MCLKRA_GPIOF9 = 0;  
     GpioMuxRegs.GPFMUX.bit.MFSXA_GPIOF10 = 0;  
	 GpioMuxRegs.GPFMUX.bit.MCLKXA_GPIOF8 = 0;
     GpioMuxRegs.GPFDIR.bit.GPIOF9 = 1;    	// upper byte as output/low byte as input
	 GpioMuxRegs.GPFDIR.bit.GPIOF10 =1;
	 GpioMuxRegs.GPFDIR.bit.GPIOF8 = 0;
//     GpioMuxRegs.GPAQUAL.all=0x0000;	// Input qualifier disabled

// Set GPIO B port pins, configured as EVB signals
// Input Qualifier =0, none
// Set bits to 1 to configure peripherals signals on the pins
//     GpioMuxRegs.GPBMUX.all=0xFFFF;   
//     GpioMuxRegs.GPBQUAL.all=0x0000;	// Input qualifier disabled
     EDIS;
//  FLASH_FCE=1;
   FLASH_FALE=0;
   FLASH_FCLE=0;
}

BOOL FlashReadID(void)
{
    Uint16  c1, c2;
//    FLASH_FCE=0;
    
    FLASH_FCLE=1;
    FLASH_FDATA = 0x0090;
    FLASH_FCLE=0;
        
    FLASH_FALE=1;
    FLASH_FDATA = 0x0000;
    FLASH_FALE=0;

    c1 = FLASH_FDATA &0xff ;
    c2 = FLASH_FDATA &0xff;
    Delay(0x10);
    Delay(0x10);
//    FLASH_FCE=1;
    if(c1 == 0xec && c2 == 0x75) return TRUE;
    else return FALSE;
}

BOOL FlashWritePage(Uint16 block, Uint16 page, Uint16 *inStr, Uint16 len)
{       
    Uint16 i,c,b;
    Uint16 *pStr = inStr;
    
//    FLASH_FCE=0;
    
    FLASH_FCLE=1;
    FLASH_FDATA = 0x80;
    FLASH_FCLE=0;
    
    FLASH_FALE=1;
    FLASH_FDATA = 0;
    FLASH_FDATA = page | (block << 5);// 操作的块数在255块内??要是2048块的话应将5改为8??
    FLASH_FDATA = block >> 3;
    FLASH_FALE=0;
    
    if(len > 528) len = 528;//字节为单位,所以要发一个字需要发两次
    for(i = 0; i < len; i++)
    {   
   		if ((i%2)==0)	FLASH_FDATA = (pStr[i/2] & 0xff);//发低8位
   		else   FLASH_FDATA = ((pStr[i/2] >>8)&0xff);    //发高8位
   		
    }
        
    FLASH_FCLE=1;
    FLASH_FDATA = 0x10;
    FLASH_FCLE=0;
//	b=FLASH_READBUSY;
    Delay(200);
    while(!FLASH_FBUSY);
//	b=FLASH_READBUSY;
//	while(!FLASH_READBUSY);
    
    FLASH_FCLE=1;
    FLASH_FDATA = 0x70;
    FLASH_FCLE=0;
    c = FLASH_FDATA; 
    
 //   FLASH_FCE=1;
    
    if((c & 0x00ff) != 0xc0) //read status register
    	return FALSE;
    return TRUE;
}

BOOL FlashEraseBlock(Uint16 block)
{           
    Uint16 c;        
    
 //  FLASH_FCE=0;
    
    FLASH_FCLE=1;
    FLASH_FDATA = 0x0060;
    FLASH_FCLE=0;
        
    FLASH_FALE=1;
    FLASH_FDATA = block << 5;
    FLASH_FDATA = block >> 3;
    FLASH_FALE=0;
    
    FLASH_FCLE=1;
    FLASH_FDATA = 0x00d0;
    FLASH_FCLE=0;
    
    Delay(10);
    
    while(1)
    {
    	c=FLASH_FBUSY;	
//        c= FLASH_READBUSY;
    	if (c==0)
    	{
    		Delay(100);
    	}	
    	else break;
    }
    
                           
    FLASH_FCLE=1;
    FLASH_FDATA = 0x70;
    FLASH_FCLE=0;
    c = FLASH_FDATA;
//   FLASH_FCE=1;     
    
    c &= 0x00ff;
   // if(c == 0x00c0) 
    
    return c;
    
}

void FlashReadPage(Uint16 block, Uint16 page, Uint16 *outStr, Uint16 len)
{
    Uint16 i;                 
    Uint16 c;

//   FLASH_FCE=0;
    
    FLASH_FCLE=1;
    FLASH_FDATA = 0x00; //00 is read operation command
    FLASH_FCLE=0;

/*write the address of the page    */
//starting address of the register
    FLASH_FALE=1;
    FLASH_FDATA = 0; /* 页起始 */
//page address
    page = page + (block << 5);    
    FLASH_FDATA = page;
    FLASH_FDATA = block >> 3;
    FLASH_FALE=0;
    
//    Delay(0x300);   
    Delay(0x100);          
    while(!FLASH_FBUSY);
//while(!FLASH_READBUSY);  
    
    for(i = 0; i < len; i++) {
        c = FLASH_FDATA;  
        if ((i%2)==0) outStr[i/2] = c & 0x00ff; //读低8位
        else  outStr[i/2] |= (c & 0x00ff)<<8;   //读高8位
    }
        
//   FLASH_FCE=1;
}              
                                      
void Delay(Uint16 times)
{
	Uint16 i;
	for(i=0;i<times;i++);
}                                      

/*void LDelay(Uint16 times)
{
	Uint16 i;
	for(i=0;i<times;i++);
} */                                     

BOOL SaveProgram2Flash(void)
{
	Uint16  *pTmpP,i,j;
	Uint16  wNowBlock,wNowPage;
	
	
 	pTmpP=(Uint16 *)0x80;                    
 	FlashEraseBlock(1022);
	FlashEraseBlock(1023);
	 	 	
 	Delay(0xffe0);
 	
 	for (i=0;i<50;i++)
 	{ 
 		memcpy(pTmpW,pTmpP,256);
 		wNowBlock=1022+(i/32);
 		wNowPage=i%32;
		FlashWritePage(wNowBlock, wNowPage, pTmpW, 512); 	  	
		pTmpP+=256;  
		Delay(0xffe0);                    
    	Delay(0xffe0);                    
    	FlashReadPage(wNowBlock,wNowPage,pTmpR,512);  
    	Delay(0xffe0);                    
    	Delay(0xffe0);                    
    	for (j=0;j<256;j++)
    	{
    		if (pTmpW[j]!=pTmpR[j])  
    		{
    			Delay(0x20);
    			Delay(0x20);	
    			return FALSE;   	
    		}
    	}
 	}                        
 	return TRUE;
}   

void ChangePage(Uint16 wNowPage)
{
//	FLASH_FCE=0;
    FLASH_FCLE=1;
    FLASH_FDATA=0x00;
    FLASH_FCLE=0;
    FLASH_FALE=1;
    FLASH_FDATA=0; 
    FLASH_FDATA=wNowPage;
    FLASH_FDATA = (wNowPage>>8);
    FLASH_FALE=0;
    Delay(60);                      
    while(!FLASH_FBUSY);
}

⌨️ 快捷键说明

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