Forum: Mikrocontroller und Digitale Elektronik PIC I2C Host blockiert Acknowledge


von Philip (psk)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Leider habe ich keinen passenden Beitrag zu meinem Problem gefunden.
Ich habe vor, zu Testzwecken und zum Ausprobieren, zwei PIC18F27Q83 
miteinander über I2C kommunizieren lassen.

Dazu soll der Host 4 Bytes (4 Übertragungen) vom Clienten empfangen. Das 
Ganze soll sich ca. alle 10ms wiederholen (Unterprogramm 
„I2CUebertragung“ wird aufgerufen).

Das Problem, nach dem ersten erfolgreichen Durchgang wird nur noch das 
Adressebyte des Hosts im zweiten Durchgang gesendet und das wars. Wenn 
ich die Übertragung genauer mit dem Oszilloskop analysiere, stelle ich 
fest, dass beim neunten Takt des SCL die Datenleitung SDA hart auf 1 
bleibt und vom Host gehalten wird, obwohl dieser ja eigentlich auf das 
Acknowledge-Singal vom Clienten warten soll (ich hoffe es wird durch die 
Anhänge verständlicher).
Auch wenn ich den Adressbuffer deaktiviere (ADB = 0) und das Adressbyte 
in I2C1TXB schreibe, bleibt das neunte Bit auf 1.

Wenn ich die entsprechenden Bits vom Clienten überprüfe, stelle ich 
fest, das dieser beim zweiten Versuch auf jeden Fall das Startsignal 
(SCIF = 1) sowie die Adressierung (ADRIF = 1) erkennt und das 
Acknowledge-Bit senden will (ACKDT = 0). Nur, er kann es nicht senden, 
der Host ist, warum auch immer, dagegen.

Hat vielleicht irgend jemand eine Idee, warum der Host das 
Acknowlegde-Singal „blockiert“?
Und warum funktioniert das beim ersten 
Durchgang und dann nicht mehr? Muss ich vielleicht noch irgendwas zurück 
setzen, was ich übersehen habe?
Die Übertragung in die andere Richtung (Host sendet Bytes) funktioniert 
einwandfrei.

Vielen Dank für eure Hilfe.

Grüße
Philip

von Peter D. (peda)


Lesenswert?

Was ist rtf, ich kann nur C.

von Hmmm (hmmm)


Lesenswert?

Philip schrieb:
> stelle ich fest, dass beim neunten Takt des SCL die Datenleitung SDA
> hart auf 1 bleibt und vom Host gehalten wird

Mit welcher Messung begründest Du diese Annahme?

von Philip (psk)


Lesenswert?

Peter D. schrieb:
> Was ist rtf, ich kann nur C.

Vielen Dank für die Antwort.

rtf ist ein Textformat, welches mein Mac standardmäßig verwendet. Ich 
wollte nur die relevanten Programmzeilen kopieren.
Es sollte aber auch von Windows-Computern geöffnet werden können.

Grüße Philip

von Philip (psk)


Lesenswert?

Hmmm schrieb:
> Philip schrieb:
>> stelle ich fest, dass beim neunten Takt des SCL die Datenleitung SDA
>> hart auf 1 bleibt und vom Host gehalten wird
>
> Mit welcher Messung begründest Du diese Annahme?

Vielen Dank für die Antwort.

Einmal begründe ich diese Annahme mit den angehängten 
Oszilloskopauswertungen, zudem habe ich die Messung auch mit einem 
Widerstand zwischen Host und Client auf der Datenleitung durchgeführt.
Dabei konnte ich die Signale an den Ports der jeweiligen Pics 
vergleichen und somit feststellen, woher die Spannung (das Signal) 
kommt.

Grüße Philip

von Ali K. (teddy50)


Lesenswert?

Ein I2C-Sender oder Empfänger kann eine I2C Leitung niemals auf 1 
blockieren, da die Leitungen Open-Collector sind.

Dein Empfänger reagiert nicht.
Ganz einfach.

von Philip (psk)


Lesenswert?

Ali K. schrieb:
> Ein I2C-Sender oder Empfänger kann eine I2C Leitung niemals auf 1
> blockieren, da die Leitungen Open-Collector sind.
>
> Dein Empfänger reagiert nicht.
> Ganz einfach.

