mikrocontroller.net

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


Autor: Eee E. (snake4)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das RW bit steht mal mindestens am anderen ende

gehts nun immernoch nicht? ;)

Autor: Eee E. (snake4)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eee E. (snake4)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: John Bauer (johnbauer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eee E. (snake4)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. Jetzt funktioniert das alles.

Falls das mal jemand brauchen sollte:

SSPCON1bits.CKP = 1;

MfG

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.