📄 rd_wr_k9f5608.c
字号:
Nf_ready_write();
Nf_wr_byte(0xDD);
Nf_write_start();
DelayXms(1);
watchdog();
Nf_wait_busy();
} while(!nf_check_status());
Area=0;
Column_Address=0;
L_Row_Address++;
if(L_Row_Address%0x20==0)
{
if(L_Row_Address==0) { H_Row_Address++; }
//D′íêò????é
Block_Add=(uint)(H_Row_Address*256)+(uint)(L_Row_Address);
Block_Add-=0x20;//?°ò??éí·μ??·
L_Row_Address=(Byte)(Block_Add);
H_Row_Address=(Byte)(Block_Add>>8);
//D′è??é?ú±ê????
do
{
Area=0x50;
Column_Address=1;
Nf_ready_write();
Nf_wr_byte(0xBB);
Nf_write_start();
DelayXms(1);
watchdog();
Nf_wait_busy();
} while(!nf_check_status());
//
Block_Add+=0x20;
if (bad_block)
{
//òò?aóD?μ?éμ?′??ú£??ùò?òa2é?ò????ò???óDD§μ?o??éμ??·?£
while(Block_Add<0xFFE1)
{
Area=0x50;
Column_Address=0;
L_Row_Address=(Byte)(Block_Add);
H_Row_Address=(Byte)(Block_Add>>8);
Nf_ready_read();
Nf_wait_busy();
for(i=0;i<5;i++)
{
tmp_buf[i]=Nf_rd_byte();
}
if(tmp_buf[4]==0xEE || tmp_buf[4]==0xFF)
{
//good block
goto good_block;
}
else
{
Block_Add+=0x20;
}
}//end while(block_add<0xffe1)
}//edn if(bad_block)
good_block:
new_block=1;
L_Row_Address=(Byte)(Block_Add);
H_Row_Address=(Byte)(Block_Add>>8);
//D′è??éê1ó?±ê?????
//?àD′ò????é?°±ê??£??a?ù??′????ˉê±2é?ò?íê?μúò??????Dμ??·á??£
do
{
Area=0x50;
Column_Address=0;
Nf_ready_write();
Nf_wr_byte(0xAA);
Nf_write_start();
DelayXms(1);
watchdog();
Nf_wait_busy();
} while(!nf_check_status());
new_block=0;
Area=0;
Column_Address=0;
}//end if(L_Row_Address%0x20==0)
}//end else if(Area==1)
}//end if(Column_Address==250)
}
/*****************************************
1|?ü:D′è????tí·±ê??.
?èê?:????μ±?°???tμ??eê?μ??·,ìí3?D??¢
2?êy£o???tDòo?,?eê?μ??·,
·μ??£o
±?×¢£o
******************************************/
void write_header(void)
{
uchar data i=0;
//±£′?μ±?°
rd_Area=Area;
rd_Column_Address=Column_Address;
rd_L_Row_Address=L_Row_Address;
rd_H_Row_Address=H_Row_Address;
//D′è?′?′¢?÷ê1ó?±ê???£
if(!store_ok)
{
//′?′¢?÷μúò?′?ê1ó?
Area=0;
H_Row_Address=0;
L_Row_Address=0;
Column_Address=51;
do
{
Nf_ready_write();
Nf_wr_byte(0xB0);
Nf_write_start();
DelayXms(1);
watchdog();
Nf_wait_busy();
} while(!nf_check_status());
store_ok=1;
}
//D′è????tí3??--???tμ???êy
Area=1;
H_Row_Address=0;
L_Row_Address=0;
Column_Address=file_serial;
do
{
Nf_ready_write();
Nf_wr_byte(file_serial);
Nf_write_start();
DelayXms(1);
watchdog();
Nf_wait_busy();
} while(!nf_check_status());
//D′è????tí·
//file_serial==0---->No.1 files
i=file_serial/20;
H_Row_Address=0;
L_Row_Address=11+i;
i=file_serial%20;
if(i<10)
{
Area=0;
}
else
{
Area=1;
i-=10;
}
Column_Address=i*25;
do
{
Nf_ready_write();
for(i=0;i<5;i++)
{
Nf_wr_byte(FlashBuff[FlashIndex][i]);
}
Nf_wr_byte(rd_Area);
Nf_wr_byte(rd_Column_Address);
Nf_wr_byte(rd_L_Row_Address);
Nf_wr_byte(rd_H_Row_Address);
Nf_wr_byte(0x00);
Nf_write_start();
DelayXms(1);
watchdog();
Nf_wait_busy();
} while(!nf_check_status());
//???′μ??·
Area=rd_Area;
H_Row_Address=rd_H_Row_Address;
L_Row_Address=rd_L_Row_Address;
Column_Address=rd_Column_Address;
//???tí·±ê??
firstdata=1;
}
/*****************************************
1|?ü£o×′ì????ì2é
?èê?£o±à3ì/2á3y2ù×÷oó£??ì2é???′×′ì?μ?±ê????ê?·??yè·
2?êy£o
·μ??£o3é1|1/ê§°ü0
±?×¢£o
******************************************/
bit nf_check_status (void)
{
Nf_wait_busy();
/* Status Type Command */
Nf_send_command(NF_READ_STATUS_CMD);
if ( (Nf_rd_byte() & 0x01) == 0x00)
{
return OK;
}
else
{
return KO;
}
watchdog();
}
/*****************************************
1|?ü£o2á3y????′?′¢?÷????
?èê?£o°?????′?′¢?÷2á3yμ?£??ùóDêy?Yè?2????aFF
2?êy£o
·μ??£o
±?×¢£o
******************************************/
void nf_all_erase (void)
{
uint blockserial=0;
uint block_address=0;
uint badblocknum=0;
//uchar rd_H_Row_Address=0x00; //bad block table begin
//uchar rd_L_Row_Address=0x01; //′?′¢?μ?éDòáDo?μ?ò3??μ??·
//uchar rd_Column_Address=0x00;
//uchar rd_Area=0x00;
bit EraseOk=0;
uchar i=0;
watchdog();
Nf_CS_ON();
Nf_send_command(NF_RESET_CMD); //reset flash
Nf_wait_busy();
//while(blockserial<2048)
while(blockserial<2048)
{
i=0;
do
{
Nf_send_command (NF_READ_A_AREA_CMD);
Nf_send_command (NF_BLOCK_ERASE_CMD); /* Auto Block Erase Setup */
Nf_send_address ((Byte)(block_address)); /* 1st address cycle */
Nf_send_address ((Byte)(block_address>>8)); /* 2nd address cycle */
Nf_send_command(NF_BLOCK_ERASE_CONFIRM_CMD); /* Erase command */
DelayXms(3);//type=2ms
watchdog();
Nf_wait_busy();
EraseOk=nf_check_status();
}while(!EraseOk && ++i<3);
if(EraseOk)
{
//sucess erase
//63 blockserial_h blockserial_l
do
{
Nf_send_command(NF_READ_C_AREA_CMD);
Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
Nf_send_address(4);
Nf_send_address((Byte)(block_address)); //L_Row_Address
Nf_send_address((Byte)(block_address>>8));//H_Row_Address
Nf_wr_byte(0xEE);
//Nf_wr_byte(0xFF);
Nf_send_command(NF_PAGE_PROGRAM_CMD);
DelayXms(1);
watchdog();
Nf_wait_busy();
} while(!nf_check_status());
//ReportEraseOk();
}
else
{
//creat bad block flag
i=0;
do
{
Nf_send_command(NF_READ_C_AREA_CMD);
Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
Nf_send_address(4);
Nf_send_address((Byte)(block_address)); //L_Row_Address
Nf_send_address((Byte)(block_address>>8));//H_Row_Address
Nf_wr_byte(0xE0);
Nf_wr_byte(0xF0);
Nf_send_command(NF_PAGE_PROGRAM_CMD);
DelayXms(1);
watchdog();
Nf_wait_busy();
} while(!nf_check_status() && ++i<3);
/*
//failed erase , create bad block tab
do
{
Nf_send_command(rd_Area);
Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
Nf_send_address(rd_Column_Address);
Nf_send_address(rd_L_Row_Address);//L_Row_Address
Nf_send_address(rd_H_Row_Address);//H_Row_Address
//
Nf_wr_byte((Byte)(blockserial>>8));
Nf_wr_byte((Byte)(blockserial));
Nf_write_start();
DelayXms(1);
watchdog();
Nf_wait_busy();
} while(!nf_check_status());
//
rd_Column_Address+=2;
if(rd_Column_Address==0)
{
if(rd_Area==0) { rd_Area=1; }
else if(rd_Area==1) { rd_L_Row_Address++;} //increse Page
}
*/
badblocknum++;
//62 blockserial_h blockserial_l
ReportEraseEr();
}
blockserial++;
block_address+=0x20;
}//end while(
//D′è??μ?éí3??
//block=0,page=0,column=100;
if(badblocknum!=0)
{
do
{
Nf_send_command(00);
Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
Nf_send_address(53);
Nf_send_address(0);//L_Row_Address
Nf_send_address(0);//H_Row_Address
//
Nf_wr_byte((Byte)(badblocknum>>8));
Nf_wr_byte((Byte)(badblocknum));
Nf_write_start();
DelayXms(1);
watchdog();
Nf_wait_busy();
}while(!nf_check_status());
}
//write into init info
do
{
Nf_send_command(00);
Nf_send_command(NF_SEQUENTIAL_DATA_INPUT_CMD);
Nf_send_address(50);
Nf_send_address(0);//L_Row_Address
Nf_send_address(0);//H_Row_Address
Nf_wr_byte(0xA0);
Nf_write_start();
DelayXms(1);
watchdog();
Nf_wait_busy();
} while(!nf_check_status());
init_ok=1;
}
/*****************************************
1|?ü£o3?ê??ˉFLASH′?′¢?÷
?èê?£o±éé¨?è????FLASH′?′¢?÷£?è·?¨?????éμ?o??μ£??¨á¢μ??·???-??ó|±í?£
2?êy£o
·μ??£oArea£?Column_Address,L_Row_Address,H_Row_Address,FirstBlockArea,FirstBlockColumn,FirstBlockRow
±?×¢£o
******************************************/
void init_flash(void)
{
uchar i=0,j=0;
uchar MakerCode,DeviceCode,tmp,page=0;
uint Block_Address=0,block_address=0,bad_block_num=0;
watchdog();
P2 = NF_IDLE_STATE_ADD;
Nf_CS_ON();
Nf_send_command(NF_RESET_CMD);
Nf_wait_busy();
Nf_send_command(NF_READ_ID_CMD);
Nf_send_address(0x00);
Nf_wait_busy();
watchdog();
MakerCode=Nf_rd_byte();
DelayXms(1);
DeviceCode=Nf_rd_byte();
//ê×?èè·?¨′?′¢?÷ê?·???DDá?3?ê??ˉ.
Area=0;
H_Row_Address=0;
L_Row_Address=0;
Column_Address=50;
Nf_ready_read();
Nf_wait_busy();
for(j=0;j<5;j++)
{
ReceiveBuff[j]=Nf_rd_byte();
}
MakerCode=ReceiveBuff[0];//ê?·?3?ê??ˉ
if(MakerCode==0xA0)
{
//ò??-3?ê??ˉ
init_ok=1;
DeviceCode=ReceiveBuff[1];
if(DeviceCode==0xB0)
{
//′?′¢?÷ò??-ê1ó?1y
store_ok=1;
if((ReceiveBuff[3]==0xFF && ReceiveBuff[4]==0xFF) ||(ReceiveBuff[3]==0x00 && ReceiveBuff[4]==0x00))
{
bad_block=0;
}
else
{
bad_block_num=ReceiveBuff[3]*256+ReceiveBuff[4];
bad_block=1; //óD?μ?é′??
}
//2é?ò×?oóò???′?′¢???tμ?μ??·,D′è????tí·à?.
//′??ú0?é0ò3μ?B??
Area=1;
H_Row_Address=0;
L_Row_Address=0;
Column_Address=0;
Nf_ready_read();
Nf_wait_busy();
j=0;
while(j<200)
{
tmp=Nf_rd_byte();
if(tmp==0xFF) break;
else j++;
}
file_serial=j;;//ìí3????t??êy
if(j!=0)
{
//óD???t′¢′?,è·è????t????.
//
//?è?á3?é?ò??????tμ??eê?μ??·£??ù?á?áê?±è???ì?£
//?á3?μ±?°?a?????tμ??eê?μ??·
H_Row_Address=0;
L_Row_Address=11;
tmp=(file_serial-1)/20;
L_Row_Address+=tmp;
tmp=(file_serial-1)%20;
if(tmp<10)
{
Area=0;
}
else
{
tmp-=10;
Area=1;
}
Column_Address=tmp*25;
//store file_serial address begin
rd_Area=Area;
rd_H_Row_Address=H_Row_Address;
rd_L_Row_Address=L_Row_Address;
rd_Column_Address=Column_Address;
//
//Nf_ready_read();
//Nf_wait_busy();
//for(i=0;i<20;i++)
// {
// ReceiveBuff[i]=Nf_rd_byte();
// }
Column_Address+=17;
Nf_ready_read();
Nf_wait_busy();
tmp=Nf_rd_byte();
if(tmp==0xAA)
{
Column_Address-=7;
Nf_ready_read();
Nf_wait_busy();
for(i=0;i<5;i++)
{
ReceiveBuff[i]=Nf_rd_byte();
}
Area=ReceiveBuff[0];
Column_Address=ReceiveBuff[1];
L_Row_Address=ReceiveBuff[2];
H_Row_Address=ReceiveBuff[3];
goto exit_init;
}//ò??-D′íêá?
Column_Address-=12;
//Column_Address+=5;
Nf_ready_read();
Nf_wait_busy();
for(i=0;i<5;i++)
{
ReceiveBuff[i]=Nf_rd_byte();
}
Area=ReceiveBuff[0];
Column_Address=ReceiveBuff[1];
L_Row_Address=ReceiveBuff[2];
H_Row_Address=ReceiveBuff[3];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -