Forum: Mikrocontroller und Digitale Elektronik RP2040 MCU open drain fehlt in C-SDK-Dokumentation


von Robin U. (ulro)


Lesenswert?

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
von Adam P. (adamap)


Lesenswert?

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(...)

von Robin U. (ulro)


Lesenswert?

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

von Olaf (Gast)


Lesenswert?

> 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

von Max M. (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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.

von rossi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.