📄 29lvflash.c
字号:
#include "..\inc\44b.h"
#include "..\inc\29lvflash.h"
#include "..\inc\44blib.h"
/* attention!! Cache must be closed first */
/* word addr must be converted to byte addr */
#define FLASH_WR(addr, data) *(volatile unsigned short *)(addr<<1) = (unsigned short)(data)
#define FLASH_WRITE 0xA0A0
#define FLASH_ERASE_CHIP 0x1010
#define FLASH_ERASE_SECTOR 0x3030
#define FLASH_RESET 0xF0F0
void Flash_Reset(void)
{
FLASH_WR(0, FLASH_RESET);
}
void Flash_Erase_Chip(void)
{
Flash_Reset();
/* 6 write cycles */
FLASH_WR(0x555, 0xaaaa);
//Delay(10);
FLASH_WR(0x2aa, 0x5555);
//Delay(10);
FLASH_WR(0x555, 0x8080);
//Delay(10);
FLASH_WR(0x555, 0xaaaa);
//Delay(10);
FLASH_WR(0x2aa, 0x5555);
//Delay(10);
FLASH_WR(0x555, FLASH_ERASE_CHIP);
/* wait for finishing */
while(!(rPDATC&0x04)); //gpc2 = r/b
Flash_Reset();
}
void Flash_Write(char *addr, char *data, int len)
{
int i;
for(i=0; i<len/2; i++)
{
Flash_Reset();
/* first 3 cycles */
FLASH_WR(0x555, 0xaaaa);
//Delay(1);
FLASH_WR(0x2aa, 0x5555);
//Delay(1);
FLASH_WR(0x555, 0xa0a0);
//Delay(1);
/* write begin */
*((volatile short *)addr) = *((short *)data);
addr += 2;
data += 2;
/* wait for finishing */
while(!(rPDATC&0x04)); //gpc2 = r/b
Flash_Reset();
}
}
int secaddr[] = {
0,
0x2000,
0x3000,
0x4000,
0x8000,
0x10000,
0x18000,
0x20000,
0x28000,
0x30000,
0x38000,
0x40000,
0x48000,
0x50000,
0x58000,
0x60000,
0x68000,
0x70000,
0x78000
};
void Flash_Erase_Sector(int sec)
{
Flash_Reset();
FLASH_WR(0x555, 0xaaaa);
//Delay(1);
FLASH_WR(0x2aa, 0x5555);
//Delay(1);
FLASH_WR(0x555, 0x8080);
//Delay(1);
FLASH_WR(0x555, 0xaaaa);
//Delay(1);
FLASH_WR(0x2aa, 0x5555);
//Delay(1);
FLASH_WR(secaddr[sec], 0x3030);
//Delay(1);
/* wait for finishing */
while(!(rPDATC&0x04)); //gpc2 = r/b
Flash_Reset();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -