📄 flash.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 + -