2

我正在尝试写入一个单独的设备的 EEPROM 以配置该设备的行为,并使用 Arduino Uno 控制该设备。

根据这个网页,我的 SCK 连接到引脚 13,我的 SDA 连接到引脚 11。

我有两个函数,i2c_eeprom_write_bytei2c_eeprom_read_byte,取自这个例子

void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
    Wire.begin(deviceaddress); // MUST INCLUDE, otherwise Wire.endTransmission hangs
    // called once, in setup
    int rdata = data;
    Wire.beginTransmission(deviceaddress);

    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB    
    Wire.write(rdata);

    Wire.endTransmission(false);

}
byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
    byte rdata = 0xFF;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    delay(10);
    Wire.requestFrom(deviceaddress,1);


    int avail = Wire.available();
    Serial.println(avail);
    if (Wire.available()) rdata = Wire.read();

    // there's a bug here with Wire.available. It's returning 0 (ie, 0 bytes to be read),
    // when it should be returning 1, since I want 1 byte.

    return rdata;
}

我的问题是它Wire.available()总是返回 0,这意味着从设备没有向主设备 Arduino 发送任何内容。

如何从从设备读取数据?

4

2 回答 2

2

看起来您正在使用 I2C 库写入 SPI 设备 - 它们不一样!大多数外部 EEPROM 使用 I2C(使用 Uno 上的引脚 4 和 5)。

于 2013-07-02T18:57:30.660 回答
0

在没有示波器或逻辑分析仪的情况下调试硬件将是一个挑战。

一个简单的双重检查是确认地址引脚已连接以配置您编码的地址。如果幸运的话,您只需找到错误的地址,修复它,一切就开始工作了。

请注意您的调试方式。这个

delay(10);

对于以 100 kbit/s(或更快)运行的设备来说,您添加的时间很长。延迟可能会干扰通信,因为它可以帮助您进行调试。你没有提到设备,但确认它是否可以容忍那么大的停顿。写入内存可能需要时间来执行,但与 100 kHz 时钟速率相比,读取几乎是即时的。

同样,在事务中间添加这个

 println(...

可能是问题的一部分。如果您有默认 9600 波特的串行,则传输该字符将中断 I2C 事务。

如果您有示波器,我可以提供的唯一技巧是用电阻分压器对替换上拉电阻器,该电阻分压器将 SDA 和 SCL 拉至逻辑 1 的电压,但不等于 Vcc(在您的情况下为 5 V?) . 例如,选择一对将线路保持在 4.8 V 的电阻器。通过这种布置,您可以区分没有驱动总线的设备和驱动逻辑 1 的设备。

于 2013-06-01T06:51:44.103 回答