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
Das habe ich versucht. Das Signal am seriellen Eingangspin bricht dann zusammen. Genau deswegen bin ich etwas ratlos. Grüße, Kurt
>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.
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
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?
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.