You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:10:25