Ich experimentiere gerade mit dem Schreiben in EEPROMs über I2C. Lesen geht gut und ich bekomme einen hervorragenden Durchsatz. Wenn ich jedoch versuche, auf das Gerät zu schreiben, reagiert das Arduino nicht mehr, und ich muss es zurücksetzen, damit es wieder funktioniert.Arduino reagiert nicht mehr nach dem Schreiben auf I2C
Der I2C-Schreibvorgang erscheint auch nicht in meinem I2C-Debugger.
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
}
Ich bin ziemlich unsicher, was ich falsch mache. Ich erhalte die folgende Ausgabe über die serielle Verbindung:
Write-Request empfangen: Andy
Um i2c Schreiben: 0xa800fd98
"Writing to i2c" immer gibt den gleichen Wert, und es scheint immer direkt danach zu stürzen.
Nicht verwandt mit Ihrer Frage, aber 'wrBuf' ist ein Zeiger, was bedeutet, dass Sie das [' (s printf]] (http://en.cppreference.com/w/c/io/fprintf) Format verwenden sollten '"% p "'. Die Verwendung von nicht übereinstimmendem Formatbezeichner und Argumenttyp führt zu * undefiniertem Verhalten *. Darüber hinaus sind Symbole, die mit einem Unterstrich gefolgt von einem Großbuchstaben beginnen, in allen Bereichen für den Compiler und die Standardbibliothek reserviert. Definieren Sie solche Symbole nicht selbst als Präprozessormakros. –
Was ist Ihr EEPROM-Chip-Typ? Ist es ein Byte oder zwei Byte Adresse IC? Ihr Code behandelt nur eine Byteadresse. Wahrscheinlich, dass das Problem verursacht. Oder, wie bereits erwähnt, könnte das Problem mit der missbräuchlichen Verwendung der Sprintfunktion zusammenhängen. – putu
Achten Sie darauf, dass diese Eeproms immer den Befehl "write enable" gefolgt von dem eigentlichen Schreiben gefolgt von dem Befehl "write disable" haben. – Yoan