I2C Eeprom AT24C512 Lib für Pagewrite in C

Gast #5234187
Lesenswert?

Hallo zusammen,

habe letztens eine Lib in C für ein Pagewrite und Random Read / 
Sequential Read für die I2C Lib von Peter Fleury gesucht und nichts 
richtiges gefunden.
Da ich noch am lernen bin wollte ich hier mal nachfragen ob das so sinn 
macht oder ob ich noch etwas verbessern kann. Freue mich über alle Tips.
Angehängte Dateien:
Persönliche Seite #5234247
Lesenswert?

Hallo,

ich habe nur kurz drübergeschaut. Dabei ist mir allerdings das Folgende 
aufgefallen:

Lass die i2c_init() Aufrufe innerhalb der Funktionen weg. Der Aufruf 
gehört einmal an den Anfang des Programms. Sonst kostet das nur 
(zugegebenermaßen ein wenig) Zeit.

Ohne ins Datenblatt von verwendeten EEPROM zu schauen: Nachdem eine Page 
beschrieben wurde: warum i2c_stop() und dann wieder i2c_start()? Wäre da 
i2c_rep_start() nicht angebracht. Hat Vorteile, denn erstens geht es 
minimal schneller (aber wirklich nur einige Takte). Zweitens: wenn du 
I2C als Multimaster betreibst, dann kann es so zu Arbitrierungsfehlern 
während der Übertragung kommen.

Generell wären Kommentare (mehr als READ und WRITE) schön. Weil mir als 
unbedarftem Leser wird nicht überall klar, warum etwas gemacht wird.

So was wie 0b10100000 sollte man noch in ein aussagekräftiges Define 
verpacken.

Ich hoffe dir hilft das ein bisschen :-)

Mit freundlichen Grüßen,
N.G.
#5234278
Lesenswert?

Hi,

Für die 24C-EEPROMs braucht es nach dem Schreiben einer Page in der 
Regel Acknwoledgepolling, um zu wissen, wann die nächste Page 
geschrieben werden kann. Das Übertragen der Page über I2C erfolgt immer 
erst in einen Puffer. Nach dem I2C-Stop wird der Pufferinhalt dann 
tatsächlich persistent geschrieben. Während dieser Zeit ist das EEPROM 
nicht ansprechbar. Sowas ist in der Fleury-Lib nicht abgedeckt. Man muss 
also selbst im EEPROM-Treiber immer wieder Start+Write (wenn kein Ack 
kommt STOP) schicken bis ein ACK kommt. Dauert so 5ms (Größenordnung). 
Das gleiche gilt, wenn man unmittelbar nach dem Schreiben was lesen 
will.

Grüße Oliver
#5234283
Lesenswert?

N. G. schrieb:
> Ohne ins Datenblatt von verwendeten EEPROM zu schauen: Nachdem eine Page
> beschrieben wurde: warum i2c_stop() und dann wieder i2c_start()? Wäre da
> i2c_rep_start() nicht angebracht.

Hättest Du mal reingeschaut, wüßtest du es.
Das Schreiben erfolgt erst nach dem Stop. Ein Repeat-Start bricht das 
Schreiben ab, alle Bytes im Schreibpuffer werden verworfen.
Persönliche Seite #5234301
Lesenswert?

Peter D. schrieb:
> N. G. schrieb:
>> Ohne ins Datenblatt von verwendeten EEPROM zu schauen: ...
>
> Hättest Du mal reingeschaut, wüßtest du es.

Deswegen hab ich es ja dazu geschrieben. Den Hinweis dann bitte 
ignorieren.
Aus Erfahrung mit Sensoren hab ich es halt mal in die Runde geworfen.

Nichtsdestotrotz habe ich noch mehr als nur das geschrieben :-)

Mit freundlichen Grüßen,
N.G.
#5234330
Lesenswert?

Oder gleich auf FRAM ausweichen, dann hat man keinerlei Probleme.
Man braucht sich nicht um page-Grenzen zu kümmern, keine Schreibzeiten 
beachten,  kein ack-polling, kein Verschleiss. Man spart sich dann auch 
das evtl. verteilte Schreiben für häufig benutzte Zellen bzw. muss sich 
gar nicht erst Gedanken drüber machen.

Ein Nachteil natürlich - teurer.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren