📄 flash.c
字号:
#include "stdio.h"
#include "reg51.h"
#define _29F040_h
#define FCD_reset 0xf0
#define FCD_erase_suspand 0xb0
#define FCD_erase_resume 0x30
#define FC_address555 0x555
#define FC_address2AA 0x2aa
#define size_29f040 0x80000
#define flash_map_begin 0x4000
#define flash_map_end 0x5fff //8K
#define flash_page IO_EX4
//--------------------------------------
void F29040_reset()
{
XBYTE[flash_map_begin+0x30]=FCD_reset;
}
//--------------------------------------
//给出一个地址,自动送出页面地址,且返回页内偏移地址
unsigned int F29040_calc_address(long address)
{
unsigned long segment;
unsigned int ret;
unsigned char page;
segment=address>>11;
segment=address/2048;
page=segment;
XBYTE[flash_page]=page; //写页面地址
ret=address;
ret&=0x07ff;
ret|=0x4000;
return(ret);
}
//--------------------------------------
//向flash写入一个字节,写入之前请调用F29040_reset,返回0:成功,1失败
unsigned char F29040_write_a_byte(unsigned long address,unsigned char byte)
{
unsigned int offset;
unsigned char b1,b2;
unsigned char i=0;
bit ok=0;
F29040_reset();
offset=F29040_calc_address(FC_address555);
XBYTE[offset]=0xaa;
offset=F29040_calc_address(FC_address2AA);
XBYTE[offset]=0x55;
offset=F29040_calc_address(FC_address555);
XBYTE[offset]=0xa0;
offset=F29040_calc_address(address);
XBYTE[offset]=byte;
do
{
b1=XBYTE[offset]; //读flash数据总线
b1&=B1000_0000;
b2=byte & B1000_0000;
if(b1==b2)
return(0); //成功
b1=XBYTE[offset];
b1&=B0010_0000;
//MACRO_CALL_REFURBISH_WATCHDOG
}while(b1==0); //写字节周期完成
b1=XBYTE[offset]; //读flash数据总线
b1&=B1000_0000;
b2=byte & B1000_0000;
if(b1==b2)
return(0); //成功
else
return(1); //失败
}
//--------------------------------------
//向flash读一个字节,写入之前请调用F29040_reset
unsigned char F29040_read_a_byte(long address)
{
unsigned int offset;
unsigned char ret;
F29040_reset();
offset=F29040_calc_address(address);
ret=XBYTE[offset];
return(ret);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -