Forum: Mikrocontroller und Digitale Elektronik STM32F4XX OpenDrain benutzen


von st frage (Gast)


Lesenswert?

Hallo,
folgendes Problem: Ich habe einen I2C Bus (ich nutze die STM32 Hardware 
ganz "normal" dafür) und will zusätzlich auf die SCL-Leitung Pegel 
aufmodulieren (quasi Bit-Banging), wenn der eigentliche I2C Bus inaktiv 
(bzw. fertig mit dem Senden ist) ist. Ports umdefinieren hab ich schon 
versucht, leider dauert das ganze etwas zu lange.
Meine Idee: Ich nutze einen weiteren Pin im OpenDrain Modus, schalte ihn 
hochohmig während der I2C sendet und zieh ihn auf Low, wenn ich meine 
Pegel draufmodulieren will.
Erste Frage: Funktioniert das prinzipiell so?

Zweite Frage: Wie nutze ich den hochohmigen Zustand mit der STM 
StdPeripheralLib? Ich habe bis jetzt nur die Funktionen
1
GPIO_SetBits(...)
 und ähnliche gefunden.

Hier mal meine Konfiguration des zusätzlichen Pins:
1
    GPIO_InitTypeDef GPIO_InitStruct;
2
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
3
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
4
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
5
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
6
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
7
    GPIO_Init(GPIOB, &GPIO_InitStruct);

Der I2C Bus funktioniert!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn du dich nach den I²C Busspezifikationen richtest, sollten deine 
normalen I²C Bus Pins auch schon Open Drain sein. Hochohmig wird ein 
Open Drain Ausgang dann, wenn du ihn high setzt, ein 'GPIO_SetBits(...)' 
reicht also aus, so das er dir nicht in die Quere kommt.

von st frage (Gast)


Angehängte Dateien:

Lesenswert?

Matthias S. schrieb:
> Wenn du dich nach den I²C Busspezifikationen richtest, sollten
> deine
> normalen I²C Bus Pins auch schon Open Drain sein. Hochohmig wird ein
> Open Drain Ausgang dann, wenn du ihn high setzt, ein 'GPIO_SetBits(...)'
> reicht also aus, so das er dir nicht in die Quere kommt.

Das Gefühl hab ich aber nicht...
Auswahl_008 : PB5 nicht mit SCL verbunden -> keine Beeinflussung
Auswahl_009 : PB5 zum Test mit SDA verbunden -> Verbindung funktioniert 
so wie erwartet
Auswahl_010 : PB5 mit SCL verbunden -> Pullup, ohne das ich noch ein SCL 
ODER SDA sehe...

von st frage (Gast)


Lesenswert?

Ach ja, hier die GPIO Konfiguration der I2C Pins:
1
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // we are going to use PB6 and PB7
2
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;      // set pins to alternate function
3
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;    // set GPIO speed
4
  GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;      // set output to open drain --> the line has to be only pulled low, not driven high
5
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;      // enable pull up resistors
6
  GPIO_Init(GPIOB, &GPIO_InitStruct);          // init GPIOB

von st frage (Gast)


Lesenswert?

Kann mir da keiner weiterhelfen bzw. sagen was ich machen muss, damit 
ich auch auf die SCL Leitung ein anderes Signal mit aufmodulieren kann?

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Schau doch mal mit dem Oszi drauf. Ich hatte bspws. Mal n kurzen 
verursacht, da ich mit den push/pulls durcheinander gekommen bin.

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.