我很确定这是我犯的一个小错误,但我无法弄清楚。我试图通过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() {
}
我在做什么错?我仔细检查了接线和写保护,所以必须是代码。
谢谢。
答案 0 :(得分:2)
我在这里看到了几个问题:
我未连接所有E引脚
如数据表第8页所述,“这些输入必须绑定到V CC 或V SS ”。不建议让它们浮动。
The Arduino Wire
library使用7位I 2 C地址。如果所有E引脚都接地,则在此上下文中用于此部件的正确地址将是0x50
(1010000
二进制)。您无需使用单独的地址进行读写-库的最后一位是由库推断出来的。
正如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() {
}