Probleme mit I2C Ansteuerung eines EEPROM

Gast #794829
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?
Gast #794843
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 ;)
(Firma: DC3AX) #794898
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
Gast #794903
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 :(
(Firma: DC3AX) #795185
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

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