mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pic I2C Slave


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von derneue (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle

Das Thema ist nicht neues, jedoch konnte ich nichts konkretes zu finden.
Folgendes: Ich möchte mein PIC16F als I2C Slave betreiben.

Orientiert habe ich mich an folgender Seite/code:
http://www.stefan-buchgeher.info/elektronik/i2c_pic_slave/i2c_slave_pic_kap5.html

Erstens was ich nicht verstehe: nirgends im Code(auch im weiten wwww) 
sehe ich kein Slave der ein ACK bzw. NACK sendet?! Wie kommts? Der Slave 
muss doch als Bestätigung für den Master ein ACK/NACK Senden.

Übertragung funktioniert nicht. Es werden nur paar Taktzeilen gesendet 
und dann hört es auf bzw bleibt der Bus auf Low..

Die Codebeispiele online sehen alle ähnlich aus, nie ohne setzen von 
ACks. Aber keins davon funktioniert.

Entsprechende TRIS/ANSEL und PPS sind richtig gesetzt. (Als Master 
funktioniert alles richtig)

lG

von Toby P. (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
derneue schrieb:
> Der Slave
> muss doch als Bestätigung für den Master ein ACK/NACK Senden.
M.w. nein, es gibt kein Ack/Nack.

Wenn der der Slave zu langsam ist s. I2C clock stretching.

von Michael (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Welcher PIC ist es denn genau? Wenn du nur PIC16F schreibst, denke ich 
an so alte Gurken wie PIC16F684 oder ähnliche...

Das entsprechende Datenblatt deines PICs enthält sicherlich eine genaue 
Registerbeschreibung - ich setze ebenfalls I2C auf vielen PIC ein, habe 
keine Probleme damit.

Wenn man dir also wirklich weiterhelfen soll, zeige mal deinen Code usw.


Viele Grüße,

Michael

von Stefan F. (stefanus)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Wie kommt man auf die Idee, eine Seite so zu designen? Man kann das 
nichtmal in die Zwischenablage kopieren. Das geht ja gar nicht!

> Die Codebeispiele online sehen alle ähnlich aus, nie
> ohne setzen von ACks. Aber keins davon funktioniert.


Offenbar ist im Register SSPCON2 das Bit 4 (ACKEN) immer 1.

: Bearbeitet durch User
von Michael (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Toby P. schrieb:
> M.w. nein, es gibt kein Ack/Nack.

Wie soll I2C ohne funktionieren??

Hast du selbst schon einmal mit der I2C-Einheit eines PIC gearbeitet?

Siehe beispielsweise Seite 260:

http://ww1.microchip.com/downloads/en/devicedoc/41440a.pdf

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Toby P. schrieb:
>> M.w. nein, es gibt kein Ack/Nack.
>
> Wie soll I2C ohne funktionieren??
>
> Hast du selbst schon einmal mit der I2C-Einheit eines PIC gearbeitet?

Was die I²C-Einheit eines PIC macht, ist zwar schön und gut, aber 
entscheindend ist, was die I²C-Bus Spezifikation sagt.

Und da steht im Abschnitt 7.2 Acknowledge (S.10): "... Usually, a 
receiver which has been addressed is obliged to generate an acknowledge 
after each byte has been received". Dem ist nichts hinzu zu fügen.
http://i2c2p.twibright.com/spec/i2c.pdf

von Michael (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Was die I²C-Einheit eines PIC macht, ist zwar schön und gut, aber
> entscheindend ist, was die I²C-Bus Spezifikation sagt.

Wo siehst du da eine Diskrepanz?

"Toby P. (Gast)" hat geschrieben, dass der PIC keine ACK erzeugen würde. 
Das stimmt nicht, wenn du ACK haben willst, setze einfach die 
entsprechenden Bits korrekt und der PIC beantwortet dir jedes Byte mit 
einem ACK.

Das ist alles im Datenblatt beschrieben, inwiefern soll dem Fragesteller 
der Hinweis auf die I2C-Spezifikation hier weiterhelfen?

Wenn man erfährt, um welchen PIC es genau geht, kann man problemlos im 
betreffenden Datenblatt nachsehen, ich habe nur ein zufälliges 
ausgewählt, um zu zeigen, dass es hier keine fehlende Funktionalität 
gibt.

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Wo siehst du da eine Diskrepanz?

Nirgends. Für den I²C-Bus ist aber die Spezifikation der Maßstab der 
Dinge und nicht eine Implementation auf irgendeinem Chip ...

von Michael (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Nirgends. Für den I²C-Bus ist aber die Spezifikation der Maßstab der
> Dinge und nicht eine Implementation auf irgendeinem Chip ...

Schon klar, aber die Frage hier dreht sich alleine darum, wie man mit 
der vorhandenen Implementation das korrekte Verhalten erzielt. Hierfür 
ist einzig das Datenblatt des Controllers relevant. Wenn man weiß, 
welcher konkrete PIC es ist, kann man ganz knapp sagen: Setze diese Bits 
so und so, fertig...

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Schon klar, aber die Frage hier dreht sich alleine darum, ...

Es ging um die Richtigstellung, dass es sehr wohl ein Ack gibt und der 
Slave dieses lt. I²C Spezifikation schicken muss.

Toby P. schrieb:
> derneue schrieb:
>> Der Slave
>> muss doch als Bestätigung für den Master ein ACK/NACK Senden.
> M.w. nein, es gibt kein Ack/Nack.

von Frank K. (fchk)


Bewertung
0 lesenswert
nicht lesenswert
Lies mal das, was Microchip selber zu dem Thema schreibt.

http://ww1.microchip.com/downloads/en/appnotes/00000734c.pdf
https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en011798

Das Zeug funktioniert, das habe ich als Basis für meinen Code genommen.

fchk

von Toby P. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Toby P. schrieb:
>> M.w. nein, es gibt kein Ack/Nack.
> Wie soll I2C ohne funktionieren??
> Hast du selbst schon einmal mit der I2C-Einheit eines PIC gearbeitet?

Ja habe ich, sogar sehr ausführlich als komplette Steuerung mit I2C 
Bussystem. Das schütz aber wohl nicht gegen falsche Erinnerung.
Sorry für die Konfusion.

von derneue (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Danke an alle!

Ich habe mir eben die Application Note von Microchip durchgelesen, und 
da wird genau nur einmal erwähnt dass die Hardware den Ack generiert.. 
(http://ww1.microchip.com/downloads/en/appnotes/00000734c.pdf) seite 5, 
schritt 4

Benutzt wird ein PIC16F15-354

Code sieht folgendermaßen aus:
 
if(PIR3bits.SSP1IF){
        PIR3bits.SSP1IF=0;

        //Master sendet Schreibbefehl, Slave muss lesen
        if (!SSP1STATbits.R_W) {
            //adress match
              
            // Adresse
            if (!SSP1STATbits.D_A) {
                dummy=SSP1BUF; //read, 6)
                SSP1STATbits.BF=0;
                SSP1CON1bits.CKP=1;
                PIR3bits.SSP1IF=0;
                return;
            }
            // Daten
            else if (SSP1STATbits.D_A) {
                message=SSP1BUF;
                SSP1CON1bits.CKP=1;
                PIR3bits.SSP1IF=0;
                return;
            }
        } else if (SSP1STATbits.R_W) {
              // wird nicht benötigt.
        }
    }

von Stefan F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
derneue schrieb:
> da wird genau nur einmal erwähnt dass die Hardware den Ack generiert

Das ist beides normal, dass der Hersteller solche Dinge nur einmal 
hinschreibt und dass die Hardware es selbst macht.

Ich habe nicht umsonst schon ziemlich früh dies geantwortet:

> Offenbar ist im Register SSPCON2 das Bit 4 (ACKEN) immer 1.

Zusammen mit einem Screenshot von der scheußlichen Webseite, wo dieses 
Bit knapp beschrieben ist.

von derneue (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Problem besteht immer noch. Sogar der Code von Microchip läuft nicht. 
AUßer ein paar Random Takte kommt da nichts.

von Stefan F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Hat dein I²C Bus Pull-Up Widerstände? Wie sehen die Signale auf dem 
Oszilloskop aus?

von Rainer S. (enevile)


Bewertung
0 lesenswert
nicht lesenswert
derneue schrieb:
> Sogar der Code von Microchip läuft nicht.

Damit weiß man doch schon das der Fehler bei dir liegt.
Bilder vom Schaltplan wären nicht verkehrt.

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.

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