2017-06-06 2 views
0

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.

I2c Debug trace

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.

+0

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. –

+0

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

+0

Achten Sie darauf, dass diese Eeproms immer den Befehl "write enable" gefolgt von dem eigentlichen Schreiben gefolgt von dem Befehl "write disable" haben. – Yoan

Antwort

0

schien der Fehler in der Schleife angeordnet werden, da der Ausgang

Write Request Received: Andy 
Writing To i2c: 0xa800fd98 

I'm working here 
I wrote the memory adress 
I wrote a byte of data 
I wrote a byte of data 
I wrote a byte of data 
I wrote a byte of data 
I wrote a byte of data 
.... 

diese ad infinitum zu gehen scheint, ist.

Nach der Zugabe von ein paar Debug-Anweisungen und das Ändern der Punkte Einige Programmierer Kumpel bemerkt

{ 
    Wire.beginTransmission((int)device); 
    Serial.println("I'm working here"); 
    Wire.write((unsigned char)_memstart); 
    Serial.println("I wrote the memory adress"); 
    for (int j = 0; j < blockSize; j++) { 
     Wire.write(wrBuf[bytesWritten + j]); 
     Serial.println("I wrote a byte of data"); 
     //Serial.write(wrBuf[bytesWritten + j]); 
    } 
    Wire.endTransmission(); 
    Serial.println("I ended the transmission"); 
    bytesWritten += blockSize; 
    _memstart += blockSize; 
    delay(25); 
} 

bemerkte ich, dass ich für ich war die Überprüfung < Blockgröße (aus dem Leseteil kopiert) jetzt bin ich laufen in einige andere (kleine) Probleme, aber dies löste das Problem, das ich hatte.

Verwandte Themen