我在高职教STM32——I2C通信之读写EEPROM(三)

admin 2025-04-06 292人围观 ,发现284个评论

【学习目标】

了解常用存储器的类型及其特征

加深对I2C通信时序的理解

领悟I2C驱动与应用的分层理念和相互关联

三、EEPROM多字节读写时序3.1连续读写需要“缓冲”

我们读取EEPROM的时候很简单,EEPROM根据我们所送的时序,直接就把数据送出来了,但是写EEPROM却没有这么简单了。给EEPROM发送数据后,先保存在了EEPROM的缓存,EEPROM必须要把缓存中的数据搬移到“非易失”的区域,才能达到掉电不丢失的效果。而往非易失区域写需要一定的时间,每种器件不完全一样,AT24C02的这个写入时间最高不超过5ms。在往非易失区域写的过程,EEPROM是不会再响应我们的访问的,不仅接收不到我们的数据,我们即使用I2C标准的寻址模式去寻址,EEPROM都不会应答,就如同这个总线上没有这个器件一样。数据写入非易失区域完毕后,EEPROM再次恢复正常,可以正常读写了。

上一个实验我们一次只写一个字节的数据进去,等到下次重新上电再写的时候,时间肯定远远超过了5ms,但是如果我们是连续写入几个字节的时候,就必须得考虑到应答位的问题了。写入一个字节后,再写入下一个字节之前,我们必须要等待EEPROM再次响应才可以,大家注意下面程序的写法。

3.2多字节读写实验

1)任务描述

图10多字节读写的实验效果

2)多字节读写函数源码剖析

我们在驱动文件里增加了用于多字节读写的三个函数:AT24C02_WriteBytes()、AT24C02_ReadBytes()以及AT24C02_Refresh(),如代码清单4所示,函数功能及实现过程已在注释中体现。限于篇幅,上一个实验已分析过的源码就不在此处重复了,记得把这三个函数在头文件里声明。

代码清单4多字节读写函数源码

3)源码剖析

主程序源码见代码清单5,大家可以结合上面的实验效果来阅读。

代码清单5多字节读写主程序源码

四、EEPROM页写入实验4.1分页管理提高写入效率

在向EEPROM连续写入多个字节的数据时,如果每写一个字节都要等待几毫秒的话,整体上的写入效率就太低了。因此厂商就想了一个办法,把EEPROM分页管理。AT24C01/02这两个型号是8个字节一个页,而AT24C04/08/16是16个字节一页。我们开发板上用的是AT24C02,一共是256个字节,8个字节一页,那么就一共有32页。

分配好页之后,如果我们在同一个页内连续写入几个字节后,最后再发送停止位的时序。EEPROM检测到这个停止位后,就会一次性把这一页的数据写到非易失区域,就不需要像上个实验那样写一个字节检测一次了,并且页写入的时间也不会超过5ms。如果我们写入的数据跨页了,那么写完了一页之后,我们要发送一个停止位,然后等待并且检测EEPROM的空闲模式,一直等到把上一页数据完全写到非易失区域后,再进行下一页的写入,这样就可以在很大程度上提高数据的写入效率。顺便提一下,读操作与分页无关。

4.2页写入实验

1)任务描述

图11页写入的实验效果

2)页写入函数源码剖析

我们在驱动文件里又增加了一个页写入函数AT24C02_WritePages(),如代码清单6所示。该函数参照了上一章的I2C的驱动函数I2C_WriteBytes(),在循环写入的过程中增加了对页的判断和跨页的操作,具体实现过程参见注释。

代码清单6页写入函数源码

3)源码剖析

主程序源码见代码清单7,大家可以结合上面的实验效果来阅读。

代码清单7页写入实验主程序源码

(第三部分完,第四部分我们来完成一个EEPROM/串口/液晶显示的综合实验)

猜你喜欢
    不容错过