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?
> 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.
Such mal beim I2C Protokoll nach dem Ack Bit... Eine Page braucht auch nur 5ms.
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.
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 :( )
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.
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)
hab zwar lange nix mit I2C gemacht, aber der Code schaut strange aus, x-Mal die Geräteadresse senden, wozu, ein Mal muss reichen.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.