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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.