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
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.
Schon mal in die CodeBase reingesehen: i2c.c http://www.microbuilder.eu/Projects/LPC1114ReferenceDesign/LPC1114CodeBase.aspx
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.