UART->RS485->USART STM32F103

Gast #4709724
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?
Gast #4709727
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?
Gast #4709735
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.

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