1)Linux 平台I2C多字节数据按页连续读写E2PROM之AT24C16小知识,分享给将要学习或者正在学习Linux平台I2C多字节按页连续读写E2PROM开发的同学。
2)内容属于原创,若转载,请说明出处。
3)提供相关问题有偿答疑和支持。
我测试使用的是 E2PROM(AT24C16)芯片,其中内部地址是1010 外部的地址(A0~A2)是接地000,因此实际测试的时候需要将地址右移一位:0x50,先使用i2c的测试工具来dump下数据:
下面来测试一次性写5字节数据:从0地址开始(源码1)
实际测试当一次性向0地址发送超过16字节的时候,就会覆盖前面的地址数据:
因此对于E2PROM可能一次性最大的写地址数据长度值16字节,超过16字节需要换地址;下面是改进的写,写全部的寄存货器地址:(源码2)
如下是测试写完以后读取数据:
读数据发现和写数据不一样,读数据可以连续读:(源码3)
疑问:当一次性向0地址发送超过16字节的时候,就会覆盖前面的地址数据,为什么?
首先以上的Demo本身支持一次性发送多个字节,但是由于E2PROM的原因限制,一次最多可以发送16字节,为什么呢?下面看下E2PROM的数据手册,我是用测试的AT24C16:
手册上说AT24C16支持字节写和页写模式:字节写就是一个地址一个数据的写;页写是连续写数据,一个地址多个数据的写,但是页写不能自动跨页,如果超出一页长度,超出的数据会覆盖原先写入的数据。
一页最多写16字节:
因此以上源码需要修改,使用每当16字节写完,需要换页才可以正确的写。完整源码已经附在主页有链接。