mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Software I2C Problem - kein ACK


Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich möchte mit einem PIC18LF4620 Daten in ein EEPROM (ST M24C08W)
schreiben und auslesen. Das ganze über einen I2C-Bus. Da ich schon
einen Funk-Empfänger am SPI hängen hab, bin ich gezwungen den I2C in
Software zu emulieren.
Mein Problem ist nun folgendes:
Ich lege die Adresse des EEPROMs auf den Bus, aber erhalte im 9. Takt
kein ACK (SDA bleibt auf High).

Timing stimmt soweit mit dem Datenblatt über ein und da EEPROM wird
auch richtig adressiert. Als Pull-up Widerstände benutze ich 10kOhm.

Hat jemand noch Ideen woran das Problem liegen könnte?

Mit freundlichen Grüßen
   Marc

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Schon mal den Takt ganz langsam gestellt ?
2. Oszilloskop zur Hand ?
3. weiteren Baustein zum Tauschen ?

Gruß Sven

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat der Bus vor dem Start der Kommunikation einen definierten Zustand?
Evtl. vorm Start mal eine Stop-Condition senden.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Takt wurde auch schon langsamer gesetzt - ohne Erfolg.
2. Ja, mit einem Oszilloskop arbeite ich schon die ganze Zeit, um zu
schauen, was auf dem Bus passiert.
3. Hab schon 3 EEPROMs durchprobiert, davon waren 2 erst heute gekauft.
Immer das gleiche Ergebnis.

4. Ja, vor der Start-Condition liegen SCL und SDA auf High. Eine
Stop-Condition vor dem Start einzufügen hilft auch nicht.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst einen Screenshot von dem dem Oszilloskop machen und hier
einstellen, damit man mal sieht, wie dein Timing aussieht. Außerdem
noch die Ansteuerroutinen und die die Beschaltung der Anschlusspins des
EEPROMs und wir hätte allles, was man sich mal dazu ansehen könnte.

Mike

Autor: Olaf_K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Als Pull-up Widerstände benutze ich 10kOhm

Vielleicht wird die Rise-Time zu lang, versuch mal 2.2k als Pull-Up.

MfG Olaf

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat der µC eine Hardware I2C Schnittstelle, oder per Software über
normale Portpins nachgebildet?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, wer lesen kann, ist klar im Vorteil.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sendest Du denn die Daten, schreibst 0 und 1 aktiv auf den Bus, oder
schaltest um zwischen Ein- und Ausgang?

Autor: Marc (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

@Oliver: ich schalte um zwischen Ein- und Ausgang, um den Bus auf HIgh
oder Low zu ziehen.

@Mike: Einen Screenshot vom Oszi kann ich leider nicht machen, weil ich
den Oszi nicht mit dem Rechner verbinden kann. Die Zugriffsmethoden hab
ich mal angehängt (sind leider noch nicht mit kommentaren versehen).
Einen Shcaltplan kannich heute Abend posten, wenn ich wieder zu Hause
bin.

Gruß Marc

Autor: Marc (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hier noch die .c-Datei.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese Informationen sind vielelicht noch nützlich den Programmcode zu
verstehen:

#define  DATA_LOW   TRISDbits.TRISD0 = 0; // define macro for data pin
output
#define  DATA_HI    TRISDbits.TRISD0 = 1; // define macro for data pin
input
#define  DATA_LAT   LATDbits.LATD0        // define macro for data pin
latch
#define  DATA_PIN   PORTDbits.RD0         // define macro for data pin

#define  CLOCK_LOW  TRISDbits.TRISD2 = 0; // define macro for clock pin
output
#define  CLOCK_HI   TRISDbits.TRISD2 = 1; // define macro for clock pin
input
#define  SCLK_LAT   LATDbits.LATD2        // define macro for clock pin
latch
#define  SCLK_PIN   PORTDbits.RD2         // define macro for clock pin

Autor: Marc (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist die Schlatung.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hoffe doch, der zweite Pull-Up der Schaltung hat einen Fehler :-)

Autor: dernixwois (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Pull-up für Scl ist nicht angeschlossen, brauchst dich nicht wundern
wenns nicht tut.

Autor: Michi B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Zeit liegt zwischen dem Umschalten auf Eingang und überprüfung
auf ACK?

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

@dernixwois: Ist nur ein Fehler auf der Zeichnung. Auf der Platine ist
ein Pull-up mit SCL und einer mit SDA verbunden.

@Michi B: ca. 600 ns.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schnell ist eigentlich deine Taktrate für den Bus, welche
Geschwindigkeit kann das EEPROM maximal und wie groß ist der Abstand
zwischen SDA-High und der positiven Clock Flanke?

Der C-code sagt mir leider nicht so viel, warscheinlich weil mir die
Feinheiten der PIC programmierung fehlen.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chip Enable (E0, E1, E2) abhängig von der Größe des Bausteins korrekt
angeschlossen?

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Mike: Das EEPROM kann maximal mit 400 MHz angesteuert werden. Der
Abstnad zwischen SDA High und der SCL Flanke beträgt 160 Mikrosekunde.

@Oliver: E0, E1, und E2 sind korrekt angeschlossen und eingestellt. Mit
einem ARM läßt sich das EEPROM auch mühelos beschreiben, nur mit dem PIC
klappt's nicht.

Gruß Marc

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
400KHz ;-)

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nachdem ich jetzt so ziemlich alles an der software rumprobiert hab,
was nur geht, denke ich das es ein Problem bei der Schlatung sein
müsste.

es hat den Anschein, als könnte der Slave den Bus beim ACK nicht auf
Low ziehen.
Woran könnte das liegen?
Könnten andere Pull-up Widerstände Abhilfe schaffen?

Gruß Marc

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwischen 4k7 und 10k sollte es auf jeden Fall funktionieren.
Wie lang ist denn die Leitungslänge, sind die Signale "sauber"?

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Signale sind auf dem Oszi sehr sauber. Leitungslänge sind ca. 5-10
cm.

Autor: programinator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

welche Slaveadresse übergibst du deiner Senderoutine ? Hast du dich
vielleicht ein wenig verzählt mit der Adresse ? Die möglichen Adressen
des M24c08 liegen ja zwischen 0x50 .. 0x57. Berücksichtigst man aber
das R/W-Bit bei der Übergabe verschiebt sich das zu übergebende Datum
auf 0xA0 .. 0xAE.

Ich frage nur, weil ich genau das Gleiche bei einem sehr erfahrenen
Kollegen erlebt habe :)

Autor: KlRaw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ein Speicherbaustein erfordert schon ein umfangreicheres Bus-Protokoll.
Versuch doch es erst einmal mit einem einfachen PCF8574. Wenn Du diesen
ordnungsgemäss ansteuern kannst, Wert setzen und Wert lesen, dann liegt
es an der Programmierung.

Gruss KLaus.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich übertrage als Adresse 0xA0. Und das sollte auch stimmen.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marc,

konntest Du dem EEProm inzwischen ein ACK entlocken?

Autor: Michi B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm doch mal als Adresses 0x00, da sollten sich laut I2C Protokoll
jeder Slave melden. Wenn du dann ein ACK bekommst kannst du schon mal
einen Fehler bei der Startsequenz aussschließen.

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.