www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C mit PIC18 als Slave - C-Code gesucht!


Autor: Philipp H. (phil1403)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen, ich bekomme es einfach nicht hin meine beiden PIC18F4680 
im Master-Slave Verbund zu betreiben!!

Was funktioniert?
- Master kann Daten an Slave senden, und Slave kann empfangen
(das heißt, beide sind richtig initialisiert)

Was funktioniert nicht?
- Slave kann keine Daten an den Master senden - zumindest kommt nur die 
Adresse des Slaves um ein Bit nach links verschoben zurück! bzw. gar 
nichts

Ich steig da nicht mehr durch. Habe auch schon probiert einen 
Temp.sensor DS1624 zu befragen (auszulesen) um sicher zu gehen ob ich 
nicht schon ganz irre bin ;) ... es hat auch funktioniert!

Hat jemand schonmal einen funktionsfähigen Slave für I2C aufgesetzt und 
kann den C-Code hier posten??

Ich wäre demjenigen sehr dankbar!!!!!!

Autor: Axel Krüger (axel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was heisst Slave kann keine Daten an Master senden? Willst du vom dem 
Slave nur Daten abholen oder soll er als Master selber Daten zum anderen 
Master (der dann als Slave fungiert) senden ? (ich denke du meinst 
ersteres)

Was von deinem Slave zurueck kommt haengt nur davon ab, was du deinem 
Slave befehlst zu senden, wenn er denn vom Master "gefragt" wird.

Hier wirst du fuendig: Beitrag "TWI / I2C einf. MASTER SLAVE Beispiel(Assembler) ATmega8"
(letzter Beitrag). Ob man das nun so wie dort macht oder mit Interrupts 
arbeitet ist im Prinzip gleich. Der Code sollte auch auf einem PIC ohne 
Probleme portierbar sein da der Ablauf gleich ist. Gibt es kein 
Datenblatt zu dem Pic ? Zumindestens beim Atmega steht alles bis aufs 
kleinste erklaert.

ansonsten waere ggf gut wenn du deinen Code postest.

gruss

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein ganz ähnliches Problem (oder exakt dasselbe?).
2 PICs per I2C verbunden. Master=PIC18F2585, Slave=PIC18F4680.
Den Datenverkehr protokolliere ich wegen der Fehlfunktion via 
CAN-Verbindung zu einem CAN-Monitor auf PC. Das funktioniert auch sehr 
gut.

Kommunikation Master -> Slave
Zur Anforderung von Daten sendet der Master zuerst ein Paket mit einem 
Steuercode (eigenes Protokoll: Startcode, Länge, Steuercode, CRC) zum 
Slave. Das funktioniert korrekt, beide PICs melden über den CAN-Bus den 
Inhalt den Sende- bzw. Empfangspuffers und beides ist korrekt. Daraufhin 
füllt der Slave den Sendepuffer mit den angeforderten Daten

Kommunikation Slave -> Master
Der Master liest die Daten vom Slave aus. Der Slave zeigt via CAN-Bus 
einen korrekt gefüllten Sendepuffer. Der Master zeigt jedoch als erstes 
Byte in seinem Empfangspuffer 0x0e (was die Slave-Adresse 0x07 << 1 
wäre, wie von Philipp H. beschrieben). Erst danach kommt der erwartete 
Inhalt des Puffers.

Testweise habe ich einen anderen Slave angeschlossen (ein TFT-Display 
von Electronics Assembly) und mit deren vorgefertigtem Protokoll 
gearbeitet. Da funktioniert alles wie erwartet. Demnach muss der Fehler 
im Slave liegen. Ich habe schon alles ausprobiert mit der Reihenfolge 
von SSPIF, Release Clock Line und BF (->SSPBUF) setzen/rücksetzen aber 
es ändert sich nichts!
Kennt irgend jemand dieses Problem und womöglich eine Lösung?

Vielen Dank schon mal
Stephan

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Slave und der Master müssen beide das Clock-Stretching unterstützen.

Der Slave hält dazu SCL solange auf Low, bis er das zu sendende Byte in 
das Senderegister geschrieben hat.
Und der Master wartet solange, bis er auf SCL High liest.


Peter

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beide PICs unterstützen Clock Stretching. Der Slave ist so eingestellt, 
dass er auch bei Slave-Receive stretcht (bei Slave-Transmit ist das 
zwangsweise). Das benötige ich, da die CAN-Bus Kommunikation Vorrang 
hat. Wegen der Stretcherei gehe ich davon aus dass das Timing unkritisch 
wird. Daher habe ich auch versuchsweise die ganze I2C Kommunikation aus 
den Interrupt Service Routinen herausgenommen und arbeite sie in der 
Main Loop nach Polling von SSPIF ab.

Stephan

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.