复位 I2C 总线¶

许多串行 EEPROM 使用 I2C 总线(也称为"两线总线")。例如,一块网卡可能包含一个小型(256 字节)I2C 串行 EEPROM,如 Atmel AT24C02,其中保存着网卡的 MAC 地址。驱动程序必须从 EEPROM 中读取,才能找到网卡的正确 MAC 地址。
I2C 总线由两根线组成:SCL(串行时钟)和 SDA(串行数据)。SDA 线是双向的:它既用于向 EEPROM 传输数据(例如要读取的地址),也用于从 EEPROM 读出数据。这采用"开漏"电路:SDA 线的任一端都能把 SDA 线拉低(即产生逻辑"0"),如果两端都不主动把 SDA 线拉低,它就会浮空为高电平(即为逻辑"1")。这使得数据可以沿任一方向传输。
I2C 设备通常物理尺寸很小,因此引脚数量极少。它们通常没有单独的复位引脚。这意味着正常的系统复位不会复位 I2C 设备。如果系统在从串行 EEPROM 读取数据的中途被复位,这可能会产生问题。串行 EEPROM 可能会停留在期望继续在 SDA 线上发送数据的状态。驱动程序必须找到一种方法把串行 EEPROM 复位回空闲状态。
iPXE 中执行此复位的代码可以在函数 i2c_reset() 中找到。
- 解释
i2c_reset()中的代码在做什么,以及它如何设法复位 I2C 总线。
我们预计每个人在理解这段代码时都需要寻求帮助,而且我们希望看到你如何与潜在的导师互动,所以请随意提出尽可能多的问题。我们当然不指望你能靠自己理解并解释这段代码!