Forum: Mikrocontroller und Digitale Elektronik PCA9685 I2C Probleme, SCL hängt


von Dob S. (dobstronsky)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe ein PCB designed auf dem ein Raspberry Pico steckt, der sich 
via I2C mit einem PCA9685 unterhält. 3,3V 4k7 Pull-Ups. Funktioniert 
super.

Ich habe nun ein zweites PCB an den Bus gehängt (vollkommen unbestückt 
außer PCA und Kondensatoren). Das zweite Board hat alleine auch super 
funktioniert.

Dann kam ein Timeout,
ich adressierte nur den PCA auf dem zweiten Board mit DutyCycle 
Befehlen. Das ging eine Minute gut, dann gab es ein Timeout und seit dem 
hängt die SCL Leitung auf 1V.  Wenn ich das Board länger liegen lasse 
läuft die Kommunikation zwar wieder aber das High Level der SCL-Leitung 
liegt bei fehlerhaften 2,2V, nach einigen erfolgreichen 
DutyCycle-Befehlen kommt dann wieder ein Timeout.

Für mich sieht es so aus als blockiert der PCA nicht nur den BUS sondern 
der PCA schein defekt. Der PCA auf Board 1 funktionierte weiterhin 
einwandfrei.
ich poste mal unten den Code, der den PCA auf Board 2 adressiert und für 
den Defekt sorgte.

Auf dem Pico läuft Circuitpython, ich nutze Gp1 und GP0 für SCL und SDA.
Pull-Ups gab es im Moment des Versagens nur auf Board1, auf Board 2 habe 
ich sie nach dem Testen entfernt.

In meinem letzten Projekt hatte ich einen Pico (Micropython) mit 5 
ATTinys verbunden ohne Probleme. Demnach musste ich nicht sehr tief in 
die I2C-Welt eintauchen.

Hat irgendjemand eine Ahnung was ich falsch mache? Muss jeder PCA seine 
eigenen Pull-Ups haben? Die Größe dann so wählen, dass der 
Gesamtwiderstand bei 5k bleibt?

import time
import board
import busio
from adafruit_pca9685 import PCA9685

def init_pca():
    """I2C und PCA9685 initialisieren"""
    i2c = busio.I2C(scl=board.GP1, sda=board.GP0, frequency=100000)
    pca = PCA9685(i2c, address=0x41)
    pca.frequency = 100
    return i2c, pca

i2c, pca = init_pca()

duty = 0.0
time_var = 0

