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);
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.
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.
Tirdad Sadri Nejad