Hallo, ich habe hier ein Atmel AT24C01B EEprom, welches ich über einen I2C Bus beschreiben will. Als Controller habe ich einen Freescale MC9S08DV. Es muss dieser Controller genommen werden, da das EEprom in eine vorhandene Schaltung integriert wird. Als Pull Up Widerstände für SCL und SDA habe ich 5k1 genommen. Die Adressierung des EEproms habe ich, wie in den Aplication Notes von atmel.com beschrieben, direkt auf Masse gezogen (also Adresse 000). Ebenso den WP Pin. Als erstes beschreibe ich die Adressen 0x01 und 0x02 des EEproms. Das EEprom antwortet jedes mal, indem es das neunte Bit (ACK) auf Low zieht. Anschließend will ich die Adresse 0x01 vom EEprom wieder auslesen. Allerdings liefert es mir nur FF zurück. Als erstes dachte ich, dass der I2C nicht richtig funktioniert. Also habe ich mal 2 I/O Bausteine vom Typ PCF8574 angeschlossen. Diese kann ich über den I2C auslesen und beschreiben. Habe es mit LEDs und DIP Schaltern an den I/O Ports probiert. Funktioniert ohne Probleme. Als nächstes habe ich das EEprom ausgetauscht - gleiches Problem. Dann habe ich verschiedene Geschwindigkeiten getestet (400k, 100k, 10k) - gleiches Problem. Den WP Pin habe ich auch schon testweise nach Vcc gezogen - gleiches Problem. Ich habe einmal einen Screenshot von den Daten auf dem Bus angehängt. Kann mir jemand sagen, wo ich einen Fehler mache? Danke schon einmal im voraus. MfG, Andre
Hallo, WP hast Du aber richtig beschaltet? Gruß aus Berlin Michael
Hallo Zusammen, ich muss leider diesen Thread nochmals auspacken, da ich das gleiche Problem habe. Das EEPROM AT24C256 wird über ein SC18IM700 (I2C Master mit UART Interface) angesprochen. Die Kommunikation funktioniert auf der gesamten Kette, allerdings quittiert das EEPROM immer mit FFh. Als PU-Widerstände für SDA u SCL wurden 1,8k verwendet, die Kommunikation funktioniert. Das EEPROM soll nun mit Werten beschrieben werden. Der "write" Vorgang funktioniert auch, da mir das EEPROM ein ACK schickt. Wenn ich aber die gerade gespeicherten Werte nochmals auslesen möchte, quittiert es immer mit FFh. Als "write" Befehl nutze ich z.B.: 53 A0 00 01 05 50 (alles Hex Werte) Erläuterung: 53h (I2C Start) A0h (Adresse des EEPROM inkl. write Bit=low) 00h (Adresse MSB) 01h (Adresse LSB) 05h (Anzahl der einzulesenden Bytes = 5), nun folgen die 5 Byte an Daten und es wird mit 50h (I2C Stop) terminiert. Als "read" Befehl nutze ich z.B.: 53 A1 01 50 (alles Hex Werte) Erläuterung: 53h (I2C Start), A1h (Adresse des EEPROM inkl. read Bit=high), 01h (Anzahl der auszulesenden Bytes), 50h (I2C Stop). Als Antwort erhalte ich, wie oben beschrieben immer FFh, natürlich abhänging von der Anzahl der auszulesenden Bytes. Ich bin langsam etwas ratlos, kann mir jmd mitteilen, was ich falsch mache? Und als weitere Frage, bei "read" kann ich lediglich angeben, wieviele Bytes ich auslesen möchte, aber ich habe keine Info dazu gefunden, wie ich einen Speicherwert aus einer bestimmten Adresse, Bsp.: aus 00h01h auslesen kann. Freue mich über Antworten. Danke gruß klaus
Hi >Als "read" Befehl nutze ich z.B.: >53 A1 01 50 (alles Hex Werte) Das Read besteht aber in einem Schreib- und einem Lesezugriff. Der Schreibzugriff für die zwei Byte EEPROM-Adresse und dem Lesezugriff für die Daten. MfG Spess
Hi, danke für die Antwort. Ich verstehe Deine Aussage wie folgt: 53h(I2C Start) A0h(Schreibzugriff) 00h(Adresse MSB) 01h(Adresse LSB) A1h(Lesezugriff) 00h (Adresse MSB) 01h (Adresse LSB) 50h (I2C Stop) Dies funktioniert leider nicht wie gewünscht, es wird nichts quittiert. Andere Interpretation Deiner Antwort: 53h(I2C Start) A0h(Schreib-/Lesezugriff)....funktioniert schon nicht, da das letzte Bit 0 zum Schreiben oder 1 zum Lesen sein muss. Kannst du mir das bitte näher erläutern, ich verstehe nicht genau was du meinst. Dankeschön. gruß klaus
Klaus Lustig schrieb: > Andere Interpretation Die korrekte "Interpretation" findet man in dem Datenblatt des von Ihnen eingesetzten EEPROMs.
Hi >53h(I2C Start) A0h(Schreibzugriff) 00h(Adresse MSB) 01h(Adresse LSB) >A1h(Lesezugriff) 00h (Adresse MSB) 01h (Adresse LSB) 50h (I2C Stop) Ein Schreib- oder Lesezugriff beginnt immer mit einer Start- und endet mit einer Stopcondition. Wie das Ganze genau bei dem SC18IM700 geregelt ist entzieht sich allerdings meiner Kenntnis. MfG Spess
Hallo, vielen Dank für ihre Antworten. >Klaus Lustig schrieb: >> Andere Interpretation > >Die korrekte "Interpretation" findet man in dem Datenblatt des von Ihnen >eingesetzten EEPROMs. Wenn Sie den Thread aufmerksam verfolgt haben, sollte Ihnen aufgefallen sein, dass ich den Vorgang gemäß Datenblatt (siehe auch Thread-Ersteller)in verschiedenen Varianten versucht habe. >>53h(I2C Start) A0h(Schreibzugriff) 00h(Adresse MSB) 01h(Adresse LSB) >>A1h(Lesezugriff) 00h (Adresse MSB) 01h (Adresse LSB) 50h (I2C Stop) >Ein Schreib- oder Lesezugriff beginnt immer mit einer Start- und endet >mit einer Stopcondition. Danke für Ihren Hinweis, dessen bin ich mir ebenfalls bewusst, weil es ja, wie gtl bereits klugerweise anmerkte, im Datenblatt steht. Wie im Post zu sehen, wird eine Start und Stopkondition verwendet. >53h (I2C Start) A0h (Adresse des EEPROM inkl. write Bit=low) 00h >(Adresse MSB) 01h (Adresse LSB) 05h (Anzahl der einzulesenden Bytes = >5), nun folgen die 5 Byte an Daten und es wird mit 50h (I2C Stop) >terminiert. >53h (I2C Start), A1h (Adresse des EEPROM inkl. read Bit=high), 01h >(Anzahl der auszulesenden Bytes), 50h (I2C Stop) Allerdings funktioniert auch dies nicht, wie gewünscht. Aus diesen Gründen habe ich mich entschlossen, einen Post diesbezüglich zu eröffnen. Ich freue mich über Antworten jenseits der intelligenten RTFM-Antwort, denn diese könnten evtl. weiter helfen. Was habe ich eventuell übersehen oder falsch gemacht? Wer kennt sich aus und kann helfen? vielen Dank Klaus
Klaus Lustig schrieb: > intelligenten RTFM-Antwort Ich versuche es mal vorsichtig: In dem mir vorliegenden Datenblatt geht ein Lesezyklus (Random Read) wie folgt (die ACK lasse ich mal weg) ... <Start><Befehl "schreiben"><Adresse Hi><Adresse Low><Start><Befehl "lesen"><Daten kommen><wenn ich alles habe><Stop>. Siehst du das zweite <Start> zwischen "Adresse setzen" und "Lesen"? After the word address is sent, the master generates a Start condition following the acknowledge. This terminates the write operation, but not before the internal Address Pointer is set. Then, the master issues the control byte again, but with the R/W bit set to a one.
:
Bearbeitet durch User
Hi >Ich freue mich über Antworten jenseits der intelligenten RTFM-Antwort, >denn diese könnten evtl. weiter helfen. Ändert aber nichts an der Tatsache, das du das Datenblatt des SC18IM700 nicht richtig gelesen hast: Schreiben: - Start - SLAVE ADR.+ W - NUMBER OF BYTES - DATA 0 ... DATA N ->Adresse 2 Byte - Stop Lesen: - Start - SLAVE ADR.+ R - NUMBER OF BYTES - DATA 0 ... DATA N - Stop Und dann gibt es auf S.6/7 noch das für dich relevante 'Repeated START: read after write' : - Start - SLAVE ADR.+ W - NUMBER OF BYTES - DATA 0 ... DATA N ->Adresse 2 Byte - Start - SLAVE ADR.+ R - NUMBER OF BYTES - DATA 0 ... DATA N - Stop MfG Spess
Hallo, vielen Dank für die Antworten. Es funktioniert endlich. Mein Fehler war, dass ich beim Schreibvorgang als No. of Bytes lediglich die Datenbytes angegeben habe, d.h. jeweils die beiden Adressbytes nicht mitgezählt habe. Beim Lesen hatte ich den gleichen Fehler, d.h. die No. of Bytes der Adresse fälschlicherweise mit den No. of Bytes Daten angegeben und nach dem erneuten Startbefehl keine Angabe über No. of Bytes angegeben habe. D.h. die funktionierenden Befehle lauten wie folgt: Schreiben: - Start - SLAVE ADR.+ W - NUMBER OF BYTES (Datenbytes + Adressbytes) - Adresse im Speicher - DATEN - Stop Lesen: - Start - SLAVE ADR.+ W - NUMBER OF BYTES (Adressbytes) - Adresse im Speicher - Start - SLAVE ADR.+ R (Datenbytes) - NUMBER OF BYTES - Stop Danke Georg und Spess, mittels eurer Teilantworten konnte ich die korrekte Lösung zusammenbauen ;) vielen Dank Klaus
:
Bearbeitet durch User
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.