?? 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 + -