📄 flash.c
字号:
//-----------------------------------------------------------------------------
// P2口为FASH数据线接口,P1口为模拟量输入接口。
// 第一页编号,
// 第3页模拟量起始地址
// 第9页模拟量坏块地址
//----------FLASH初始化子程序
void FLASH_Init(void)
{
CLE=0;
RE=1;
ALE=0;
WE=1;
}
//向FLASH写入命令子程序
void WRITEcomd_flash(unsigned char comd)
{
P2MDOUT=0xff;
FLASH_Init();
CLE=1;
nop();
P2=comd;
WE=0;WE=0;WE=0;
WE=1;WE=1;
CLE=0;
}
//以下子程序将写内存时的FLASH地址送FLASH
void addr_flash(unsigned int r_p_addr,unsigned char position)
{
P2MDOUT=0xff;
P2=position; //A0-A7
ALE=1;ALE=1;
nop();
WE=0;WE=0;WE=0;
WE=1;WE=1;
P2=r_p_addr; //A9-A16
WE=0;WE=0;WE=0;
WE=1;WE=1;
P2=r_p_addr>>8; ///A17-A24
WE=0;WE=0;WE=0;
WE=1;WE=1;
ALE=0;
}
//读FLASH状态子程序
unsigned char readsta(void)
{
unsigned char soop;
P2MDOUT=0x00;
P2 = 0xff;
RE=0;
nop();
soop=P1;
RE=1;
return(soop);
}
//向FLASH写入页面结束标志(当前时间)子程序
void WRITE_PE_flash(void) //PAGE END
{
unsigned char pe;
FLASH_Init();
pe=TIME;
P2=TIME>>8;
WE=0;WE=0;WE=1;
nop();P2=pe;
WE=0;WE=0;WE=1;
FLASH_Init();
}
//向FLASH写入页面起始标志(00)子程序
void WRITE_PS_flash(void) //page start
{
P2=0x55;
WE=0;
WE=0;
WE=1;
nop();
P2=0x55;
WE=0;
WE=0;
WE=1;
}
//将数据按每半页写入FLASH子程序
void DATA_Input(unsigned int p_addr,unsigned char H_P_label,unsigned char len)
{
int i;
unsigned char result;
if(H_P_label==0)
{
// pointer=&TIME;
if(PCA_position>=256)
{WRITEcomd_flash(0x01);}
else
{WRITEcomd_flash(0x00);}
WRITEcomd_flash(0x80);
addr_flash(PCA_addr,PCA_position);
if(PCA_position==0)
{
WRITE_PS_flash();
PCA_position=PCA_position+2;
}
else{}
for(i=0;i<len;i++)
{
P2=HT_PCA;
WE=0;WE=0;WE=1;
P2=LT_PCA;
WE=0;WE=0;WE=1;
}
WRITEcomd_flash(0x10);
if(PCA_position>=500)
{PCA_position=0;PCA_addr++;}
else
{PCA_position=PCA_position+2;}
while(RB==0){};
WRITEcomd_flash(0x70);
result=readsta();
// if(result^0==1)
// {error();}
// else
// return();
}
else if(H_P_label==6) //段起始和结束地址写入
{
pointer=&a_r_p_addr;
FLASH_Init();
WRITEcomd_flash(0x00);
WRITEcomd_flash(0x80);
addr_flash(p_addr,seg_numb*8);
for(i=0;i<2;i++)
{
P2=*pointer;
WE=0;WE=0;
WE=1;pointer++;
}
WRITEcomd_flash(0x10);
while(RB==0){};
WRITEcomd_flash(0x70);
result=readsta();
//if(result^0==1)
// {error();}
// else
// return();
}
else if(H_P_label==8) //模拟量坏块地址写入第9页
{
pointer=&a_r_p_addr;
FLASH_Init();
WRITEcomd_flash(0x00);
WRITEcomd_flash(0x80);
addr_flash(p_addr,Abad_cout*8);
for(i=0;i<4;i++)
{
P2=*pointer;
WE=0;WE=0;
WE=1;pointer++;
}
WRITEcomd_flash(0x10);
while(RB==0){};
WRITEcomd_flash(0x70);
result=readsta();
//if(result^0==1)
// {error();}
// else
// return();
}
}
/////////////////////////////////////////////
void read_data(int number)//读出数据 number=1~528
{
int i;
P2MDOUT=0;
P2=0xff;
FLASH_Init();
RE=0;RE=0;TI0=0;TI0=0;
for(i=0;i<(number);i++)
{
TI0=0;
RE=0;RE=0;
// SBUF0=0xaa;
SBUF0=P2;
while(TI0==0);
TI0=0;
RE=1;
//printf("%x ",j);//从FLASH读数,串口输出
}
FLASH_Init();
}
//////////////////////////////////////////////////////
void page_read_data(unsigned int page_number)//页读出,page_number为页码0~65565
{
WRITEcomd_flash(0x00);
addr_flash(page_number,0);
while(~RB){};
read_data(512);//每页读出500 BYTE
}
////////////////////////////////////////////////////////
//******块擦除,block_number的间隔值为32
//////////////////////////////////////////////////////
unsigned char block_erase(unsigned int block_number)//块擦除,block_number的间隔值为32
{
unsigned char result=0;
unsigned char sta=0;
unsigned char block_number1;
block_number1=(unsigned char)block_number & 0x00ff;
sta=(unsigned char)((block_number &0xff00)>>8);
P2MDOUT = 0xFF;
// wait_time(1);
WRITEcomd_flash(0x60);
nop();
nop();
ALE=1;
nop();
WE=0;
P2=block_number1;//A9-A16
nop();nop();nop();
WE=1;WE=1;
WE=0;
P2=sta;//A17-A24
nop();nop();nop();
WE=1;
nop();
ALE=0;
nop();
WRITEcomd_flash(0xd0);
nop();
WE=1;
WE=1;
while(~RB){};
wait_time(1);
WRITEcomd_flash(0x70);
result=readsta();
result=result&0x01;
if(result==1)
{
sta=1;
TI0=1;
printf("Erro_page=%u\n",block_number);
TI0=0;
nop();
}
return sta;
}
char erase_flash(void)
{
/* 1 block = 32 pages, 1 K9f2808 Device=1024 blocks 1 K9f5608 Device=2048 blocks 擦除整片 */
unsigned char i=0;
unsigned int j;
for (j=1;j<=2047;j++){i=i+block_erase(j*32+1);}
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -