Forum: Mikrocontroller und Digitale Elektronik Probleme mit I2C Ansteuerung eines EEPROM


von Florian (Gast)


Lesenswert?

Hallo an alle...

hab mir vor kurzem nen eeprom zugelegt (m24c01) und hab mich auch gleich 
mal an die programmierung rangemacht.
mein problem:

ich wollte wissen wie das mit dem acknowledge des ic´s ist, meine 
routine zur programmierung is ok das hab ich schon beim saa1064 
gesehen...

meine abfrage ob der ic alles mitbekommen hat (acknowledge)

         setb i2c_clk
  nop
  jnb i2c_data,ack
  setb no_ack
  mov p1,#0
ack:     clr i2c_clk

laut dem datenblatt des eeprom´s kann ich nix reinschreiben wenn der pin 
WC auf High gelegt ist. also hab ich den pin auf high gelegt und 
versucht zu schreiben eigentlich müsste das nich gehen und ein no ack 
vom ic kommen.
Es sind jedoch noch alle leds am port 1 an...

hat jemand ne ahnung woran das liegt?

von holger (Gast)


Lesenswert?

>laut dem datenblatt des eeprom´s kann ich nix reinschreiben wenn der pin
>WC auf High gelegt ist. also hab ich den pin auf high gelegt und
>versucht zu schreiben eigentlich müsste das nich gehen und ein no ack
>vom ic kommen.

Auf seine Slave Adresse antwortet er auf jeden Fall mit ACK.
Wie es mit den gesendeten Datenbytes aussieht weiss ich nicht genau.
Ich habe aber auch noch kein Timingdiagramm gesehen wo der Slave
auf gesendete Bytes mit no ack antwortet wenn WP high ist.

Im Zweifel hilft ein Verify nach Write um das zu prüfen ;)

von Florian (Gast)


Lesenswert?

ein no ack ist doch dann vorhanden wenn während clock high ist auch sda 
auf high geht?

wollte diese verständnisfrage nur mit meinem beschriebenen versuch 
klären

von Ulrich P. (uprinz)


Lesenswert?

ACK heißt, dass der Chip im 9. Bit SDA auf LOW zieht. Der Chip gibt bei 
seiner Adresse zuerst einmal immer ein ACK, wenn er empfangsbereit ist. 
Ein EEPROM kann z.B. nicht empfangsbereit sein, wenn es intern noch mit 
dem Programmieren beschäftigt ist.
Danach schreibt man in das EEPROM die Adresse, die man lesen oder 
schreiben möchte. Hier sollte ein auch ein ACK zurück kommen, wenn man 
nicht den Adressbereich verletzt.
Nun kommt die Stelle, an der das EEPROM mit NACK (SDA bleibt high) 
antworten sollte, wenn man bei gesetztem WP nach Angabe der Adresse 
versucht dorthin Daten zu schreiben.

Gruß, Ulrich

von holger (Gast)


Lesenswert?

@ Ulrich

>Danach schreibt man in das EEPROM die Adresse, die man lesen oder
>schreiben möchte. Hier sollte ein auch ein ACK zurück kommen, wenn man
>nicht den Adressbereich verletzt.

Hab ich mal versucht für ne Autodetektion von EEPROMS.
Die Mistdinger senden auch ACK wenn die Adresse zu groß ist :(

von Ulrich P. (uprinz)


Lesenswert?

Ja, bekanntermassen sind die I2C Funktionen bei Chips in denen diese in 
Hardware gegossen sind, sehr rudimentär. Möchte mann eine Autodetektion 
haben, so hat man kaum eine Chance.
Bei einigen Chips reicht es nicht einmal Testmuster zur Erkennung der 
Größe zu schreiben, da sie einfach einen Wraparound machen. Also wenn 
man bei einem 2kB Chip ein Byte an Adresse 7FF schreibt kann man sie 
auch bei FFF und 17FF wieder lesen. Überzählige Bits bei der Adresse 
werden einfach ignoriert.

Diese Einfachheit setzt sich übrigens auch bei der Programmierung fort. 
Viele EEPROMs mache Page-Write, d.h. sie schreiben 32 Bytes ihres 
Speichers auf einmal. Das kann das Schreiben beschleunigen, da man 32 
Bytes einer Page auf einmal übertragen kann ohne STOP/START. Da sie 
dieses Page-Programming immer machen, kann man das ausnutzen um 
Programmier-Zeit zu sparen. 32 Bytes oder 1 Byte dauern immer gleich 
lang. Allerdings muss man die Adressen der Pages beachten. Programmiert 
man 32 Bytes ab Adreesse 0x002, dann überschreiben die letzten Bytes 
wieder den Anfang der Page, also wieder ein Wraparound...

Gruß, Ulrich

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.