Lesen von PIC als I2C Slave

OP #1614935
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
OP
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
OP
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.