用SPI写入外部EEPROM

时间:2013-05-31 19:17:53

标签: arduino i2c spi eeprom

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

根据this webpage,我的SCK连接到引脚13,我的SDA连接到引脚11。

我有两个功能,i2c_eeprom_write_bytei2c_eeprom_read_byte,取自this example

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发送任何内容。

如何从从属设备读取?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

小心你的调试方式。此

delay(10);
对于以100 kbit / s(或更快)运行的设备,您添加了巨大时间。延迟可能会干扰通信,因为它可以帮助您进行调试。您没有提及该设备,但确认它是否能够容忍那么大的暂停。写入存储器可能需要一段时间才能完成,但与100 kHz时钟速率相比,读取几乎是即时的。

同样,在交易中间添加它

 println(...

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

如果你有一个示波器,我可以提供的唯一技巧是用一个电阻分压器对取代一个上拉电阻,将SDA和SCL拉至逻辑1但不等于Vcc(5 V)案件?)。例如,选择一对电阻将线路保持在4.8 V。通过这种安排,您可以分辨出没有驱动总线的设备与驱动逻辑1的设备之间的区别。