eeprom 的写操作比较费时,页写的效率要比字节高,但是页写需要控制地址卷页(roll),这里给出一个简单算法,欢迎讨论,希望有更简单的.<br />//**************************************************************<br />// Function: eeprom_prg_page<br />// Programmer:ASTEC CHINA<br />// Description:a simple page edge detect algorithm for page write of at24c02. <br />// input para:<br />// *data: write data pointer<br />// addr: eeprom address<br />// numb: write byte length<br />// output para: none<br />// modify history: 12/11/06 initia<br />// 13//11/06 test pass <br />//**************************************************************<br /><br />void ext_eep_prg(unsigned char *data, unsigned int addr,unsigned char numb)<br />{<br /> static unsigned char nlength, nlength_offset; <br /><br /> if(addr%8==0) //addr=n*8?<br /> { <br /> if(numb<=8)<br /> {<br /> nlength=numb;<br /> I2C_write_page(addr,data,nlength);<br /> }<br /> else<br /> {<br /> nlength=numb>>3;<br /> nlength_offset= numb%8; <br /> while(nlength--)<br /> { <br /> I2C_write_page(addr,data,8);<br /> addr=addr+8;<br /> data=data+8; <br /> }<br /> if(nlength_offset>0)<br /> {<br /> I2C_write_page(addr,data,nlength_offset); <br /> }<br /> }<br /> } <br /> else<br /> {<br /> nlength=8-(addr%8);<br /> if(numb<=nlength)<br /> {<br /> nlength=numb; <br /> I2C_write_page(addr,data,nlength); <br /> } <br /> else<br /> {<br /> I2C_write_page(addr,data,nlength);<br /> addr=addr+nlength;<br /> data=data+nlength;<br /> numb=numb-nlength;<br /> nlength=numb>>3;<br /> nlength_offset= numb%8;<br /> while(nlength--)<br /> { <br /> I2C_write_page(addr,data,8);<br /> addr=addr+8;<br /> data=data+8; <br /> }<br /> if(nlength_offset>0)<br /> {<br /> I2C_write_page(addr,data,nlength_offset); <br /> } <br /> }<br /><br /> }<br /> __RESET_WATCHDOG(); <br /> // wreeprom_exit_flag=1; <br />} |
|