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.
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.
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
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.
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.
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.
Guck Dir mal an, wer oder was den 500mHz-Takt macht... irgendwo ist da der Wurm drin.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.