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.
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.