鉴于I2C的项目还是很多,所以又多做了一个试验。
1 环境说明
主控还是树莓派Pico。eeprom用的是之前买的AT24C02。 软件环境还是老朋友micropython。
接线是这样接的。
24C02 Pin | Pico Pin |
---|---|
VCC | 3.3V |
GND | GND |
SDA | GP16 |
SCL | GP17 |
2 代码
代码如下:
from machine import Pin, I2C
import time# 初始化I2C接口 (GP0 - SDA, GP1 - SCL)
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)# EEPROM的I2C地址,一般为0x50
EEPROM_I2C_ADDRESS = 0x50def eeprom_write(address, data):"""向EEPROM的指定地址写入数据。:param address: EEPROM地址:param data: 要写入的字节数据(一个字节)"""if not 0 <= address <= 255:raise ValueError("地址超出范围")# 发送地址和数据i2c.writeto(EEPROM_I2C_ADDRESS, bytearray([address, data]))# 等待写入完成time.sleep(0.01)# 示例:将数据0xAB写入地址0x10
eeprom_write(0x10, 0xAB)def eeprom_read(address):"""从EEPROM的指定地址读取数据。:param address: EEPROM地址:return: 读取到的数据字节"""if not 0 <= address <= 255:raise ValueError("地址超出范围")# 发送要读取的地址i2c.writeto(EEPROM_I2C_ADDRESS, bytearray([address]))# 读取一个字节的数据data = i2c.readfrom(EEPROM_I2C_ADDRESS, 1)return data[0]# 示例:从地址0x10读取数据
read_data = eeprom_read(0x10)
print("读取到的数据: ", hex(read_data))
注释写的很好,这里就不多解释了。。
3 波形分析
抓到的波形和命令。
1 eeprom_write(0x10, 0xAB)
可以看到。
开始和结束略过。。。
第一段就是1010 0000,第一段比较特殊,地址是7位,所以是101 0000,就是0x50,也就是24C02的设备地址,这个一般是厂商就设置好的。然后是读写位,1是读0是写,这里就是写。最后面跟了一个拉高的ACK。
第二段是0001 0000。这里就是0x10,表明写在地址0x10。
第三段是1010 1011。就是AB,表示将AB写进去。
稍微特别的是好像第二个byte之后,不管是时钟还是数据线,都有点紊乱。虽然不影响结果,还是有点怪。。。
2 read_data = eeprom_read(0x10)
读的操作要麻烦一些,有4个byte。首先写入地址,再去读。可以看到,这里读写区分很严格,读就是读,写就是写。
首先还是地址,1010 0000。和上面一模一样,不多解释了。
第二个就是写地址,0001 0000,和上面也是一样。
然后是读取的命令,1010 0001,地址还是0x50,但是读写位变成了1,也就是要读了。
最后是eeprom返回的数据,1010 1011,就是0xAB。
4 小结
看看AT24C02这个芯片。
还是来自于美的的Atmel,24C02可以提供2Kb(256字节)的存储容量。存储器按字节进行组织,每个字节可以独立读写。每次写入操作的时间通常在5ms到10ms之间。
试了一下随机读取,原始的数据都是0xFF。
2K就是256*8。也就是说地址范围是0到FF。按照一个汉字两个字节,这个芯片也就是能存1000字的文章,差不多一篇高考作文。。。确实只能存储一些参数和配置的信息。
不过用来存储一些个人秘密信息还是很nice。你自己的一些绝密信息存进去,我敢说99.99%的人是没法读出来的。。。
5 对比flash
最后看看eeprom和flash的区别:
存储单元操作 | 按字节(Byte)擦除和写入 | 按块(Block)擦除,按字节/页写入 |
擦除方式 | 单字节擦除 | 整块擦除 |
写入方式 | 单字节写入 | 通常按页写入(如256字节) |
读写速度 | 写入速度较慢,通常5ms到10ms/字节 | 写入速度较快,通常几十微秒到几毫秒/页 |
擦除速度 | 无需整体擦除,擦除时间按字节计算 | 擦除速度较慢,通常几毫秒到几百毫秒/块 |
使用寿命 | 100,000到1,000,000次擦写 | 100,000次擦写 |
存储容量 | 通常较小(几Kb到几Mb) | 通常较大(几Mb到几Gb) |
功耗 | 较低 | 较高 |
应用场景 | 配置数据、小数据块存储、频繁更新的数据 | 大容量数据存储,如固态硬盘、嵌入式存储等 |
数据保持时间 | 通常为10年以上 | 通常为10年以上 |
工作电压 | 1.8V到5.5V | 2.7V到3.6V 或 1.8V到3.6V |
擦除单位 | 单字节 | 单块(如4KB, 64KB, 128KB等) |
flash的速度快,一般起码就得用SPI了。。