Forum: Mikrocontroller und Digitale Elektronik STM32 CPAL I2C EEPROM Übertragung stark zerstückelt


von Bernd (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Bernd (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.