Forum: Mikrocontroller und Digitale Elektronik LPC11xx I2C Probleme


von Florian R. (rager)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bin jetzt seit 3 geschlagenen Tagen dabei ein und das selbe Problem 
zu lösen und ich habe noch immer keine Idee was los ist...
Ich versuche gerade auf einem LPC11C14x301 (sollte bei allen LPC11xx 
gleich sein) einen I2C Slave zu implementieren. Später soll daraus ein 
Motortreiber werden. Jetzt ist es aber erst einmal nur ein Liste wo man 
reinschreiben und lesen können soll. Da Problem ist:
-Lesen geht wunderbar
-Schreiben nicht....

Wenn ich auf dem LPC11xx schreiben will klappt es nur beim ersten mal, 
danach geht er nicht mehr in die Interruptroutine rein(Schreibzyklus 
jede Sekunde).
Lass ich die Schreibsequenzen sich schneller als alle ca. 30ms 
wiederholen dann geht der LPC in die Interruptroutine rein.

Der physikalische Aufbau ist so:
Ein Arduino als Master und der LPC11xx als Slave.
Am LPC11xx ist noch ein UART->USB Wandler um über UART zu Debuggen.
Ich benutze die COOCOX  IDE.

Das Problem wird an der Software liegen wo dieser aber ist, ist die 
Frage... vielleicht würde einer von euch mir helfen?  :)

Ich tue mal alles in den Anhang wo ich denke dass es hilfreich sein 
kann.

-In der "main.c" passiert eigentlich gar nichts. Blinken und in die 
"Slave_test" gehen.
-In der "Slave_I2C.c" ist die "Slave_test" Funktion wo der I2C 
initialisiert wird und ganz unten in die Interruptroutine geht.
-In "lpc11xx_i2c.c" ist die "I2C_SlaveHandler" (Interrupt) Funktion in 
der sich eigentlich alles abspielt.

Bitte Ignoriert in der "I2C_SlaveHandler" Funktion die UART befehle die 
sind nur für das Debuggen und haben nichts an dem Verhalten geändert.

Hier das was mein Debugger ausspuckt:

Erklärung für weiter unten:
10 = No status information
11 = OWN SLA+W received , ACK returned
12 = DATA received, ADDRPOINTER written, ACK returned
13 = DATA received, Register written, ACK returned
14 = DATA reveived, no ACK
15 = Repeated start
16 = OWN SLA+R received, rep_start+addr_set flags TRUE, ACK returned
17 = OWN SLA+R reveived, rep_start+addr_set flags FALSE. ACK returnd
18 = END of transmission

reading from slave:  11 12 15 16 16 18
writing to slave  :  11 12 13 13 13 18
------------------------------------------------------------------------ 
--

Nach beenden eines Schreib-, oder Lese-zykluses habe ich mal die 
Register ausgeben lassen. Dort gibt es bis auf DAT keine Unterschiede.
Jedes Register ist 32bit und in HEX dargestellt.

           WRITING          READING
CNCLR    15 11 00 00      15 11 00 00
CONSET   15 11 00 00      15 11 00 00
DAT      15 11 00 00      00 15 11 00
MMCTRL   48 04 00 10      48 04 00 10
SCLH     15 11 00 00      15 11 00 00
SCLL     15 11 00 00      15 11 00 00
STAT     10 22 5A 70      10 22 5A 70


Ich hoffe ihr könnt euch einen Durchblick verschaffen und mir ein wenig 
unter die Arme greifen :)

LG,
Florian

von Florian R. (rager)


Angehängte Dateien:

Lesenswert?

Ich habe noch ein paar OSZI Bilder gemacht und beschriftet.
Seite 1.  Von dem Slave lesen
Seite 2.  Zum Slave schreiben, wobei das erste Mal mit langsamer 
Wiederholrate und die Bilder mit der schnellen Wiederholrate gleich 
aussehen.
Seite 3. Zum Slave schreiben mit langsamer Wiederholrate, die zweite 
Übertragung.

LG,
Florian

PS.
Der Slave hat die Adresse 0x10.
Der Master startet beim senden mit Register 0x01 und schickt 3 Bytes, 
oder
der Master startet beim lesen mit Register 0x00 und erbittet 2 Bytes.

von Lothar (Gast)


Lesenswert?


von Florian R. (rager)


Lesenswert?

Hey,
danke für den Link ich denke er hat mir geholfen. Jetzt klappt es 
jedenfalls wie es soll.
Leider bin ich mir nicht sicher wo ich den Fehler drin hatte.
Das Thema ist hier jetzt abgeschlossen. Falls jemand einen Slave haben 
möchte kann mich jetzt gerne anschreiben.

LG,
Florian

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.