0
我正在试验通过I2C写入EEPROM。阅读顺利,我获得了极好的吞吐量。但是,当我尝试写入设备时,Arduino停止响应,我必须重置它才能使其再次工作。写入I2C后,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
“写I2C”总是给出相同的值,并它似乎总是直接撞上。
与您的问题无关,但'wrBuf'是一个指针,这意味着您应该使用['(s)printf'](http://en.cppreference.com/w/c/io/fprintf)格式' “%p”'。使用不匹配的格式说明符和参数类型会导致*未定义的行为*。此外,编译器和标准库的所有作用域中都保留以下划线开头且后跟大写字母的符号。不要自己定义这些符号,即使是预处理器宏。 –
什么是您的EEPROM芯片类型?它是一个字节还是两个字节的地址集成电路?你的代码只处理一个字节的地址。可能是造成这个问题。或者,正如已经指出的那样,这个问题可能与滥用'sprintf'函数有关。 – putu
注意这些eeproms需要总是命令“写入启用”,然后是真正的写入,然后是命令“写入禁止” – Yoan