我很确定这是我犯的一个小错误,但我无法弄清楚。我正在尝试通过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() {
}
我做错了什么?我仔细检查了接线和写保护,所以它一定是代码。
提前谢谢。
我在这里看到了几个问题:
-
我让所有 E 引脚未连接
如数据表第8页所述,"这些输入必须连接到VCC或VSS"。不建议让它们浮动。
-
Arduino
Wire
库使用 7 位 I2C 地址。如果所有E引脚都接地,则在此上下文中用于该器件的正确地址将是0x50
(1010000
二进制(。您不需要使用单独的地址进行读写 - 最后一位由库推断。 -
正如user3629249(什么名字!(所指出的,~WC引脚必须拉低以允许写入。
关于您的陈述:我将/WC 引脚接地,因此它没有写保护
给定EEPROM规格表图8,在写入EEPROM期间/WC必须很高。在此之前,(如您所述(/WC 较低,不会将任何内容写入芯片。
您的代码确实需要注意EEPROM在每个写入的字节之间传输的ack位。在收到ACK位(通过您的代码(之前,EEPROM尚未准备好接收另一个数据字节。根据规格表,在代码完全传输数据字节后,这可能长达 5 毫秒
通常,未连接的引脚会"浮动" 您无法确定它们是否会"浮动"得很低。 因此,可以肯定的是,E2 E1 和 E0 应该接地
建议将/WC
绑定到 arduino 上的一个输出引脚,并编写代码以正确处理该引脚值
允许的最长写入(和读取(序列是 64 字节(都在同一个"页面"内(,因此您的代码应该考虑到这一点
我想出了如何让它工作,如果将来有人遇到类似的问题,我会发布代码:
#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() {
}