无法使用I2C和Arduino写入M24256 EEPROM

时间:2019-08-07 21:46:11

标签: c arduino i2c eeprom

我很确定这是我犯的一个小错误,但我无法弄清楚。我试图通过I2C协议在Arduino Mega2560上使用M24256 EEPROM。数据表指出该地址为1010(E2)(E1)(E0)(R / W)。我将所有E引脚都保持未连接状态,这意味着用于写入的应该为A0,而用于读取的应该为A1。我将/ WC引脚接地,因此没有写保护。我用I2C扫描仪草图检查了该设备,由于某种原因,它被视为0x50。我可以使用任何地址(尝试使用0x50、0xA1和一些随机地址)从中读取内容,但每次都得到默认的0xFF作为回读,但我却无法写入它,这很奇怪。

我尝试的代码:

#define memoryRead 0xA0
#define memoryWrite 0xA1
byte in=0x00;

#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Serial.println("writing");
  for(int i=0;i<100;i++){
    Wire.beginTransmission(memoryWrite);
    Wire.write(byte(i >> 8));  // first the MSB (8-bits)
    Wire.write(byte(i)); 
    Wire.write(byte(i));
    Wire.endTransmission();
  }
  Serial.println("reading");

  Wire.beginTransmission(memoryWrite); //this should be resetting the pointer //to 0 if I got it well from the datasheet
  Wire.write(0x00);
  Wire.write(0x00);
  Wire.beginTransmission(memoryRead);
  for(int i=0;i<100;i++){
    in=Wire.read();
    Serial.println(in,HEX);

  }
  Wire.endTransmission();
  Serial.println("done");
}

void loop() {
}

我在做什么错?我仔细检查了接线和写保护,所以必须是代码。

谢谢。

3 个答案:

答案 0 :(得分:2)

我在这里看到了几个问题:

  1.   

    我未连接所有E引脚

    如数据表第8页所述,“这些输入必须绑定到V CC 或V SS ”。不建议让它们浮动。

  2. The Arduino Wire library使用7位I 2 C地址。如果所有E引脚都接地,则在此上下文中用于此部件的正确地址将是0x501010000二进制)。您无需使用单独的地址进行读写-库的最后一位是由库推断出来的。

  3. 正如user3629249(名称!)所指出的那样,必须将引脚拉至低电平以允许写入。

答案 1 :(得分:1)

关于您的陈述:我将/ WC引脚接地,因此没有写保护

鉴于EEPROM SPEC SHEET图8,在写入EEPROM期间/ WC必须为高。因此,(如您所述)/ WC低,因此不会将任何内容写入芯片。

您的代码确实需要注意EEPROM在写入的每个字节之间传输的ack位。直到收到ACK位(通过您的代码),EEPROM才准备好接收另一个字节的数据。根据规格表,这可能会在您的代码完全传输完数据字节后的5毫秒之内。

通常,未连接的引脚将“浮空”。您无法确定它们将“浮空”为低电平。因此,可以肯定的是,E2 E1和E0应该接地

建议将/WC与arduino上的一个输出引脚绑定,并编写代码以正确处理该引脚值

允许的最长写入(和读取)序列为64字节(均在同一“页面”内),因此您的代码应将其考虑在内

答案 2 :(得分:0)

我想出了如何使它正常工作,如果将来有人遇到类似问题,我会发布代码:

#define memoryAddr 0x50
byte in=0x00;

#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Serial.println("writing");

  Wire.beginTransmission(memoryAddr);
  Wire.write(0x00);  // first the MSB (8-bits)
  Wire.write(0x00);
  delay(10); 
  Wire.write(0x00); //data
  Wire.endTransmission();

  delay(10);
  Serial.println("reading");

  Wire.beginTransmission(memoryAddr); //writing the address to be read
  Wire.write(0x00);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(10);
  Wire.beginTransmission(memoryAddr);
  Wire.requestFrom(memoryAddr,10,true);
  while(Wire.available()){
    in=Wire.read();
    Serial.println(in,HEX);

  }
  Wire.endTransmission();
  Serial.println("Done");
}

void loop() {
}