Forum: Mikrocontroller und Digitale Elektronik I2C Probleme beim starten


von Lutz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich benutze einen LPC2138 auf einem Board der Firma Bipom. Dieser über 
I2C mit einem Peripherieboard verbunden. Ich habe bei dem 
Peripherieboard ein Beispielprogramm dabei welches ich erstmal testen 
will und es dann erweitern möchte.

Hier nun mein Problem:
Die I2C Routine bricht beim starten ab. Er hängt in einer While-Schleife 
fest, in der abfragt ob I2STAT ungleich 0x08 ist. I2STAT bleibt immer 
auf 0x20, es wird nicht 0x08. So weit ich das Manual verstanden habe, 
heißt dass der Conroller auf ACK wartet, das er aber wohl nicht bekommt.

Hier die Problemstelle:

I2C_ERRCODE Start(void)
{
  I2C_ERRCODE ec = I2C_SUCCESS;
  unsigned long delay =0;
/* Generate Start */
  I2CONSET = 0x60;
/* Clear SI */
  I2CONCLR=0x08;
  int i =I2STAT;
  while (I2STAT != 0x08)
  {
     int j = I2STAT;
    if (delay++ == I2C_TIMEOUT)
    {
      ec = I2C_START_ERROR;
      break;
    }
  }
  return ec;
}

Woran kann es liegen? Am Bus hängt außer dem Controller und dem 
Peripherieboard nichts dran.

Hardwaremäßig kann ich eigentlich auch alle Fehler ausschließen, da ich 
zuvor ein anderes Peripherieboard über SoftI2C angeschlossen hatte und 
es auch lief. Außerdem handelt es sich um ein Stecksystem, die Boards 
kann man einfach übereinander stecken, dadurch habe ich kaum 
Leitungslängen. Ob Pullup Widerstände verbaut sind kann ich nicht sagen, 
da ich diese im Manual nicht finden konnte.

Kann mir jemand helfen?

Ich habe noch den Quelltext der I2C Routine angehängt.

von Tcf K. (tcfkat)


Lesenswert?

Guck Dir bitte mal SCL und SDA auf dem Scope an. Offensichtlich stimmt 
irgendein Pegel nicht, entweder weil die Pullups fehlen, oder irgendwas 
ständig low zieht...
Lies Dich mal etwas ins I²C-Protokoll ein, Doku tonnenweise im Netz.

von Lutz (Gast)


Lesenswert?

Ich habe mir mal die Signale mal mit dem Oszi angeschaut. Auf SDA liegt 
ein konstantes 5V Signal an und auf SCL ein 500 mHz Signal mit 5V. Es 
sind keine Störungen, denn es sind einwandfreie 5 V und sehr sauber 
Signale mit steilen Flanken. Es ist allerdings nicht symetrisch, es ist 
ein Pulspausenverhältnis von ungefähr 2. Ist das normal?

Wieso ist der Bus nur mit 500 mHz getaktet, obwohl 100kHz eingestellt 
sind. Und warum liegt am SDA konstante 5V an?

Ich habe auch noch im Datenblatt nachgelesen, also es werden 2,2k 
Widerstände als Pullup verwendet.

Außerdem hab ich mich noch mehr in den I²C Bus eingelesen, aber noch 
nicht rausgefunden was genau die 0x08 im I2STAT Register bedeuten. Ich 
weiß zwar dass es das Statusregister ist, aber ich verstehe die Tabelle 
im Datenblatt nicht ganz was danach gemacht wird.

Das Problem liegt aber auch daran dass einfach keine Signale über den 
Bus kommen.

Wäre schön wenn mir jemand helfen könnte.

Lutz

von Tcf K. (tcfkat)


Lesenswert?

Im Ruhezustand müssen SDA und SCL high sein. Beim I²C-START muss SDA low 
werden. Mir scheint, Du hast ein Hardwareproblem - Schluss gegen Vcc, 
oder gegen eine andere Leitung. Oder etwas falsch konfiguriert.
Zur Software kann ich nicht mehr sagen, ohne mich einzulesen; wozu ich 
aber weder Lust noch Zeit habe.

von Lutz (Gast)


Lesenswert?

Ok, danke soweit schon mal. Also SDA und SCL sind beim Ruhe auf VCC. 
Beim Starten geht allerdings SDA nicht auf LOW, aber der Takt an SCL 
beginnt.
Ich habe eben mal das andere Board was mit Soft I²C läuft getestet, da 
kann ich aber keiner der Leitungen ein Signal messen, aber 
komischerweise überträgt das Board Signale, wie von Zauberhand ;-).

Falls ich einen Schluss habe, habe ich ein großes Problem, da es ein 
fertiges Board von BIPOM ist und ich da nichts drauf rumlöten will/kann.

Hat sonst jemand noch eine Ahnung was ich tun kann? Ich habe mal die 
Überprüfung von I2Stat beim starten auskommentiert, aber beim Senden bei 
der Abfragen kommt das gleiche Problem  wieder. Es scheint also als ob 
sich I2STAT nie ändert.

von Lutz (Gast)


Lesenswert?

Hab gerade mal die PINs getetest, also ich kann sie manuell noch auf 
High oder Low legen, also ist wohl kein Hardwaredefekt.

Bei der Software verzweifle ich aber langsam.

von Tcf K. (tcfkat)


Lesenswert?

Guck Dir mal an, wer oder was den 500mHz-Takt macht... irgendwo ist da 
der Wurm drin.

von Lutz (Gast)


Lesenswert?

Vielen Dank für die Hilfe, ich habe das Problem mittlerweile gelöst. Ich 
habe einfach "I2CONCLR=0x08;" auskommentiert, dann ging es, denn dadurch 
wurde das Interrupt Flag zurückgesetzt, obwohl dies an der Stelle nicht 
nötig ist.

Die 500mHz waren nicht der Bustakt, sondern die Frequenz mit der die 
angeschlossenen Relais an- und ausgeschaltet wurden, also der Bus 
geschaltet wurde, der Bus selber hat die eingestellten 100kHz.

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.