?? f29lv160.c
字號:
#include "44b.h"
#include "typDef.h"
#define FLASH_START_ADDR 0x0000000
#define FLASH_CHIP_HWORD_SIZE 0x100000 //This flash has 1M Hwords
#define FLASH_SECTOR_HWORD_SIZE 0x8000 //The size of each sector of this flash is 32k hwords (1hword = 2 bytes)
#define FLASH_ADDR_UNLOCK1 0x0555
#define FLASH_ADDR_UNLOCK2 0x02aa
#define FLASH_DATA_UNLOCK1 0xaaaa
#define FLASH_DATA_UNLOCK2 0x5555
#define FLASH_SETUP_WRITE 0xa0a0
#define FLASH_SETUP_ERASE 0x8080
#define FLASH_CHIP_ERASE 0x1010
#define FLASH_SECTOR_ERASE 0x3030
STATUS flashOpOverDetect(UINT16 *ptr, UINT16 trueData, ULONG timeCounter)
{
ULONG timeTmp = timeCounter;
volatile UINT16 *pFlash = ptr;
UINT16 buf1, buf2,curTrueData;
curTrueData = trueData & 0x8080;
while((*pFlash & 0x8080) != curTrueData) {
if(timeTmp-- == 0) break;
}
timeTmp = timeCounter;
buf1 = *pFlash & 0x4040;
while(1) {
buf2 = *pFlash & 0x4040;
if(buf1 == buf2)
break;
else
buf1 = buf2;
if(timeTmp-- == 0)
return ERROR;
}
return OK;
}
void delay(void)
{
UINT32 i, temp;
for (i = 0; i < 1000; i++) {
temp = i;
}
}
UINT16 *flashWrite(UINT16 *flashAddr, UINT8 *buffer, ULONG length)
{
ULONG i, cLength;
volatile UINT16 *flashPtr;
volatile UINT16 *gBuffer;
flashPtr = flashAddr;
cLength = (length + 1)/2;
gBuffer = (UINT16 *)buffer;
while (cLength > 0) {
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_SETUP_WRITE;
*flashPtr = *gBuffer;
// delay();
if(flashOpOverDetect((UINT16 *)flashPtr, *gBuffer, 0x2000000)) {
while(1);
//Uart_Printf(0,"warning: write flash may failed at:0x%x.\n", (int)flashPtr);
}
cLength--;
flashPtr++;
gBuffer++;
}
flashPtr = flashAddr;
gBuffer = (UINT16 *)buffer;
cLength = length/2;
for(i=0; i<cLength; i++) {
if(*flashPtr++ != *gBuffer++) {
//Uart_Printf(0,"Error: write failed in FLASH39vf160 at 0x%x on verification.\n", (int)flashPtr);
while(1);
return NULL;
}
}
if(length%2) {
if((*flashPtr++ & 0x00ff) != (*gBuffer++ & 0x00ff)) {
//Uart_Printf(0,"Error: write failed in FLASH39vf160 at 0x%x on verification.\n", (int)flashPtr);
while(1);
return NULL;
}
}
return (UINT16 *)flashPtr;
}
STATUS flashChipErase(void)
{
int i;
volatile UINT16 *flashPtr = NULL;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_SETUP_ERASE;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_CHIP_ERASE;
flashPtr = (volatile UINT16 *)FLASH_START_ADDR;
if(flashOpOverDetect((UINT16 *)flashPtr, 0xffff, 0x3000000) != OK) {
//Uart_Printf(0,"warning: Chip Erase time out!\n");
}
flashPtr = (volatile UINT16 *)FLASH_START_ADDR;
for(i=0; i<FLASH_CHIP_HWORD_SIZE; i++,flashPtr++) {
if(*flashPtr != 0xffff) {
//Uart_Printf(0,"Debug: Erase failed at 0x%x in FLASH39VF160 on verification.\n", (int)flashPtr);
while(1);
return ERROR;
}
}
return OK;
}
STATUS flashSectorErase(UINT16 *pSector)
{
int i;
volatile UINT16 *flashPtr = pSector;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_SETUP_ERASE;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;
*((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
*(volatile UINT16 *)flashPtr = FLASH_SECTOR_ERASE;
if(flashOpOverDetect((UINT16 *)flashPtr, 0xffff, 0x20000) != OK) {
//Uart_Printf(0,"warning: Sector Erase time out!\n");
while(1);
}
for(i=0; i<FLASH_SECTOR_HWORD_SIZE; i++,flashPtr++) {
if(*flashPtr != 0xffff) {
//Uart_Printf(0,"Debug: Erase failed at 0x%x in FLASH39VF160 on verification.\n", (int)flashPtr);
while(1);
return ERROR;
}
}
return OK;
}
void Port_Init(void)
{ //CAUTION:Follow the configuration order for setting the ports.
// 1) setting value
// 2) setting control register
// 3) configure pull-up resistor.
//PORT A GROUP
//GPA9 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0
// 0, 1, 1, 1, 1, 1, 1, 1, 1, 1
rPCONA=0x1ff;
rPDATA=0x0;
//PORT B GROUP
//GPB10 GPB9 nGCS3 nGCS2 nGCS1 GPB5 GPB4 nSRAS nSCAS SCLK SCKE
// 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1
rPCONB=0x1Cf;
//PORT C GROUP
//IISLRCK IISD0 IISDI IISCLK VD7 VD6 VD5 VD4 nXDACK1 nXDREQ1 GPC10 GPC11 TXD1 RXD1 GPC14 GPC15
//All input
// 11 11 11 11 11 11 11 11 11 11 01 01 11 11 01 01
rPDATC=0x8400;
// rPCONC=0x5F5FFFFF;
rPCONC=0xfffaffff;
rPUPC=0x33ff; //should be enabled
//PORT D GROUP
//VFRAME VM VLINE VCLK VD3 VD2 VD1 VD0
// 10,10, 10, 10, 10, 10, 10, 10
rPCOND=0xaaaa;
rPUPD=0xff;
//PORT E GROUP
//PE0:FOUT, PE1:TxD0, PE2:RxD0, GPE3, GPE4, GPE5,GPE6,GPE7, CODECLK
// 10 10, 10, 01 , 01, 01, 01, 01, 10
// rPCONE=0x2552A;
rPCONE=0x255a8;
rPUPE=0xff;
rPDATE=0X68;
//PORT F GROUP
//IICSCL IICSDA nWAIT nXBACK0 nXDREQ0 GPF5 GPF6 GPF7 GPF8
// 10 10 10 10 10 0 0 0 0
// rPCONF=0x2A;
rPCONF=0x3ea;
rPUPF=0xff;
//PORT G GROUP
//EINT0 EINT1 EINT2 EINT3 GPG4 GPG5 GPG6 GPG7
// 0x0
// 11 11 11 11 01 01 01 01
rPDATG=0x0;
// rPCONG=0x55FF;
rPCONG=0x557f;
rPUPG=0xf;
rSPUCR=0x7; //pull-up disable
rEXTINT=0x22222022; //All EINT[7:0] will be falling edge triggered.
}
void Main(void)
{
UINT8* tonybuf = (UINT8*)(0xc200000);
//Port_Init();
flashChipErase();
flashWrite(0x0, tonybuf, 128*1024);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -