c - 无法使用 I2C 和 Arduino 写入 M24256 EEPROM
问题描述
我很确定这是我犯的一个小错误,但我无法弄清楚。我正在尝试通过 I2C 协议将M24256 EEPROM与 Arduino Mega2560 一起使用。数据表指出地址是 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 页所述,“这些输入必须连接到 V CC或 V SS ”。不建议让它们漂浮。
Arduino
Wire
库使用 7 位 I 2 C 地址。如果所有 E 引脚都接地,则在此上下文中用于此部分的正确地址将是0x50
(1010000
二进制)。您不需要使用单独的地址进行读写 - 最后一位由库推断。正如用户 3629249(多么好的名字!)所指出的,~WC 引脚必须拉低才能允许写入。
推荐阅读
- java - 当我在另一台计算机上执行应用程序时出现 BigDecimal NumberFormatException
- html - Safari 选项值是空白的,但不是 chrome
- python-3.x - Python 3:如何重新排序嵌套列表的子列表?
- php - 503 服务不可用(长时间运行的 MySQL 查询)
- twig - 使用 craftcms 的 Twig 表问题
- javascript - 使用 Cypress 登录 WordPress,无需使用 UI
- python - 如何将函数 scipy.sparse.linalg.eigs 集成到张量流图中?
- javascript - 在 discord.js 中,我如何创建一个命令来显示已标记用户的头像,或者如果未标记 - 我的头像?
- python - 如何在 VSCode 中包含特定的 Anaconda python 包
- java - 我的 Minecraft Spigot 插件没有报告回来