Vielen Dank für die Antwort,

stimmt, das klingt logisch.
Aber warum reagiert dann der Client nicht, obwohl er das ADRIF und das 
ACKDT entsprechend richtig setzt? Das widerspricht sich ja eigentlich.
Vor allem, weil ja auch der erste Durchgang funktioniert.
Beide Pics sind, bis auf den Modus, gleich konfiguriert

Grüße
Philip

von Rainer W. (rawi)


Lesenswert?

Philip schrieb:
> Wenn ich die Übertragung genauer mit dem Oszilloskop analysiere, stelle ich
> fest, dass beim neunten Takt des SCL die Datenleitung SDA hart auf 1
> bleibt und vom Host gehalten wird ...

Das kann und darf nicht sein. Bei I2C ist der High-Pegel sowohl auf SDA 
als auch auf SCL rezessiv und wird durch Pull-Up Widerstände erzeugt. 
Wenn dein Host die Leitung auf 1 zieht, ist der GPIO grundlegend falsch 
konfiguriert.

: Bearbeitet durch User
von Sebastian W. (wangnick)


Angehängte Dateien:

Lesenswert?

Philip schrieb:
> rtf ist ein Textformat, welches mein Mac standardmäßig verwendet. Ich
> wollte nur die relevanten Programmzeilen kopieren.
> Es sollte aber auch von Windows-Computern geöffnet werden können.

So sieht deine Datei beim Öffnen auf meinem Samsung aus.

LG, Sebastian

von Rainer W. (rawi)


Lesenswert?

Philip schrieb:
> rtf ist ein Textformat,

Warum lädst du C-Quellcode als Datei im RTF hoch und nicht als C-Datei?
Das verwirrt jeden Viewer. Jeder C-Compiler wird sich weigern.

: Bearbeitet durch User
von Hmmm (hmmm)


Lesenswert?

Philip schrieb:
> rtf ist ein Textformat, welches mein Mac standardmäßig verwendet.

Auch das Apple-Zeug kennt normale Textdateien. Die werden dann auch 
nicht im Office-Paket in 20pt-Blindenschrift geöffnet.

Ich sehe darin auch keinen Source Code, nur zusammenhanglos 
zusammenkopierte Schnipsel.

Philip schrieb:
> Aber warum reagiert dann der Client nicht, obwohl er das ADRIF und das
> ACKDT entsprechend richtig setzt? Das widerspricht sich ja eigentlich.
> Vor allem, weil ja auch der erste Durchgang funktioniert.

Hilfreich wäre mal eine Logic-Analyzer-Aufzeichnung der gesamten 
I2C-Kommunikation.

Schickt der Host nach dem letzten empfangenen Byte standardkonform ein 
NACK?

von Philip (psk)


Angehängte Dateien:

Lesenswert?

Sebastian W. schrieb:
> Philip schrieb:
>> rtf ist ein Textformat, welches mein Mac standardmäßig verwendet. Ich
>> wollte nur die relevanten Programmzeilen kopieren.
>> Es sollte aber auch von Windows-Computern geöffnet werden können.
>
> So sieht deine Datei beim Öffnen auf meinem Samsung aus.
>
> LG, Sebastian



Oke, danke für die Info.

Ich habe die Dateien jetzt nochmal als .doc erstellt. Ein .txt Format 
wird leider zu sehr verzogen. Ich hoffe das klappt jetzt.

Grüße
Philip

von Ali K. (teddy50)


Lesenswert?

Warum hängst du nicht einfach die .c Dateien an?
Programmierst du in Word?

von Philip (psk)


Lesenswert?

Rainer W. schrieb:

>
> Warum lädst du C-Quellcode als Datei im RTF hoch und nicht als C-Datei?
> Das verwirrt jeden Viewer. Jeder C-Compiler wird sich weigern.


Hallo Rainer,

tut mir Leid, ich dachte die .rtf-Dateien kann jeder lesen.
Leider besteht der Code nicht nur aus der I2C-Übertragung, sondern auch 
noch aus vielen anderen Unterprogrammen. Es wäre zu viel gewesen, die 
komplette C-Datei hoch zu laden. Oder gibt es eine Möglichkeit, ein Teil 
eines C-Codes zu exportieren?

Grüße
Philip

