Linux:写入i2c/SMBus

Linux:写入i2c/SMBus,linux,driver,i2c,eeprom,smbus,Linux,Driver,I2c,Eeprom,Smbus,我在使用英特尔阿波罗湖处理器的Linux系统上遇到i2c/SMBus问题。我正在尝试从EEPROM读/写,但我面临一些问题。我的EEPROM位于地址0x56,我可以用逻辑分析仪观察总线 当我尝试通过i2ctools(i2cget)从设备读取数据时,系统的行为与预期一致。例如,当我试图通过i2cset执行写入命令时,就会出现问题i2cset以错误结束(写入失败)。因为我可以用电来观察巴士,所以我也可以说所有的线路都很高,巴士没有被触碰。我能够激活i2c驱动程序中的dev_dbg()函数i2c_i8

我在使用英特尔阿波罗湖处理器的Linux系统上遇到i2c/SMBus问题。我正在尝试从EEPROM读/写,但我面临一些问题。我的EEPROM位于地址0x56,我可以用逻辑分析仪观察总线

当我尝试通过i2ctools
i2cget
)从设备读取数据时,系统的行为与预期一致。例如,当我试图通过
i2cset
执行写入命令时,就会出现问题<代码>i2cset以错误结束(写入失败)。因为我可以用电来观察巴士,所以我也可以说所有的线路都很高,巴士没有被触碰。我能够激活i2c驱动程序中的
dev_dbg()
函数i2c_i801,当我执行
i2cset
时,我能够找到(dmesg)调试消息:

[  765.095591] [2753] i2c_i801:i801_check_post:433: i801_smbus 0000:00:1f.1: No response
当使用smbus2lib运行我的最小I²C Python代码时,我得到以下错误消息和上述调试消息:

[  765.095591] [2753] i2c_i801:i801_check_post:433: i801_smbus 0000:00:1f.1: No response
从smbus2导入SMBus
总线=SMBus(0)

b=bus.read_byte_data(86,10)#看来我找到了问题的原因。在这篇文章中,我们描述了英特尔在SMBus控制器上更改了一个配置位

好吧,我知道发生了什么事

从8系列/C220芯片组开始,英特尔推出了新的 寄存器HOSC(PCI)中SMBus控制器的配置位 D31:F3地址偏移量40h):

第4位SPD写入禁用-R/WO。 0=SPD写入已启用。 1=SPD写禁用。写入SMBus地址50h-57h的时间为 残疾人

配置中的这种记录不良的更改解释了这些问题

一个挑战是,要应用和启用对SPD写入位的更改,系统需要重新启动。不幸的是,重新启动BIOS时会将位更改回默认值。唯一的解决方案似乎是在BIOS中进行自适应


对我来说,这个问题已经解决了。我只是想分享这些信息,以防有人遇到同样的问题。

有些库希望使用8位地址而不是7位地址。检查是否可以处理0xa6(读取)和0xa7(写入)。也请阅读数据表中的EEPROM。它们可能具有不同的数据宽度组织。在这种情况下,每次访问可能需要写入/读取两个字节。当我写入某个地址时,库的行为与预期的一样,除了提到的地址空间格式0x50到0x57。我的猜测是,某些驱动程序或操作系统(Linux Ubuntu)正在锁定用户空间,使其无法写入此地址空间。事实上,大EEPROM的内存寻址是用高字节和低字节处理的,但这不是我的问题。我可以用我的逻辑分析仪检查I2C总线上的操作,并可以确保在写入禁止的地址空间(0x50-0x57)时没有执行任何操作。