Forum: Mikrocontroller und Digitale Elektronik I2C Eeprom Delay zw. Schreib- und Lesezugriff


von Lars (Gast)


Lesenswert?

Hi,

arbeite gerade mit dem LPC1758 Prozessor. Das I2C funktioniert vom 
Prinzip her, allerdings benötigt man anscheinend zwischen einem Schreib- 
und Lesezugriff ein gewisses Delay, ansonsten erhalte ich im Lesezyklus 
nicht die gewünschten Daten vom Eeprom AT24C04 zurück.

Wahrscheinlich liegt es am Eeprom selbst, welches eine gewisse Zeit 
benötigt bis die Daten reingeschrieben worden sind. Welchen Mechanismus 
gibt es um zu erkennen ab wann man wieder einen Lese- oder einen 
weiteren Schreibzyklus erfolgreich an das Eeprom senden kann?

Gruß
Lars

von Georg G. (df2au)


Lesenswert?

Laut Datenblatt musst du 5ms warten.

Die Alternative wäre, laufend das Lesen zu versuchen. Während die Daten 
geschrieben werden, stellt sich der Chip nach außen tot.

von TK (Gast)


Lesenswert?

Das Verfahren, nach dem Du suchst heisst ACK-Polling.
Solange das EEPROM im internen Schreibzyklus ist, gekommst Du
in dieser Zeit immer ein nACK zurück.

Gruß
TK

von Georg G. (df2au)


Lesenswert?

TK schrieb:
> Das Verfahren, nach dem Du suchst heisst ACK-Polling.

Leider gibt es je nach Hersteller da Abweichungen. Aus dem Datenblatt 
von Atmel:

All inputs are disabled during this write cycle and the EEPROM will
not respond until the write is complete (refer to Figure 2).

von Peter D. (peda)


Lesenswert?

Lars schrieb:
> ansonsten erhalte ich im Lesezyklus
> nicht die gewünschten Daten vom Eeprom AT24C04 zurück.

Dann machst Du was falsch.
Einen Lesezyklus wärend des internen Schreibzyklus ist garnicht möglich, 
da auf die Slaveadresse ein NACK kommt.
Das gleiche gilt auch bei mehreren Schreibzyklen hintereinander.

Du wertest wohl nicht der Status einer I2C-Aktion aus, das muß man aber 
immer tun.

Ich mache das immer so, daß ich vor jedem Adressieren des EEPROM einen 
Timeout von 10ms aufsetze und dann ständig versuche, den EEPROM zu 
adressieren, bis es erfolgreich ist.
Läuft dagegen der Timeout ab, liegt ein Fehler vor.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Georg G. schrieb:
> Leider gibt es je nach Hersteller da Abweichungen.

Wäre mir neu.
Kannst Du mal einen Typ nennen, wo das nicht gehen soll?

von Cyblord -. (cyblord)


Lesenswert?

Georg G. schrieb:
> TK schrieb:
>> Das Verfahren, nach dem Du suchst heisst ACK-Polling.
>
> Leider gibt es je nach Hersteller da Abweichungen. Aus dem Datenblatt
> von Atmel:
>
> All inputs are disabled during this write cycle and the EEPROM will
> not respond until the write is complete (refer to Figure 2).

Na und? Dann bekommst du solange ein NAK, bis das Ding wieder auf den 
Bus reagiert. Wo ist das Problem?

von Georg G. (df2au)


Lesenswert?

Peter Dannegger schrieb:
> Kannst Du mal einen Typ nennen, wo das nicht gehen soll?

Siehe das Posting... Atmel 24C04 (ohne das A). Die älteren Typen ganz 
allgemein können kein ACK-Polling. Da kann man sauber eine Bauchlandung 
machen, wenn der Einkäufer ein Schnäppchen gemacht hat und der 
Programmierer ein Timeout für überflüssig hielt.

von Cyblord -. (cyblord)


Lesenswert?

Georg G. schrieb:
> Peter Dannegger schrieb:
>> Kannst Du mal einen Typ nennen, wo das nicht gehen soll?
>
> Siehe das Posting... Atmel 24C04 (ohne das A). Die älteren Typen ganz
> allgemein können kein ACK-Polling.
Was tun die dann wenn die noch nicht bereit sind, und man trotzdem 
darauf zugreifen will? Bekommt man dann trotzdem ein ACK?

von Peter D. (peda)


Lesenswert?

Georg G. schrieb:
> Die älteren Typen ganz
> allgemein können kein ACK-Polling.

Also in meinem Datenblatt z.B. des AT24C04-10PI-2.7 steht explizit 
"ACKNOWLEDGE POLLING" drin.

Georg G. schrieb:
> All inputs are disabled during this write cycle and the EEPROM will
> not respond until the write is complete (refer to Figure 2).

Und genau deshalb funktioniert ja das ACKNOWLEDGE POLLING.
Disabled = NACK

Georg G. schrieb:
> Da kann man sauber eine Bauchlandung
> machen, wenn der Einkäufer ein Schnäppchen gemacht hat und der
> Programmierer ein Timeout für überflüssig hielt.

Das Timeout braucht man nur für Hardwarefehler (Chip defekt, Kurzschluß 
oder Unterbrechung des I2C).

von TK (Gast)


Lesenswert?

Es wäre mir ebenfalls neu, dass ein ACK Polling nicht gehen soll. Wenn 
der int. Schreibzyklus aktiv ist und dabei ein weiterer Versuch 
unternommen wird das EEPROM zu adressieren, kommt ein nACK zurück und 
zwar solange, bis der int. Zyklus beendet ist. Natürlich muss mit 
Erkennen des nACK das Telegramm mit einem Stop beendet werden.

Gruß

TK

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.