STM32F4XX OpenDrain benutzen

Gast #4590274
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!
Gast #4590350
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...
Angehängte Dateien:
Gast #4590353
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren