Forum: Mikrocontroller und Digitale Elektronik Eeprom so langsam?


von Matthias (Gast)


Lesenswert?

Ich hab jetzt nach 2 Tagen endlich mal hinbekommen mein Eeprom (24LC64) 
zu beschreiben. Mein Fehler war dass ich nicht lange genug gewartet 
habe. Laut Datenblatt braucht er zum schreiben 5ms. Das ist ja eine 
halbe Ewigkeit. Was macht der so lange?
Da kann ich ja in einer Sekunde nur 200Bytes schreiben. Bei einem 
64kByte Eeprom dauert das dann ja 6Minuten?
Wie lange dauert es eine Page (128Byte) zu schreiben? 5ms oder 128*5ms?
Wie kann ich herausfinden ob er noch beschäftigt ist? In dieser Zeit 
generiert er kein Acknowledge. Wie kann ich abfragen ob er das bit 
sendet oder nicht?

von Michael (Gast)


Lesenswert?

> Wie lange dauert es eine Page (128Byte) zu schreiben? 5ms oder 128*5ms?
> Wie kann ich herausfinden ob er noch beschäftigt ist? In dieser Zeit
> generiert er kein Acknowledge. Wie kann ich abfragen ob er das bit
> sendet oder nicht?

Die Antworten stehen alle im Datenblatt !
Da das Schreiben einer 'page' genauso lange dauert, wie das Schreiben 
eines Byte, ist es immer ratsam, seine Daten 'page'-orientiert zu 
speichern.

von Benedikt K. (benedikt)


Lesenswert?

Such mal beim I2C Protokoll nach dem Ack Bit...

Eine Page braucht auch nur 5ms.

von Matthias (Gast)


Lesenswert?

OK, aber wie kann ich das acknowledge-bit abfragen? Ich hab dazu leider 
keine Möglichkeit gefunden. Im Datenblatt steht ja nur was vom Erzeugen 
des Bits z.B. im Slavemode oder beim empfangen.

von Jens B. (sio2)


Lesenswert?

KA, welchen Controller du nutzt, aber im allgemeinen sollte es im DB vom 
Controller stehen, wie man welches Bit erkennen kann. Beim AVR gibts 
auhc nen Interrupt dazu (dummerweise ein Int. für alle Anwendungen :( )

von Mike R. (thesealion)


Lesenswert?

Wenn du das ACK-bit nicht abfragen könntest, würde dein schreiben gar 
nicht funktionieren.
Normalerweise geht es so, daß man den schreiben befehl sendet, dann 
einen repeated start und die Adresse des EEPROM. So lange dieser die 
Adresse nicht mit einem Ack bestätigt, ist er noch mit schreiben 
beschäftigt.

von Matthias (Gast)


Lesenswert?

OK ich hab es jetzt hinbekommen. (Mega16)
Falls es jemand interessiert:
do
{
  i2c_start();
  i2c_write_byte(DEV_ADR);  //Sendet Geräteadresse RW=0, schreiben
} while (TWSR==0x20);   //Falls kein Ack: noch mal (siehe Datenblatt 
S.189)

von Walter (Gast)


Lesenswert?

hab zwar lange nix mit I2C gemacht, aber der Code schaut strange aus,
x-Mal die Geräteadresse senden, wozu, ein Mal muss reichen.

von Peter D. (peda)


Lesenswert?

@Walter

ne, das ist schon richtig so.

Um ein ACK zu kriegen, muß man den Chip natürlich adressieren.

Alternativ kann man auch 10ms warten.


Ein anderer gern gemachter Fehler ist, kein Stop zu senden.
Das Schreiben wird nämlich erst mit dem Stop gestartet.
Mit einem Repeat-Start werden dagegen alle gesendeten Daten verworfen.


Peter

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.