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.
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.
Chris Knudsen
Das Photon
addr7bit
impliziert, 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.Chris Knudsen
Nima