von Philip (psk)


Angehängte Dateien:

Lesenswert?

> Auch das Apple-Zeug kennt normale Textdateien. Die werden dann auch
> nicht im Office-Paket in 20pt-Blindenschrift geöffnet.
>
> Ich sehe darin auch keinen Source Code, nur zusammenhanglos
> zusammenkopierte Schnipsel.
>

Danke für die Antwort,

Sorry, ich dachte die rtf-Dateien kann jeder öffnen.
Im Anhang nochmal die Dateien als Dokument (ich hoffe das geht). Die 
Textdatei wird leider zu sehr "verzogen". Die komplette C-Datei 
beinhaltet leider zu viel Programmcode, was nichts mit I2C zu tun hat, 
deshalb die Ausschnitte.


> Philip schrieb:
>> Aber warum reagiert dann der Client nicht, obwohl er das ADRIF und das
>> ACKDT entsprechend richtig setzt? Das widerspricht sich ja eigentlich.
>> Vor allem, weil ja auch der erste Durchgang funktioniert.
>
> Hilfreich wäre mal eine Logic-Analyzer-Aufzeichnung der gesamten
> I2C-Kommunikation.
>
> Schickt der Host nach dem letzten empfangenen Byte standardkonform ein
> NACK?


Einen Logic-Analyzer hat mein Oszilloskop leider nicht.
Ja, ein NACK wird beim ersten Durchlauf nach dem letzten empfangenen 
Byte vom Host gesendet, ebenso eine Stopproutine.

Danke für die Antwort.
Grüße
Philip

von Gustl B. (gustl_b)


Lesenswert?

Philip schrieb:
> Im Anhang nochmal die Dateien als Dokument (ich hoffe das geht). Die
> Textdatei wird leider zu sehr "verzogen". Die komplette C-Datei
> beinhaltet leider zu viel Programmcode, was nichts mit I2C zu tun hat,
> deshalb die Ausschnitte.

Das im Anhang sind Dateien von Apple iWork im .pages Format wie die 
Dateiendung sagt. Die können hier nur die Apple-Nutzer öffnen wenn sie 
eben Pages aus iWork installiert haben.

Mach dich eine neue c Datei und kopiere da nur das rein was du hier 
mitteilen willst. Und dann lädst du hier eben diese c Datei hoch. Kein 
.doc, kein .pages, kein .rtf, kein .txt nur eine .c datei die den Code 
enthält. Das alles kannst du wunderbar im Finder oder noch besser mit 
dem Terminal das es auf jedem Mac gibt erledigen.

Der Texteditor auf dem Mac, also was was bei Windows Notepad ist, heißt 
TextEdit. Der kann .c öffnen und der kann auch plaintext.

: Bearbeitet durch User
von Philip (psk)


Angehängte Dateien:

Lesenswert?

> Das im Anhang sind Dateien von Apple iWork im .pages Format wie die
> Dateiendung sagt. Die können hier nur die Apple-Nutzer öffnen wenn sie
> eben Pages aus iWork installiert haben.
>
> Mach dich eine neue c Datei und kopiere da nur das rein was du hier
> mitteilen willst. Und dann lädst du hier eben diese c Datei hoch. Kein
> .doc, kein .pages, kein .rtf, kein .txt nur eine .c datei die den Code
> enthält. Das alles kannst du wunderbar im Finder oder noch besser mit
> dem Terminal das es auf jedem Mac gibt erledigen.
>
> Der Texteditor auf dem Mac, also was was bei Windows Notepad ist, heißt
> TextEdit. Der kann .c öffnen und der kann auch plaintext.


Oke sorry,

ich habe jetzt den relevanten Programmcode, wie du vorgeschlagen hast, 
in eine Extra neu erstellte C-Datei eingefügt.
Ich hoffe das klappt jetzt mal.

Danke
Grüße
Philip

von Hmmm (hmmm)


Lesenswert?

Du pollst die Interrupt-Flags (statt mit Interrupts zu arbeiten), aber 
clearst sie nie?

von Philip (psk)


Lesenswert?

Hmmm schrieb:
> Du pollst die Interrupt-Flags (statt mit Interrupts zu arbeiten), aber
> clearst sie nie?