try:
    while True:
        duty += 0.1
        if duty > 1.0:
            duty = 0.0

        try:
            # Duty-Cycle setzen
            pca.channels[0].duty_cycle = int(0xFFFF * duty)
            print(f"LED0: 100 Hz, Duty={duty*100:.1f}%, 
Time:{time_var}")
            time_var = time_var + 1
            time.sleep(1)

        except OSError as e:
            # I2C-Fehler auffangen
            print("I2C-Timeout, Bus wird neu initialisiert:", e)
            time.sleep(0.5)
            i2c, pca = init_pca()  # neu starten

except KeyboardInterrupt:
    print("Abbruch durch Benutzer")

finally:
    try:
        pca.deinit()
        print("PCA9685 deinitialisiert, Bus freigegeben")
    except Exception as e:
        print(f"Deinit übersprungen: {e}")

von Hmmm (hmmm)


Lesenswert?

Dob S. schrieb:
> 3,3V 4k7 Pull-Ups

Ganz schön hochohmig. Mal die Flanken angeguckt?

Dob S. schrieb:
> Ich habe nun ein zweites PCB an den Bus gehängt

Erhöht die Kapazität, was das o.g. Problem verschärft.

von Wastl (hartundweichware)


Lesenswert?

Dob S. schrieb:
> Hat irgendjemand eine Ahnung was ich falsch mache?

Vermutlich ist die physikalische Ausprägung deiner Leitungs-
Topologie fehleranfällig. Zu lange Leitungen und/oder stern-
förmige Verteilung. I2C ist nur mit kleinen Leitungslängen
sicher funktionsfähig. Vermutlich.

von Dob S. (dobstronsky)


Angehängte Dateien:

Lesenswert?

Leicht abgerundet, oder ist das schon doll? Komischerweise, sieht das 
nach 250 000 Hz aus obwohl im Code explizit 100000 genannt wird. Das ist 
das heile Board, übrigens.

von Dob S. (dobstronsky)


Angehängte Dateien:

Lesenswert?

Hiermal der Aufbau. Ich weiß nicht ob das gut zusehen ist. Die 
Leitungsführung ist nicht sauber, aber bei 100 000Hz bzw 250 000 Hz was 
es ja tatsächlich ist.

von Dob S. (dobstronsky)


Angehängte Dateien:

Lesenswert?

Der Aufbau

von Hmmm (hmmm)


Lesenswert?

Dob S. schrieb:
> Leicht abgerundet, oder ist das schon doll?

Das sieht OK aus, aber interessant wäre, ob das mitsamt der zweiten 
Platine immer noch so ist.

Dob S. schrieb:
> Komischerweise, sieht das nach 250 000 Hz aus

Das würde einen aussteigenden Slave erklären.

von Dob S. (dobstronsky)


Lesenswert?

Ne ich habe mich verguckt, es sind 125 000 Hz

von Wastl (hartundweichware)


Lesenswert?

Dob S. schrieb:
> Der Aufbau

Kabellänge gut versteckt damit man möglichst nichts beurteilen kann.

von Wastl (hartundweichware)


Lesenswert?

Dob S. schrieb:
> Hiermal der Aufbau.

Was soll man da erkennen? Ich schrub schon:

Wastl schrieb:
> Vermutlich ist die physikalische Ausprägung deiner Leitungs-
> Topologie fehleranfällig.

Es ist der ganze I2C Bus entscheidend, nicht deine winzigen
Leitungen auf einem Board.

von Dob S. (dobstronsky)


Lesenswert?

Wastl schrieb:
> Es ist der ganze I2C Bus entscheidend, nicht deine winzigen
> Leitungen auf einem Board.

Die I2C Leitungen gehen ab dem Connector unterhalb des Boards zum 
zweiten Board. Flachbandkabellänge 10cm

von Helmut -. (dc3yc)


Lesenswert?

Haben die beiden I2C-Teilnehmer auch unterschiedliche Adressen oder sind 
die gleich?

von Wastl (hartundweichware)


Lesenswert?

Dob S. schrieb:
> Die I2C Leitungen gehen ab dem Connector unterhalb des Boards zum
> zweiten Board.

.... und rechts davon? Ist das eine Fata Morgana oder was?

von Wastl (hartundweichware)


Lesenswert?

Dob S. schrieb:
> IMG_1699.JPG

Ich vermute auch dein Oszilloskop hat eine Screenshot-Funktion?

von Dob S. (dobstronsky)


Lesenswert?

Wastl schrieb:
> Dob S. schrieb:
>> Die I2C Leitungen gehen ab dem Connector unterhalb des Boards zum
>> zweiten Board.
>
> .... und rechts davon? Ist das eine Fata Morgana oder was?

Stimmt da geht das Kabel noch weiter für den dritten Teilnehmer.

Jap 0x40 udn 0x41. Das funktionierte auch in den Einzeltests.

Die Einzeltests liefen ohne Flachbandkabel, einfach direkt an die Pins 
des connectors.

Ich habe kein USB Stick für die Screenshotfunktion, finde ich zumindest 
nicht

von Wastl (hartundweichware)


Lesenswert?

Dob S. schrieb:
> Stimmt da geht das Kabel noch weiter für den dritten Teilnehmer.

OMG!
Entweder verstehst du überhaupt nichts oder du bist stark
beratungsresistent.

Wastl schrieb:
> Es ist der ganze I2C Bus entscheidend, nicht deine winzigen
> Leitungen auf einem Board.

Wastl schrieb:
> Vermutlich ist die physikalische Ausprägung deiner Leitungs-
> Topologie fehleranfällig.

von Dob S. (dobstronsky)


Lesenswert?

Wastl schrieb:
> Dob S. schrieb:
>> Die I2C Leitungen gehen ab dem Connector unterhalb des Boards zum
>> zweiten Board.
>
> .... und rechts davon? Ist das eine Fata Morgana oder was?

Ich versteh dann nicht, was meinst du damit?

von Gerd E. (robberknight)


Lesenswert?

Och nö, was ist denn das hier wieder für ein Tonfall mit dem der TO 
angegangen wird. Benehmt Euch mal.

Wenn der Ruhepegel von SCL bei 1V oder 2V rumhängt ist da was faul. Die 
Frage ist wo genau.

Daher würde ich die Platinen jetzt erst mal wieder voneinander trennen 
und jede einzeln vermessen. Dafür braucht jede natürlich Pullups und 
Stromversorgung.

Wie sieht es jetzt aus mit SCL?

Wenn die vorher einzeln funktionierten und jetzt nicht mehr dann ist 
eine irgendwie kaputt gegangen. Überspannung, ESD, etc.

Die Flanken auf dem Oszibild sehen für mich gut aus, bei 125 kHz sind 
auch 10 oder 20 cm Leitungslänge normal noch kein Thema. Es sei denn Du 
hast da irgendwelche kräftige Motoren oder ähnliches in der Nähe die 
mächtig mit Störungen um sich spucken.

von Dob S. (dobstronsky)


Lesenswert?

Hi Gerd, vielen Dank für deine Antwort.

Ich habe in der Zwischenzeit, statt eines zweiten eigenen Boards, ein 
fertiges Adafruit Board genommen. Ergebnis: Keine Probleme.

Das Adafruit Board hat 10 kOhm Pull-Ups an den Leitungen, die liegen nun 
parallel zu meinen 4k7 auf meinem PCB. Das wäre eine Möglichkeit.

Oder, das defekte Board ist defekt, weil ich den PCA von einem älteren 
Board runtergelötet habe. Ich habe das nicht erwähnt weil ich so einen 
guten Job gemacht habe, dachte ich. Ich habe die Rückseite des PCB mit 
einem Heißluftfön bestrahlt bis der PCA sich gelöst hat, beim Anlöten 
war dann auch alles Easy.

Löten oder Pull-Ups Ich habe leider nur noch verlötete PCAs und kann das 
jetzt nicht mehr unabhängig testen.

von Gerd E. (robberknight)


Lesenswert?

Kannst Du nicht die Kabel von Deinen Platinen trennen um sie einzeln zu 
untersuchen?

Sieht für mich auf den ersten Blick aus als wären die Kabel auch 
verlötet. Da würde ich normal Buchsen & Flachbandstecker vorschlagen - 
dann ist das Erweitern, Testen etc. viel einfacher.

von Dob S. (dobstronsky)


Angehängte Dateien:

Lesenswert?

Gerd E. schrieb:
> Kannst Du nicht die Kabel von Deinen Platinen trennen um sie einzeln zu
> untersuchen?
>
> Sieht für mich auf den ersten Blick aus als wären die Kabel auch
> verlötet. Da würde ich normal Buchsen & Flachbandstecker vorschlagen -
> dann ist das Erweitern, Testen etc. viel einfacher.

Ich kann die Boards abziehen und testen. Ich hänge mal ein Bild von dem 
Adafruit-Boardaufbau an.

von Gerd E. (robberknight)


Lesenswert?

Ok.

Und jetzt nimm mal Dein problematisches Board ganz alleine. Verbinde 
Stromversorung und improvisiere Pullups für SCL und SDA. Achte darauf 
dass das beides gemeinsam eingeschaltet wird.

Auf was für Pegeln liegen SCL und SDA jetzt?

von Jobst M. (jobstens-de)


Lesenswert?

Dob S. schrieb:
> Komischerweise, sieht das nach 250 000 Hz aus

Warum? M=2us × 5 Käschtle = 10us = 100kHz - sogar etwas drunter ...


Gruß
Jobst

von Wastl (hartundweichware)


Lesenswert?

Dob S. schrieb:
> Flachbandkabellänge 10cm

Was lernen wir aus den Bildern: der TO lügt.

von Dob S. (dobstronsky)


Lesenswert?

Jobst M. schrieb:
> Dob S. schrieb:
>> Komischerweise, sieht das nach 250 000 Hz aus
>
> Warum? M=2us × 5 Käschtle = 10us = 100kHz - sogar etwas drunter ...
>
>
> Gruß
> Jobst

Jap, Ich war umnachtet...Ich habe jetzt zwei eigene Boards am gleichen 
Bus und es läuft. Ich hatte noch ein altes Board vom letzten Prototypen, 
da habe ich noch 10kohm Pull Ups raufgelötet und es funzt.

PCB1 hat jetzt aktuell 4k7 pull Ups und PCB2 10kOhm. Ich denke beim 
nächsten Versuch werde ich beiden 10kOhm verbauen wie das Adafruit 
Board.

Ob die Pull-Ups jetzt das Problem waren oder eher die große Hitze 
Einwirkung werde ich untersuchen sobald ich wieder PCAs bekomme. Der Bus 
läuft, dass ist das Wichtigste. Vielen Dank!

von Dob S. (dobstronsky)


Lesenswert?

Gerd E. schrieb:
> Ok.
>
> Und jetzt nimm mal Dein problematisches Board ganz alleine. Verbinde
> Stromversorung und improvisiere Pullups für SCL und SDA. Achte darauf
> dass das beides gemeinsam eingeschaltet wird.
>
> Auf was für Pegeln liegen SCL und SDA jetzt?

Nachdem das Board versagt hat, habe ich es vom Bus genommen, 4k7 Pull 
ups draufgelötet und SCL war auf 1v () und 2,2V high. Keine oder nur 
kurze
Kommunikation möglich. Das war der Fehlerzustand, der PCA hat SCL 
verfälscht SDA war unverändert 0-3,3V Pegel.

von Gerd E. (robberknight)


Lesenswert?

Dob S. schrieb:
> Ob die Pull-Ups jetzt das Problem waren oder eher die große Hitze
> Einwirkung werde ich untersuchen sobald ich wieder PCAs bekomme.

Ob 10kOhm oder 4.7 ist bei der Geschwindigkeit kein Problem. Schau Dir 
die Flanken auf dem Oszibild an, das ist vollkommen ok so.

Das Problem steckt an anderer Stelle.

Entweder ist der Chip kaputt oder Du hast irgendwo einen Lötfehler. Ich 
vermute eher letzteres, soo empfindlich sind die Dinger nämlich nicht.

Mein Vorschlag wäre daher den Chip runterlöten und wieder sauber drauf. 
Oder Flussmittelgel drauf und einmal das Lot mit Heißluft aufschmelzen, 
so dass sich der Chip optimal ausrichtet.

Du kannst nicht viel verlieren dabei, außer ein wenig Zeit.

von Björn W. (bwieck)


Angehängte Dateien:

Lesenswert?

Die Lötstellen sehen nicht gut aus, besonders an markierter Stelle.

von Rainer W. (rawi)


Lesenswert?

Dob S. schrieb:
> PCB1 hat jetzt aktuell 4k7 pull Ups und PCB2 10kOhm. Ich denke beim
> nächsten Versuch werde ich beiden 10kOhm verbauen wie das Adafruit
> Board.

Unsinn. Guck dir die I2C-Spezifikationen an. EIN Pull-Up mit 3,3kOhm 
wäre bei 3.3V völlig ok.

Die Unsitte, auf jedem Slave einen eigenen zu verbauen, ist eine 
Maßnahme von Adafruit, die Versandrückläufer verhindert, falls der 
Anwender es bei seinem I2C-Master verpennt hat, Pull-Ups einzubauen. Bei 
kurzem Bus mit vielen Slaves fließt dann unnötig viel Strom.

Dein Photo IMG_1699.JPG zeigt leider keine Pegelwechsel auf SDA. Da ist 
die Aussagekraft etwas beschränkt. SCL sieht dort gut aus.

> Der Bus läuft, dass ist das Wichtigste
Weit gefehlt. Das hilft nur im ersten Moment.
Solange du nicht weißt, worin der Fehler lag, kannst du nicht wissen, 
wie sich das nächste Board benimmt.

Die eine Lötstelle sieht sehr nach einem Kurzschluss aus. Für 
gleichmäßige Lötstellen fehlt Flussmittel und Drag-Soldering.

Noch ein Tip:
Bei Inbetriebnahme eines neuen Boards solltest du immer die 
Stromaufnahme im Blick behalten.

Dob S. schrieb:
> Nachdem das Board versagt hat, habe ich es vom Bus genommen, 4k7 Pull
> ups draufgelötet und SCL war auf 1v () und 2,2V high.
> Keine oder nur kurze Kommunikation möglich.

Serienwiderstände (z.B. 220 Ohm) zwischen Hauptbus und fraglichem 
Teilbus/Slave helfen in solchen Fällen, um den Verursacher solch 
illegaler Pegel zu identifizieren.

: Bearbeitet durch User
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.