Hallo, ich habe 2 Pics die über I2C kommunizieren sollen. Eins ist der Master. Wenn ich mit ihm den Start auslöse kann ich danach jedes beliebige byte senden und es mit dem Slave lesen. Auser 0b1"Slave Adresse", was ich ja machen müsste wenn der Slave dem Master Daten senden soll? Alles was ich sende löst einen Interrupt aus, auser diesem einen byte!?! Ist das Absicht oder hat jemand eine Ahnung was ich falsch machen könnte? MfG
das RW bit steht mal mindestens am anderen ende gehts nun immernoch nicht? ;)
Danke (-: Was ich das schon falsch rum gedreht habe, das kann man nicht mehr zählen. Ich dachte ich hätte es diesmal richtig weil es ja heißt die Adresse gefolgt von dem Read/Write und da die bits ja falschrum sind dachte ich es gehört auch an das andere Ende. Aber jetzt habe ich gesehen sie werden ja auch rückwärts versandt. Naja. Jetzt geht, der Teil. Der Rest hat mich aber auch davor schon verwirrt. Beispiel: Master: - Start - Adresse und 1 Slave: - Meine Adress? Read/Write? - Ack Wobei dann das Problem auftritt. Ich möchte jetzt dem Slave sagen was ich haben möchte, aber ich kann vom Master aus nichts mehr senden? Und woher weis dann der Slave nach wie vielen Bytes er dann dran ist um zu antworten? Ich dachte das sollte ja fast irgendwo im Internet stehen, so ein Ablauf, aber irgendwie konnte ich nicht das richtige finden, vielleicht mache ich ja auch wieder was falsch?
Üblich ist folgende Reihenfolge fürs lesen: START ADRESSE | 0x00 REGISTERADRESSE RESTART ADRESSE | 0x01 lesen + ACK (ACK kommt vom Master) lesen + ACK (ACK kommt vom Master) lesen + ACK (ACK kommt vom Master) lesen + NACK (NACK kommt vom Master) STOP Fürs Schreiben und wenn dein Slave autoincrement kann: START ADRESSE | 0x00 REGISTERADRESSE DATEN + ACK (ACK kommt vom Slave) DATEN + ACK (ACK kommt vom Slave) DATEN + ACK (ACK kommt vom Slave) DATEN + ACK (ACK kommt vom Slave) . . STOP
Schreiben ist eigentlich kein Problem, das funktioniert ausnahmsweise mal ohne Problem. Der Slave ist wie der Master ein PIC den ich programmiere, also kann er was ich ihm sage. Das lesen funktioniert aber irgendwie immer noch nicht. Ich mache Start, Adresse 0x01. Das erkennt der Slave auch. Danach muss ich mit dem Slave Daten schreiben wie ich es mit dem Master machen würde? Der Master wartet dann so lange und liest dann die Daten und sendet ein NACK (sagt damit: jetzt reichts) und macht einen Stop? Das Problem ist aber beim Slave: if (SSPSTATbits.R) { WriteI2C(0x44); // Hier bleibt er hängen. } Das ist die funktion vom C18.
Hallo, der Slave sendet keine Daten an den Master, er stellt nur die Daten in seinem Buffer bereit. Solange das dauert zieht er die Clock-Leitung auf low. Sobald die Clock-Leitung wieder high ist, liest der Master die Daten aus dem Buffer des Slaves. Gruß John
Danke. Jetzt funktioniert das alles. Falls das mal jemand brauchen sollte: SSPCON1bits.CKP = 1; MfG
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.