EEPROM-Lesevorgang gibt immer 0xFF zurück

Ich arbeite mit einem AT24C04-EEPROM, das mit einer LPC1768-MCU über einen I2C-Bus kommuniziert.

Ich versuche, 8-Bit-Daten (0xF0) auf die 0x00-Adresse des Speichers zu schreiben, aber wenn ich den Inhalt dieser Adresse lesen möchte, gibt das EEPROM 0xFF anstelle von 0xF0 zurück, was bedeutet, dass auf diese Adresse nichts geschrieben wird.

Es scheint, dass ich kein Problem beim Lesen des EEPROM habe, aber mit dem Schreibvorgang stimmt etwas nicht.

Mein Compiler ist uVision v5.28 und hier ist mein Code:

uint8_t DeviceAddress = 0x50;
uint8_t TxBufferByteWrite[2]={0x00,0xF0};   
uint8_t RxBuffer[1];    

I2C_Init(LPC_I2C1, 100000);
I2C_Cmd(LPC_I2C1, I2C_MASTER_MODE, ENABLE); 

//Byte Write    
I2CTransferConfig.sl_addr7bit = DeviceAddress;
I2CTransferConfig.tx_data = TxBufferByteWrite;
I2CTransferConfig.tx_length = sizeof(TxBufferByteWrite);
I2CTransferConfig.rx_data = NULL;
I2CTransferConfig.rx_length = 0;
I2CTransferConfig.retransmissions_max = 3;
I2C_MasterTransferData(LPC_I2C1, &I2CTransferConfig, I2C_TRANSFER_POLLING);     

//Current Address Read
I2CTransferConfig.sl_addr7bit = DeviceAddress;
I2CTransferConfig.tx_data = NULL;
I2CTransferConfig.tx_length = 0;    
I2CTransferConfig.rx_data = RxBuffer;
I2CTransferConfig.rx_length = sizeof(RxBuffer);
I2CTransferConfig.retransmissions_max = 3;
I2C_MasterTransferData(LPC_I2C1, &I2CTransferConfig, I2C_TRANSFER_POLLING); 

if( RxBuffer[0]==0xF0)
PrintS("Memory Working");

Vielen Dank im Voraus.

Ich sehe nicht, dass Sie das Schreibbit in I2CTransferConfig.sl_addr7bit gesetzt haben (wie DeviceAddress<<1 && 0x0). Wird das irgendwie hinter den Kulissen in I2C_MasterTransferData gemacht? Siehe Seite 11 des AT24C04-Datenblatts (Abbildung 8).
@ChrisKnudsen, die Tatsache, dass sie die Variable aufrufen, addr7bitimpliziert, dass sie die 7-Bit-I2C-Adresse wollen (die das W / R-Bit nicht enthält), und der Bibliothekscode kümmert sich um das Verschieben und Einfügen des W / R-Bits je nach angeforderte Operation.
@ThePhoton Ich übersehe es wahrscheinlich, aber wo ist das im angezeigten Code angegeben (Schreiben vs. Lesen)? "I2CTransferConfig.tx_data = NULL;"?
@ChrisKnudsen ja, die Zuweisung von NULL zu I2CTransferConfig.tx_data bedeutet, dass wir nur Lesevorgänge haben möchten und umgekehrt. auch wenn keiner von ihnen NULL ist, bedeutet dies, dass wir sowohl lesen als auch schreiben möchten, was ich für 'Random Read' tun muss (wie ThePhoton in seiner Antwort erwähnte).

Antworten (1)

Nach Ihrem Schreibvorgang sollten Sie überprüfen, ob das EEPROM bestätigt wurde, um sicherzustellen, dass der Schreibvorgang erfolgreich war.

Ihr Schreibvorgang hat den Adresszeiger des EEPROM auf 0x01 erhöht. Aus dem Atmel-Datenblatt für Ihr EEPROM:

Der interne Datenwort-Adresszähler hält die letzte Adresse, auf die während der letzten Lese- oder Schreiboperation zugegriffen wurde, inkrementiert um eins.

Wenn Sie also den Lesevorgang ausführen, lesen Sie von Adresse 0x01 und nicht von 0x00, wohin Sie gerade geschrieben haben.

Vor Ihrem Lesevorgang sollten Sie einen Ein-Byte-Schreibvorgang ausführen, um den Lesezeiger wieder auf 0x00 zu setzen.

Nochmal aus deinem Datenblatt:

ZUFÄLLIGES LESEN: Ein zufälliges Lesen erfordert eine „Dummy“-Byte-Schreibsequenz, um die Datenwortadresse zu laden. Sobald das Geräteadresswort und die Datenwortadresse eingetaktet und vom EEPROM quittiert sind, muss der Mikrocontroller eine weitere Startbedingung erzeugen. Der Mikrocontroller initiiert nun das Lesen einer aktuellen Adresse, indem er eine Geräteadresse mit dem Lese/Schreib-Auswahlbit hoch sendet.

Tatsächlich schlägt das Lesen fehl, wenn der Chip immer noch mit dem internen Schreibzyklus beschäftigt ist. Max. Schreibzykluszeit 5 ms. Daher sollten mindestens 5 ms gewartet werden, entweder blind oder aktiv auf Chip-Antwort mit ACK abfragend, um zu wissen, wann der Chip wieder einsatzbereit ist.