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}")
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.
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.
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.
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.
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.
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.
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
Haben die beiden I2C-Teilnehmer auch unterschiedliche Adressen oder sind die gleich?
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?
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
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.
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?
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.
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.
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.
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.
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?
Dob S. schrieb: > Komischerweise, sieht das nach 250 000 Hz aus Warum? M=2us × 5 Käschtle = 10us = 100kHz - sogar etwas drunter ... Gruß Jobst
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!
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.
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.
Die Lötstellen sehen nicht gut aus, besonders an markierter Stelle.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.