最近在开发i2c接口的e2prom时,发现一些e2prom读取速度很快,写入速度很慢(一个字节5ms),在编程的时候如果一次写入一长串数据,写入周期很长,程序是以固定时长为周期的循环工作方式,在有e2prom写入的周期,工作时间会超过设定的周期时长,影响整个程序运行的稳定性。
一种解决办法是上操作系统,但太麻烦了,还想采用裸奔的方式运行。此时需要将多个字节的写入拆分至多个周期内完成,每个周期最多只写入一个字节。最后采用的实现方式为:
定义一个e2prom缓冲区,每次先将数据写入缓冲区,使用写入标志位指示缓冲区中是否有新的数据写入。设计一个e2prom写入任务,每周期调用一次,每次从缓冲区中写入e2prom一个字节。
#define EEPROM_SIZE 128//e2prom字节数
unsigned char ee_bit_flag[EEPROM_SIZE / 8] = {0};//写入标志位
unsigned char ee_buffer[EEPROM_SIZE] = {0};//写入缓存区
int e2prom_task()
{
int iWriteNum = 0;
int i = 0;
int j = 0;
for(i = 0; i < sizeof(ee_bit_flag); i++)//检查是否有新数据写入
{
if(ee_bit_flag[i] != 0)
{
for(j = 0; j < 7; j++)
{
if((ee_bit_flag[i] & (1 << j)) != 0)//确定是哪个数据
{
WriteE2prom(i * 8 + j);//写入e2prom
ee_bit_flag[i] &= ~(1 << j)//清除标志位
iWriteNum = 1;
}
}
}
}
return iWriteNum;
}