【发布时间】:2017-06-06 09:55:06
【问题描述】:
我目前正在尝试通过 I2C 写入 EEPROM。阅读顺利,我获得了出色的吞吐量。但是,当我尝试写入设备时,Arduino 停止响应,我必须重置它才能让它再次工作。
I2C 写入也没有显示在我的 I2C 调试器中。
void i2cWrite(unsigned char device, unsigned char memory, const char *wrBuf, unsigned short len) {
int i = 0;
ushort bytesWritten = 0;
ushort _memstart = memory;
ushort blockSize = 4;
#ifdef DEBUG_MSGS
char serialBuf[255] = { '\0'};
Serial.print("Writing To i2c: ");
sprintf(serialBuf, "%p", wrBuf);
Serial.println(serialBuf);
#endif //DEBUG_MSGS
while (bytesWritten < len) {
Wire.beginTransmission((int)device);
Wire.write((unsigned char)_memstart);
for (int j = 0; i < blockSize; j++) {
Wire.write(wrBuf[bytesWritten + j]);
}
Wire.endTransmission();
bytesWritten += blockSize;
_memstart += blockSize;
delay(25);
}
#ifdef DEBUG_MSGS
Serial.println("\mDone writing.");
#endif //DEBUG_MSGS
}
我很不确定自己做错了什么。我通过串行连接得到以下输出:
收到写请求:安迪
写入 i2c:0xa800fd98
“Writing to i2c”总是给出相同的值,而且它似乎总是在之后立即崩溃。
【问题讨论】:
-
与您的问题无关,但
wrBuf是一个指针,这意味着您应该使用(s)printf格式"%p"。使用不匹配的格式说明符和参数类型会导致未定义的行为。此外,以下划线后跟大写字母的符号在编译器和标准库的所有范围内都保留。不要自己定义这样的符号,即使作为预处理器宏。 -
你的 EEPROM 芯片类型是什么?是一个字节还是两个字节地址IC?您的代码仅处理一个字节地址。可能是导致问题的原因。或者,正如已经指出的,问题可能与滥用
sprintf函数有关。 -
请注意,这些 eeprom 始终需要命令“write enable”,然后是真正的写入,然后是命令“write disable”
-
Eeprom 芯片采用 7 位地址,这应该是一个透明的接口。调用该函数的代码中先写了eeprom密码