Hallo Forum, ich habe hier einen STM32F103VB und daran angeschlossen an I2C1 ist ein EEPROM. Nach Konfiguration der CPAL klappt auch ein einfaches Schreiben und Zurücklesen von Werten in und aus dem EEPROM. Verwendet wird der DMA mode. Dazu verwende ich das Beispiel aus stm32_eval_i2c_ee_cpal.c. Wenn ich mir die Übertragung im Logic Analyzer ansehe, dann sehe ich, dass die Übertragung komisch segmentiert ist. Selbst der erste Testbuffer "ABC" wird nicht komplett in einem Transfer übertragen. EEPROM Schreibadresse: 0xA2 Ablauf: Schreiben von "ABC" ab Adresse 0x001F. Zurücklesen Schreiben von "DEFG" ab Adresse 0x1F3F. Zurücklesen Dieser Ablauf ist mit dem Logic Analyzer als 5 Transfer Blöcke zu sehen. Zwischen den Transfer Blöcken liegen rund 31ms. Die Blöcke sind nicht gleich lang. Zwischen Auslesen der ersten Zeichenfolge und Schreiben der zweiten Zeichenfolge liegt fast keine Pause (transfer3.png). Es funktioniert also alles korrekt, nur die Zeitliche Abfolge und die Segmentierung wundern bzw. stören mich etwas. Im 1. Transfer wird beispielsweise nach dem "A" mit einem STOP abgebrochen. Dann kommt ein Start mit WRITE und ein NAK... dann dauert es ~31ms und dann geht es korrekt weiter. Hat jemand eine Idee was in der CPAL zu dieser Segmentierung führen könnte?
Jetzt ist mir einiges klarer geworden. Die Zerstückelung bei der Übertragung eines Buffers liegt an den gewählten Adressen. Die Adressen liegen jeweils auf dem letzten Byte einer Page (32 Byte pro Page). Wähle ich die Adressen so, dass "ABC" und "DEFG" in jeweils eine Page passen, dann sehe ich nur noch 3 Transfers. 1. Schreiben von "ABC" 2. Lesen von "ABC" und sofortiges Schreiben von "DEFG" 3. Lesen von "DEFG" Dazwischen wieder jeweils ~31ms. Was mich noch wundert ist das WRITE am Ende jedes Transfers wie oben zu sehen. Vermutlich ist das der Anfang vom folgenden Befehl und das EEPROM ist noch mit Schreiben beschäftigt und gibt kein ACK?! Nach dem Lesen klappt dann ein Schreiben sofort. Klingt eigentlich logisch. Das EEPROM ist übrigens ein 24AA64-I/SN von Microchip. Wie lange der interne Write-Zyklus dauert habe ich im Datenblatt nicht gefunden. Im Datenblatt des EEPROMS steht, dass man das Ende des Write-Zyklus nur durch Polling herausfinden kann. Das wird hier aber offensichtlich nicht gemacht. Die Wartezeit von ~31ms muss also irgendwie aus der CPAL kommen. Damit hat sich eigentlich erst einmal alles geklärt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.




