mikrocontroller.net

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


Autor: Andre M. (dg3amh)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

WP hast Du aber richtig beschaltet?

Gruß aus Berlin
Michael

Autor: Andre M. (dg3amh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, nach Masse.

Autor: Klaus Lustig (lustigerklaus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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

Autor: Klaus Lustig (lustigerklaus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gtl (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Klaus Lustig schrieb:
> Andere Interpretation

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Lustig (lustigerklaus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Georg G. (df2au)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Lustig (lustigerklaus)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.