Forum: Mikrocontroller und Digitale Elektronik UART->RS485->USART STM32F103


von Verzweifler (Gast)


Lesenswert?

Hallo liebes Forum,
Ich bin gerade dabei ein RS-485 Netzwerk mit Master und Slave 
aufzubauen. Die Schnittstellen sind auf dem Master mit einem UART 
verbunden, und auf dem Slave mit einem USART.
Zur Initialisierung der Hardware benutze ich die Standard Peripheral 
Library von STM und entsprechend sind USART und UART gleich eingestellt.

Jetzt habe ich folgendes Problem:
Das Senden der Daten von Slave zu Master funktioniert problemlos, nur 
bekomme ich keine Nachricht über meinen Master UART auf die Leitung.

Initialisierung ist gleich, lediglich andere Pins werden verwendet, etc:
1
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
2
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
3
4
5
  GPIO_InitTypeDef GPIO_InitStructure;
6
  USART_InitTypeDef USART_InitStructure;
7
  NVIC_InitTypeDef NVIC_InitStructure;
8
9
  //UART4_TX und RE
10
  GPIO_InitStructure.GPIO_Pin = UART4TX;
11
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
12
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
13
  GPIO_Init(GPIOC,&GPIO_InitStructure);
14
15
  //UART4 RE
16
  GPIO_InitStructure.GPIO_Pin = UART4RE;
17
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
18
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
19
  GPIO_Init(GPIOC,&GPIO_InitStructure);
20
21
  //USART4 RTS
22
  GPIO_InitStructure.GPIO_Pin = UART4RTS;
23
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
24
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
25
  GPIO_Init(GPIOD,&GPIO_InitStructure);
26
27
  //UART4_RX
28
  GPIO_InitStructure.GPIO_Pin = UART4RX;
29
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
30
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
31
  GPIO_Init(GPIOC,&GPIO_InitStructure);
32
33
  USART_InitStructure.USART_BaudRate=BAUD_RATE;
34
  USART_InitStructure.USART_WordLength=USART_WordLength_8b;
35
  USART_InitStructure.USART_StopBits=USART_StopBits_1;
36
  USART_InitStructure.USART_Parity=USART_Parity_No;
37
  USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
38
  USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
39
40
41
  USART_Init(UART4,&USART_InitStructure);
42
  
43
  USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
44
  USART_ITConfig(UART4,USART_IT_TXE,DISABLE);
45
  USART_Cmd(UART4,ENABLE);

Das Senden der Daten funktioniert auf beiden Seiten Interrupt gesteuert:
1
  if((USART_GetITStatus(UART4, USART_IT_TXE) != RESET)){
2
    uint8_t* data = BufferOut();
3
    if (data) {
4
      USART_SendData(UART4,*data);
5
       return;
6
    } else {
7
      USART_ITConfig(UART4,USART_IT_TXE,DISABLE);
8
                        USART_ITConfig(UART4,USART_IT_TC,ENABLE);
9
    }
10
  }

Der Sprung in den Interrupt funktioniert auch problemlos, allerdings 
passiert nach einem SendData rein garnichts auf der Leitung (Mit Oszi 
gemessen), obwohl der gleiche Code auf der anderen Seite zu dem 
richtigen Ergebnis führt

Übersehe ich etwas oder hat jemand Ideen?

von rmu (Gast)


Lesenswert?

Verzweifler schrieb:
> Der Sprung in den Interrupt funktioniert auch problemlos, allerdings
> passiert nach einem SendData rein garnichts auf der Leitung (Mit Oszi
> gemessen), obwohl der gleiche Code auf der anderen Seite zu dem
> richtigen Ergebnis führt
>
> Übersehe ich etwas oder hat jemand Ideen?

Wie wird der Transceiver-Baustein zwischen Sende- und Empfangsbetrieb 
umgeschaltet?

von Verzweifler (Gast)


Lesenswert?

Vor dem aktivieren des Interrupts werden jeweils Driver Enable und 
Receive Enable (negiert) gesetzt, nach dem Senden der kompletten 
Nachricht werden beide wieder zurückgesetzt.
Während der Sendeversuche des Masters ist der DE des Slaves nicht 
gesetzt.

von Eule (Gast)


Lesenswert?

Moin Verzweifler,

ich schliesse mich rmu an, wie wird dein Baustein umgeschaltet?
Ich konnte mich an das Diller Tutorial, da wird auch mit einer 
RS485-Schnittstelle gearbeitet.

http://www.diller-technologies.de/stm32.html

Vielleicht hilft es dir!

Gruesse
Eule

von Verzweifler (Gast)


Lesenswert?

Ja das Diller Tutorial hat mir schon bei einigen Problemen geholfen, 
aber hier finde ich einfach nicht weiter.

von rmu (Gast)


Lesenswert?

ich würd mal eingrenzen und mit dem Oszi untersuchen:

* kommt an den UART-Pins was raus
* stimmen die DE-Pegel

dann sollte schon klarer werden wo man weitersucht.

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.