Forum: Mikrocontroller und Digitale Elektronik STM32F051 GPIO Output Tristate nicht möglich?


von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

Hallo,
beim Einsatz des STM32F051 an einem seriellen Bus habe ich ein 
Protokoll, bei dem ich zuerst am Bus mithören muss, und wenn die 
richtige Adresse auf dem Bus erscheint auf der selben Leitung des Busses 
sende. Ausgang der seriellen Schnittstelle und deren Eingang wollte ich 
direkt verbinden. Dies setzt allerdings voraus, dass ich den Ausgang 
während der Erkennungsphase auf "High-Z" setzen muss. Der Versuch, den 
IO-Pin der seriellen Ausgabe nur dann zu aktivieren funktioniert 
grundsätzlich, aber bisher sind alle Versuche gescheitert, den Pin auf 
High-Z zu setzen.
Hat jemand eine Idee, wie ich einen GPIO-Pin zwischen "Serial out" und 
"High-Z" wechseln lassen kann?
Dass man einen Bustreiber mit OE verwenden kann ist mir bekannt :-).
Grüße, Kurt

von input (Gast)


Lesenswert?

Schaltet den Portpin als Eingang.

von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

Das habe ich versucht. Das Signal am seriellen Eingangspin bricht dann 
zusammen. Genau deswegen bin ich etwas ratlos.
Grüße, Kurt

von holger (Gast)


Lesenswert?

>Das habe ich versucht. Das Signal am seriellen Eingangspin bricht dann
>zusammen. Genau deswegen bin ich etwas ratlos.

Dann hast du was falsch gemacht. Alle anderen hier
sind genauso ratlos wie du weil niemand sehen kann
welchen Unsinn du programmiert hast.

von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

OK, dann also die Code-Aausschnitte zur Intialisierung und Umschaltung 
der Pin_Funktion:
Initialisierung: (Pin als Input)
1
  GPIO_InitTypeDef GPIO_InitStructure;
2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
4
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
5
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
6
  GPIO_Init(GPIOA, &GPIO_InitStructure);
Umschaltung auf TX-Pin für USART2:
1
  GPIO_InitTypeDef GPIO_InitStructure;
2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
4
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
5
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
6
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
7
  GPIO_Init(GPIOA, &GPIO_InitStructure);
8
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
Umschaltung auf Input:
1
  GPIO_InitTypeDef GPIO_InitStructure;
2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
4
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
5
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
6
  GPIO_Init(GPIOA, &GPIO_InitStructure);

Da im Grundzustand, also Pin als Input, das Signal OK ist, sollte das 
Problem in der erneuten Umschaltung auf Input liegen. Ich sehe es aber 
nicht :-(.
Grüße, Kurt

von Ingo L. (corrtexx)


Lesenswert?

Kurt Harders schrieb:
> GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
Verursacht die AF-Config vieleicht Probleme? Gibts da nicht eine De-Init 
Funktion für die IOs?

von Dr. Sommer (Gast)


Lesenswert?

Hatte der USART nicht einen Half-Duplex-Mode wo RX & TX am selben Pin 
anliegen und der USART somit automatisch die Richtung vom Pin 
umschaltet...? Schau mal ins DB...

von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

Hallo Ingo,
das wars! Nach dem Aufruf von DeInit() und entsprechender 
Initialisierung klappt es.
@Dr. Sommer: Der Half-Duplex-Mode passte leider nicht ganz auf das 
verwendete Protokoll. Aber es klappt ja jetzt mit dem DeInit.
Danke, Kurt

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.