我是靠谱客的博主 大胆大山,最近开发中收集的这篇文章主要介绍EEPROM(AT24C16)页写算法1. 写在前面2.EEPROM页写算法3. 参考源码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. 写在前面

      学习单片机或者从事嵌入式开发的,对于EEPROM绝不会陌生,尤其的24系列的EEPROM很是经典,或者与此兼容的FRAM系列,如AT24C02、AT24C16、FM24C16等。 驱动起这个系列的EEPROM,可以说是没有任何难点,各类教程、源码、驱动都可以轻松找到并作稍微改动即可使用。但是,对于使用技巧方面,大多的教程并不会提及,而只是作为学习“入门”的一个途径,真正在实际产品中使用,还需自身的经验去摸索改善。

2.EEPROM页写算法

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

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

EEPROM页写时序图:

修改后的页写算法:

uint16_t ee_24clxx_writebytes(uint16_t write_addr, const char* pwrite_buff, uint16_t writebytes)
{
    uint8_t write_len,page_offset;
    uint16_t temp= 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;
        temp+= write_len;
       if(writebytes > 0)
       {
            pwrite_buff = pwrite_buff + write_len;
            write_addr  = write_addr + write_len;
            i2c_24clxx_waitstandby(0); /*页写判忙,FRAM则不用*/
        }
    }
    return temp;
}

3. 参考源码

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

[2] https://github.com/Prry/_24Cxx-EEPROM-FRAM-Dev

最后

以上就是大胆大山为你收集整理的EEPROM(AT24C16)页写算法1. 写在前面2.EEPROM页写算法3. 参考源码的全部内容,希望文章能够帮你解决EEPROM(AT24C16)页写算法1. 写在前面2.EEPROM页写算法3. 参考源码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部