Forum: Mikrocontroller und Digitale Elektronik EEprom Atmel AT24C01B - ACK i.O. - keine Daten


von Andre M. (dg3amh)


Angehängte Dateien:

Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

Hallo,

WP hast Du aber richtig beschaltet?

Gruß aus Berlin
Michael

von Andre M. (dg3amh)


Lesenswert?

Ja, nach Masse.

von Klaus L. (lustigerklaus)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Klaus L. (lustigerklaus)


Lesenswert?

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

von gtl (Gast)


Lesenswert?

Klaus Lustig schrieb:
> Andere Interpretation

Die korrekte "Interpretation" findet man in dem Datenblatt des von Ihnen
eingesetzten EEPROMs.

von spess53 (Gast)


Lesenswert?

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

von Klaus L. (lustigerklaus)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

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
von spess53 (Gast)


Lesenswert?

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

von Klaus L. (lustigerklaus)


Lesenswert?

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
Noch kein Account? Hier anmelden.