算法24c语言,EEPROM(AT24C16)页写算法

1.写在前面

学习单片机或者从事嵌入式开发的,对于EEPROM绝不会陌生,尤其的24系列的EEPROM很是经典,如AT24C02、AT24C16等。 驱动起这个系列的EEPROM,可以说是轻而易举,各类教程、源码、驱动都可以轻松找到并作稍微改动即可使用。

2.EEPROM页写算法

驱动起一片EEPROM,实现的功能不外乎就是读、写,不多赘述。在写过程中,有一个“页写”功能,如果是大量数据写入,采用“页写”功能会大大提高效率。记得以前学习单片机的时候,遵循的是某开发板的教程,其中的“页写”算法过于复杂,包括现在看来依然是比较累赘,所以已经把好多人搞懵逼。而且网络上大部分的源码几乎都是大同小异,质量不算高。大体思路是这样的:用逻辑语句实现,检查写入总数据字节数是否大于一页,开始地址是否为页的开始,剩下未满一页的数据怎样处理。逻辑上来说,这样处理还是非常好理解,但显得过于累赘。逻辑用数学语句描述,则是算法,下面则是这样的实现。

工作后,从Linux系统的驱动源码中发现了EEPROM的“页写”新方法,几句代码即把前面一堆逻辑描述清楚,第一次体会到算法的神奇之处。作了一些修改,关键代码如下。

Center

char ee_24clxx_writebytes(u16 write_addr, char* pwrite_buff, u16 writebytes)

{

u8   write_len,page_offset;

char error = 0;

while(writebytes > 0)

{

page_offset = EE24CLXX_PAGESIZE - (write_addr % EE24CLXX_PAGESIZE); /*EE24CLXX_PAGESIZE为页大小,如24c16为16*/

write_len   = writebytes > page_offset ? page_offset : writebytes;

i2c_24clxx_write(write_addr,pwrite_buff, write_len);           /*写一页函数*/

writebytes   = writebytes - write_len;

if(writebytes > 0)

{

pwrite_buff = pwrite_buff + write_len;

write_addr  = write_addr + write_len;

i2c_24clxx_waitstandby(0);                  /*页写判忙,FRAM则不用*/

}

}

return error;

}

3.参考源码

[1]  https://github.com/Prry/drivers-for-mcu

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值