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