Ja, tatsächlich bin ich nicht der Fan von interrupts.
Habe diese nun mit I2C1PIR = 0 gelöscht, der Fehler ist immer noch 
vorhanden.

Grüße
Philip

von Hmmm (hmmm)


Lesenswert?

Philip schrieb:
> Habe diese nun mit I2C1PIR = 0 gelöscht

Mir fehlt die Erfahrung mit PICs, das scheint aber nicht auszureichen, 
um alle I2C-Interrupt-Flags zu clearen:

https://onlinedocs.microchip.com/pr/GUID-CA6B1F8F-E09D-4780-A52A-CBBF61902464-en-US-2/GUID-5968B4BD-0262-48DA-81B6-174488D5B92F.html

von Philip (psk)


Lesenswert?

>
> Mir fehlt die Erfahrung mit PICs, das scheint aber nicht auszureichen,
> um alle I2C-Interrupt-Flags zu clearen:
>
> 
https://onlinedocs.microchip.com/pr/GUID-CA6B1F8F-E09D-4780-A52A-CBBF61902464-en-US-2/GUID-5968B4BD-0262-48DA-81B6-174488D5B92F.html

Vielen Dank für die Antwort.

Ich habe nun alle Register zurückgesetzt, wie in Initialisierung im 
Link. Wobei ich nicht ganz verstehe, warum das PIR-Register gelöscht 
wird, da es sich um only read bits handelt.
Leider brachte dies auch keinen Erfolg.

Zudem habe ich inzwischen festgestellt, dass das SMA-Bit (Client aktiv) 
nicht gesetzt wird, es liegt also definitiv am Clienten, der beim 
zweiten Durchgang nicht mehr auf die Adresse antwortet.

Grüße
Philip

von Stephan S. (uxdx)


Lesenswert?

Philip schrieb:
> rtf ist ein Textformat, welches mein Mac standardmäßig verwendet. Ich
> wollte nur die relevanten Programmzeilen kopieren.
> Es sollte aber auch von Windows-Computern geöffnet werden können.

Das geht in Windows mit Wordpad, das ist eine Textverarbeitung, oder mit 
einem anderen Textverarbeitungsprogramm. Wordpad ist EOL, soll angeblich 
bei einem der Updates sogar verschwinden. Und es gibt Leute, die lesen 
hier mit einem "Wischkästla", die schauen durch die Röhre. Auch Linux 
braucht dafür eine Textverarbeitung

Bitte verwende künftig hier das TXT-Format, das kann wirklich jeder.

von Philip (psk)


Angehängte Dateien:

Lesenswert?

Ich verzweifle langsam und hänge schon seit Wochen an den Problem 😩.

Egal was ich mache, zurücksetze, einstelle und ausprobiere, der blöde 
Client will im Transmission-Mode einfach kein zweites mal die Adresse 
erkennen.

Hat denn sonst niemand eine Idee?
Im Anhang nochmal der relevante Code als C-Datei.

Bin für jede Hilfe dankbar.

Grüße
Philip

von Ali K. (teddy50)


Angehängte Dateien:

Lesenswert?

Ich sehe nirgends wo du nach einem Empfang ein NACK sendest.
Du musst schon einstellen, ob du ein NACK oder ACK senden willst. Das 
passiert nicht automatisch.

von Philip (psk)


Lesenswert?

Ali K. schrieb:
> Ich sehe nirgends wo du nach einem Empfang ein NACK sendest.
> Du musst schon einstellen, ob du ein NACK oder ACK senden willst. Das
> passiert nicht automatisch.

Vielen Dank für die Info.
Die Einstellungen für ACK und NACK haben tatsächlich noch gefehlt. 
Leider löste die Ergänzung das Problem auch nicht.

Allerdings habe ich inzwischen festgestellt, dass ein zurücksetzen des 
TXU bist (Transmission unterflow) dazu führt, dass der Client die 
Adresse erkennt. Es wird also irgendwo ein underflow ausgelöst, obwohl, 
laut Oszi, die gesendeten Bytes überall korrekt vorhanden sind.

Zudem beendet nur der Host im zweiten Durchgang nach einer 
Datenübertragung den Vorgang und beendet die Übertragung mit einem NACK. 
Das Problem wurde sozusagen zum Host verlagert.

Grüße
Philip

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.