STM32 - Lesen des EEPROM über I2C-Verzögerungsproblem

Ich versuche, EEPROM Byte für Byte zu lesen/schreiben, aber wenn ich keine ausreichende Verzögerung (~ 1 ms) zwischen Lese-/Schreibaufgaben lege, erhalte oder schreibe ich einen falschen Wert in das EEPROM. Aber diese Verzögerung nimmt viel Zeit in Anspruch, wenn viele Bytes gelesen/geschrieben werden müssen und 400 kHz seine Bedeutung verlieren. Übersehe ich etwas? oder es ist eine Art Byte-für-Byte-Prozess, der langsam ist. Danke für deine Zeit und Hilfe.

MCU = STM32F072C8Tx

EEPROM = 24LC64

I2C-Einstellungen:

 Speed = 400 kHz
 Rise Time = 300 ns
 Fall Time = 300 ns
 Analog Filter = Disable
 Digital Filter Coefficent = 0

Grundlegendes R/W-Codebeispiel:

 HAL_I2C_Mem_Write(&hi2c1, device_addr, mem_addr, I2C_MEMADD_SIZE_16BIT, data, 1, 500);
 Hal_Delay(1);
 HAL_I2C_Mem_Read(&hi2c1, device_addr, mem_addr, I2C_MEMADD_SIZE_16BIT, databuffr, 1, 500);

Antworten (2)

Ja, Ihnen fehlt die Zeit, die zum Schreiben benötigt wird, selbst wenn der Bus 400 kHz hat.

Die erste Seite von 24LC64 besagt, dass ein Seitenschreibvorgang maximal 5 ms dauert. Sie können ein Byte oder bis zu 32 Bytes (eine ganze Seite) auf einmal schreiben, aber es kann immer noch bis zu 5 ms dauern.

Nach einer Schreiboperation ist das EEPROM also damit beschäftigt, die Daten zu schreiben, und reagiert auf keine Operation, bis es mit dem Schreiben fertig ist.

Es scheint, dass Ihre Antwort die "Natur des Byte-für-Byte-Prozesses ist langsam" bestätigt?
Ja. Und für jedes einzelne Byte, das Sie schreiben, muss der Chip intern eine vollständige 32-Byte-Seite löschen und die gesamte Seite mit geändertem Inhalt zurückschreiben. Wenn Sie also einzelne Bytes in eine for-Schleife schreiben, wird die ganze Seite viele Male gelöscht und neu geschrieben.

EEProms benötigen eine gewisse Mindestzeit, um eine Seite oder ein einzelnes Byte in den Speicher zu schreiben. Der meiste Produktionscode wird das Gerät (WB-Bit) abfragen, um zu sehen, wann dieser Schreibvorgang abgeschlossen ist. In Ihrem Fall lässt die 1ms diese Zeit wahrscheinlich zu Ende.

Es wird effizienter sein, seitenweise statt byteweise zu schreiben, Sie müssen nur einmal warten, anstatt auf jedes Byte. Achten Sie darauf, dass Sie keine Seiten umbrechen. Die Seitengröße wird eine Potenz von 2 sein, siehe Datenblatt für die genaue Größe.

Seitenschreibvorgänge sind nicht nur schneller, sondern verschleißen den Chip auch langsamer. EEPROMs haben eine begrenzte Anzahl von Schreibvorgängen, bevor sie sich abnutzen.