树莓派Python驱动M24512 EEPROM异常,不符官方GitHub文档预期
解决M24512 EEPROM通过SMBus无法正常读写的问题
我看你在折腾M24512 EEPROM的SMBus读写时遇到了问题,帮你揪出代码里的几个关键错误,顺便给你修正后的版本:
你的代码里的核心问题
- 地址格式错误:M24512是16位寻址的EEPROM,但你在
write_i2c_block_data里传了[0x0001, 30]——0x0001是16位值,而SMBus的块数据每个元素必须是8位字节。正确的做法是把16位地址拆成高8位和低8位两个独立字节。 - 读操作流程错误:你直接调用
read_byte之前,没有先向EEPROM发送要读取的目标地址。M24512需要先接收读取地址指令,才能返回对应位置的数据。 write_i2c_block_data参数误用:这个函数的第二个参数是发送的第一个字节(对应M24512的地址高字节),第三个参数是后续的数据字节(地址低字节 + 要写入的实际数据)。
修正后的完整代码
import smbus import time # 初始化SMBus,对应树莓派的i2c-1总线 bus = smbus.SMBus(1) # EEPROM的I2C地址(十进制80 = 十六进制0x50,和你i2cdetect检测的一致) EEPROM_ADDR = 0x50 time.sleep(0.5) # 写入操作:向地址0x0001写入数据30 print('Write 30 to address 0x0001') # 拆分16位地址:高字节0x00,低字节0x01 # 调用逻辑:从机地址 → 地址高字节 → [地址低字节, 要写入的数据] bus.write_i2c_block_data(EEPROM_ADDR, 0x00, [0x01, 30]) # EEPROM写入需要内部存储时间,必须等待(官方最大写周期5ms,留0.1s足够) time.sleep(0.1) # 读取地址0x0001的数据 print('Read from address 0x0001') # 先发送要读取的地址:通过写操作传递高字节+低字节 bus.write_i2c_block_data(EEPROM_ADDR, 0x00, [0x01]) time.sleep(0.01) # 发起读操作获取1字节数据 data1 = bus.read_byte(EEPROM_ADDR) print(f'Read 1: {data1}') # 读取地址0x0002的数据 print('Read from address 0x0002') bus.write_i2c_block_data(EEPROM_ADDR, 0x00, [0x02]) time.sleep(0.01) data2 = bus.read_byte(EEPROM_ADDR) print(f'Read 2: {data2}')
额外注意事项
- 写周期等待:EEPROM在写入指令后,需要一定时间完成内部的存储操作,必须等待至少官方规格的写周期时间(M24512是最大5ms),否则会导致读写失败或数据错误。
- 地址范围:M24512是128Kbit(即16KByte)的EEPROM,有效地址范围是
0x0000到0x3FFF,不要超出这个范围操作。 - 硬件验证:你用
i2cdetect -y 1检测到0x50地址,说明硬件连接(电源、SDA/SCL线)是正常的,问题完全出在软件流程上。
内容的提问来源于stack exchange,提问作者Superman
相关产品推荐
相关产品推荐

