Forum: Mikrocontroller und Digitale Elektronik Lesen von PIC als I2C Slave


von Eee E. (snake4)


Lesenswert?

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

von Michael H. (morph1)


Lesenswert?

das RW bit steht mal mindestens am anderen ende

gehts nun immernoch nicht? ;)

von Eee E. (snake4)


Lesenswert?

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?

von Michael H. (morph1)


Lesenswert?

Ü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

von Eee E. (snake4)


Lesenswert?

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.

von John B. (johnbauer)


Lesenswert?

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

von Eee E. (snake4)


Lesenswert?

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
Noch kein Account? Hier anmelden.