|
/**************************************************************** //MCS-51單片機(jī)底層EEPROM操作庫(kù)。 //只在STC89C52單片機(jī)上實(shí)驗(yàn)過(guò) ****************************************************************/
//#include "define_stc_flash.h" #include "../inc/MCS_X51.H" #include<intrins.h> bit gint; /************************************************* //-----使能IAP---------------- *************************************************/ void flsh_en() { gint = EA; INT_GLOBAL(0); //DISABLE INTERUPT set_flsh_wait; //set wait time set_flsh_en; //enable flash operate } /************************************************** //停止IAP **************************************************/ void flsh_ds() { set_flsh_ds; //disable flash operate set_flsh_trig(0); //dis trig INT_GLOBAL(gint); //return global int } /*從flash中讀出一個(gè)字節(jié)返回*/ UINT8 flsh_rd_byte(UINT16 addx) { set_flsh_addr(addx); flsh_wr_cmd(CMD_READ); set_flsh_trig(TRIG1); set_flsh_trig(TRIG2); _nop_; return(flsh_rd_data); } /****************************************** //從一個(gè)扇區(qū)內(nèi)讀出一串?dāng)?shù)據(jù)。 //傳送參數(shù):扇區(qū)內(nèi)地址,讀出個(gè)數(shù),讀出地址 ********************************************/ bit flsh_sector_rd(UINT16 addx,UINT8 num,UINT8 *p) { UINT8 i; if(num > USED_SPACE) return(0); //超出扇區(qū)范圍,退出 flsh_en(); for(i = 0;i < num;i++) { *p=flsh_rd_byte(addx + i); p++; } flsh_ds(); //禁止iap操作 return(1); } /*********************************************** //扇區(qū)擦除 ***********************************************/ void flsh_sector_earse(UINT16 addx) { UINT16 sec_addr = 0xfe00; sec_addr &= addx; //取得扇區(qū)首地址 set_flsh_addr(sec_addr); flsh_en(); flsh_wr_cmd(CMD_SES); //扇區(qū)擦除命令 set_flsh_trig(TRIG1); set_flsh_trig(TRIG2); _nop_; flsh_ds(); } /*********************************************************** // 寫一個(gè)字節(jié)并校驗(yàn),如果寫正確,返回1,否則返回0 ***********************************************************/ bit flsh_wr_verify(UINT16 addx,UINT8 dax) { set_flsh_addr(addx); flsh_wr_cmd(CMD_PGM); flsh_wr_data(dax); //寫數(shù)據(jù)到iap的數(shù)據(jù)寄存器。 set_flsh_trig(TRIG1); set_flsh_trig(TRIG2); _nop_; flsh_wr_data(0); //使iap的數(shù)據(jù)寄存器改變,以便回讀。 flsh_wr_cmd(CMD_READ); set_flsh_trig(TRIG1); set_flsh_trig(TRIG2); _nop_; if(flsh_rd_data == dax) return(1); else return(0); } /************************************************************************** //寫一個(gè)扇區(qū) //傳送16位的目的地址,最好從扇區(qū)首地址開(kāi)始,8位的數(shù)據(jù)長(zhǎng)度,源數(shù)據(jù)的指針 **************************************************************************/ bit flsh_sector_wr(UINT16 addx,UINT8 num,UINT8 * pdax) { UINT8 i; UINT16 addr; if(num > USED_SPACE) return(0); //超出扇區(qū)范圍退出 addr = addx; flsh_sector_earse(addx); //擦除目的扇區(qū) flsh_en(); for(i=0;i<num;i++) { if(!flsh_wr_verify(addr,*pdax)) { flsh_ds(); //操作出錯(cuò),返回前禁止flash操作 return(0); } addr++; pdax++; } flsh_ds(); //寫完畢禁止FLASH 操作 return(1); } |