Hallo liebe µC-Community, ich habe eine kurze Frage zum RP2040 Mikrocontroller. Ich bin gerade dabei diesen in C mittels des SDK zu programmieren. Allerdings fehlt mir in der Dokumentation eine Erklärung, wie man Open-Drain-Ausgänge verwendet. Mein konkreter Fall: Schalten einer RGB-LED mit common anode. Technisch möglich muss eine Open-Drain-Konfiguration ja sein, da ja z.B. auch I2C unterstützt wird. Meine Frage ist daher, ob sich jemand von euch schonmal näher mit dieser MCU und dem C SDK auseinandergesetzt hat und mir meine Frage beantworten kann: Wie verwende ich den Output als Open-Drain? Oder geht es theoretisch auch ohne? Z.B. durch invertieren des Levels? Hiermit meine ich, dass die Ausgangsspannung der LED an der zu schaltenden Kathode ja nahe 0V wären. Würde ich den Output auf 3.3V setzen, könnte der Strom ja nicht mehr durch die LED dem Potential entgegen fließen - die LED wäre also aus. Anders herum: Wenn der Output auf 0V gesetzt wird, kann der Strom von der LED durch den MCU nach Ground fließen. Stimmt diese Logik? Oder verhindern Dioden im MCU dieses überlegte Verhalten? Damit euch eine lange Suche erspart bleibt, hier noch die wichtigsten Links: Datenblatt MCU: https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf C SDK Dokumentation: https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-c-sdk.pdf (Der interessante Part ist "4.1.10. hardware_gpio")
:
Bearbeitet durch User
Robin U. schrieb: > Wie verwende ich den Output als Open-Drain? Sollte der im normal Fall nicht eh Open-Drain sein? Dann kannst du ihn halt einfach auf LOW/HIGH schalten. Oder meinst du den internen Pullup?
1 | gpio_pull_up(...) |
Danke für die Antwort erstmal. Meiner Meinung nach ist es schon ein Push-Pull-Ausgang, weil man ja eine gewisse output current strength angeben kann. Mein Problem löst allerdings glaube ich die Website https://circuitdigest.com/forums/embedded/difference-between-open-drain-and-push-pull#forum-topic-top mit dem Gegenüberstellungs-Bild im zweiten Post. Jeder Push-Pull ist auch immer ein Open-Drain. Also gehe ich davon aus, dass ich mit meinen Überlegungen zum Stromfluss Recht habe, und versuche es jetzt mal. Wollte nur nicht die MCU brutzeln. LG Robin
> Meiner Meinung nach ist es schon ein Push-Pull-Ausgang, weil man ja eine
Meiner Meinung nach ist es geradezu absurd das Leute hier eine Meinung
haben. Warum nicht einfach im Datenblatt des Teils das Kapitel zu
GPIO lesen und da ganz besonders zu dem Controlregister?
Wofuer werden die Teile eigentlich geschrieben wenn sie nie einer
liesst?
Olaf
Robin U. schrieb: > Jeder Push-Pull ist auch immer ein Open-Drain. Falsch. Nur wenn der obere Fet eine eigene Ansteuerlogig hat, die man deaktivieren kann. Robin U. schrieb: > fehlt mir in der Dokumentation eine Erklärung, wie man > Open-Drain-Ausgänge verwendet. Ich habe mir das DB spaßeshalber gerade mal angesehen. Statt besonder lustig sein zu wollen "I2C is an ubiquitous serial bus first described in the Dead Sea Scrolls, and later used by Philips Semiconductor" hätten die mal lieber ein DB schreiben sollen bei dem man keinen Anfall bekommt. The IO mapping required by the I2C program is quite complex, due to the different ways that the two serial lines must be driven and sampled. One interesting feature is that state machine must drive the output enable high when the output is low, since the bus is open-drain, so the sense of the data is inverted. This could be handled in the PIO program (e.g. mov osr, ~osr), but instead we can use the IO controls on RP2040 to perform this inversion in the GPIO muxes, saving an instruction Ach wirklich? Ich muss ein PIO ASM Programm schreiben um I2C benutzen zu können und muss darin herumtricksen? Weil die HW eben kein open Drain beherscht, sondern man das output register auf Low setzt und dann mit output enable high das low schreibt und mit output enable low zugleich auf lesen UND high über den ext. Pull Up geht? Mein Interesse an dem RP2040 ist gerade extrem abgekühlt. Das DB und das Chipdesign scheint mir stark verbesserungswürdig.
Max M. schrieb: > Ach wirklich? > Ich muss ein PIO ASM Programm schreiben um I2C benutzen zu können und > muss darin herumtricksen? Nein. Du musst nur im Datenblatt etwas weiterlesen und nicht nur im Kapitel 3 zur PIO. I2C findest du im Kapitel 4.3. Nur wenn du mehr als 2 I2C Schnittstellen brauchst musst du die als Beispiel angegebene PIO-Lösung oder eine reine Software-Lösung nehmen.
OpenDrain lässt sich problemlos emulieren, indem der Ausgangspin auf '0' gesetzt wird und zwischen '0' und 'Z' per GPIO_OE_SET umgeschaltet wird. Ob ich den Wert des GPIO Pins ändere oder GPIO_OE umschalte ist doch auch egal.
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.