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?
>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 ;)
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
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
@ 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 :(
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.