1. at24c02基本介绍

1.1. 主要规格

  • 容量:256byte
  • 最大速率:100KHz(1.8V)或400KHz(2.7V,5V)
  • 支持随机读写和顺序读写
  • 页写延迟5ms

1.2. 主要注意事项

1.2.1. i2c地址

由于at24系列支持通过上下拉部分针脚来有限的修改芯片的i2c地址,具体与芯片容量有关,如下:

容量(bit) 地址格式
1K/2K 0x50 + A2 + A1 + A0
4K 0x50 + A2 + A1 + P0
8K 0x50 + A2 + P1 + P0
16K 0x50 + P2 + P1 + P0

其中:
A2、A1、A0属于芯片外部的物理引脚,通过接GND或Vcc来改变芯片地址。以at24c02为例,当A2、A1、A0均接地则i2c地址为0x50,如都接Vcc则地址为0x57。

P2、P1、P0属于芯片内部的逻辑寄存器地址的一部分,只不过为了增加寻址范围同时维持8bit访问,将高位地址放到i2c器件地址段了。对于大于2Kbit容量的芯片,可认为由多个2Kbit的芯片叠加组合而成的单颗芯片。在访问时可将其逻辑的分为多个i2c设备。以容量4Kbit芯片为例,且A2、A1接地,当访问设备地址0x50时,访问的是低2Kbit的内容;当访问设备地址0x51时,访问的是高2Kbit的内容。


tips:

由于硬件将at24c02的A2、A1、A0接地了,因此at24c02的地址为0x50,同时将at24c02接到CPU的第二路i2c控制器下了。后续如有类似问题不再赘述。

1.2.2. 页与写翻转

at24c02的随机读写模式总是需要发送地址和1byte的数据。为提高读写速度,at24c02也支持连续读写,即,当需要连续读或者写某一地址可以直接发送或接收数据而无需在过程中重新发送地址。

但,at24c02的读和写是有区别的,当为写时每次连续写到页尾部时,如不处理换页则会将后续的数据覆盖写到当前页的头部,换页的意思就是重新发起一次标准写操作,在此期间需要重新发送正确的地址。

不过,读则没有这个问题,at24c02可以从0地址一直读到0xFF,而不需要担心换页问题。


tips:

页大小与具体芯片信号有关,通常容量小于2Kbit为8byte,否则为16byte。经实测at24c02的页大小为16byte,这可能是特殊型号的2Kbit芯片。

1.2.3. 写等待

每次写到页尾部时都需要等待一段时间,让芯片内部将缓存的数据写到ROM中固化。通常这段时间为5ms,在此期间at24c02不响应外部操作。


1.3. 体验at24c02

在linux下可使用i2c-tool在命令行下操作i2c。


1.3.1. at24c02探测

由于已知at24c02第二组i2c控制器下,可使用如下命令查看是否能够探测到at24c02的存在。

# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

如上,成功找到设备地址为0x50的i2c的芯片,同时该控制器下只有一个i2c芯片,那当然是at24c02了。


1.3.2. at24c02写入

可使用i2cset写入数据到at24c02,如下在0x10地址写入1,在0x20地址写入2。

# i2cset -y 1 0x50 0x10 1 b
# i2cset -y 1 0x50 0x20 2 b

1.3.2. at24c02读出

可使用i2cget从at24c02读取数据,如下将0x10地址、0x20地址数据读出。

# i2cget -y 1 0x50 0x10
0x01
# i2cget -y 1 0x50 0x20
0x02
#

1.3.3. at24c02 dump功能

可使用i2cdump将at24c02所有数据dump出来,调试利器。

# i2cdump -y 1 0x50 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
10: 01 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ?...............
20: 02 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ?...............
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................

如上,可以清晰的看到上文写入的两个值的位置和内容。


1.3.4. at24c02连续写

可使用i2ctransfer向at24c02写入连续数据,例如需要上文将第二、三行数据全部改回0xFF命令如下。

# i2ctransfer -y 1 w32@0x50 0x10 0xff=
# i2cdump -y 1 0x50 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
20: 02 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ?...............
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................

如上,当使用i2ctransfer试图清除掉第二、三行数据时,仅第二行清除成功。此现象足以说明at24c02的页机制是存在的。


tips:

需要清除多行数据需要执行多次i2ctransfer将对应行数据清除。

1.4. 小结

at24c02在使用时有如下几点需要注意:

  • 页写延迟5ms;
  • 当顺序写时,需要考虑跨页问题。

email:MingruiZhou@outlook.com



MingruiZhou
13 声望2 粉丝

linux内核从业者,略懂内存管理、进程调度以及驱动框架。