首页 Home / 技术资讯 Insights / 24LC256 跨页写入为什么覆盖旧数据?
技术应用发布 2026-10-22SUNTEC 晟雅泰 技术团队

24LC256 跨页写入为什么覆盖旧数据?

24LC256在同一次页写中跨过64字节边界时,地址会回到当前页开头,后续数据因此覆盖页首,而不会顺延到下一页。正确处理是按当前页剩余空间拆分,每段发出STOP后等待器件就绪,再写下一段;不能只限制单次长度不超过64字节。以下以24LC256-I/P为例说明。

一 只写4字节也可能跨页

24LC256的第一页是0x0000~0x003F,下一页从0x0040开始。页写时,页内地址的低6位递增,跨过页尾后回到本页开头,页地址不会自动进入下一页。

假设写保护已解除、传输及内部写周期正常,从0x003E开始,在同一次页写中连续发送0x11、0x22、0x33、0x44,结果如下。这里均指EEPROM内部存储地址,不是I²C器件地址。

数据 实际写入地址 原本期望地址
0x11 0x003E 0x003E
0x22 0x003F 0x003F
0x33 0x0000 0x0040
0x44 0x0001 0x0041

因此,0x0000与0x0001处的旧数据会被覆盖。问题不是总容量不够,而是起点距页尾只剩2字节;即使这次只发送4字节,也已经越界。

二 每段长度按当前页剩余空间计算

写入前先确认起始地址和总长度未越过0x0000~0x7FFF的有效存储范围。拆页时再算“页内剩余空间=64-当前地址对64取余”,再取剩余待写数据量、页内剩余空间和驱动数据载荷上限中的最小值。若驱动缓冲区还存放地址字节,要先扣除其占用,不能把缓冲区容量直接当作数据长度。

上述4字节应分两段:先从0x003E写入0x11、0x22,发STOP并等待就绪;再从0x0040写入0x33、0x44,再次发STOP并等待就绪。每段都应重新发送对应的内部起始地址,不能只在软件变量里增加地址。

验证时选允许改写的测试区域,记录写前内容,再同时核对目标地址和原页页首。这样既能发现数据没有写到下一页,也能发现别处旧数据被改写;只检查写函数返回值容易漏掉后者。

三 收到传输ACK不等于数据已写好

页写的数据先进入页缓冲区,STOP才启动内部写周期;总线发送结束不能直接视为写入完成。内部写周期期间,器件不会应答新的访问。

可采用ACK轮询:在写操作的STOP之后,发送START和写方向控制字节,即R/W=0,检查器件是否应答。忙时重新发起检测,收到ACK后再进行下一次读写;持续无应答时应按超时处理,并排查寻址、连接等问题,不能无限等待。

轮询ACK表示器件可以继续访问,不代替写后读回校验。正确顺序应是分段写入、等待就绪、读取目标地址并逐字节比对;页边界处理与写后等待需要分别检查。

准备续采或调整参数存储方案时,先确认完整料号、封装和现用驱动的页写处理。把需求数量、目标交期及需要复核的存储条件整理进BOM,方便沟通物料选择。需要核对24LC256-I/P或候选型号时,可通过晟雅泰官网询价入口提交需求。

常见问题 FAQ

页写必须从64字节对齐的地址开始吗?

不必。可以从页内任意地址开始,但本次数据不能越过该页末尾;起点不对齐时,本次页写的最大数据长度小于64字节。

连续读也要每64字节拆一次吗?

不需要按页写规则拆分。顺序读可以从0x003F继续读到0x0040,但仍受主控接收缓冲区和器件总地址范围限制。

改成逐字节写,还需要等待吗?

需要。字节写同样在STOP后启动内部写周期,每次写后仍须等待就绪;它只能简化页边界处理,不能省掉写后等待。

为什么总线有ACK,数据却完全没变?

应检查WP写保护。24LC256在WP为高时仍可应答写命令,但不会执行写入;ACK本身不能证明内容已更新,也不能排除其他通信或读址问题。

一次调用写入函数,就是一次页写吗?

不一定。驱动可能自动拆包,也可能原样发送,应检查其实现或抓取总线上的起始地址、数据长度和STOP,确认实际事务没有跨页。

相关品牌 Related Brands

相关阅读 Related Articles

← 返回技术资讯列表 All Insights