mikrocontroller.net

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


Autor: Verzweifler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);


  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  //UART4_TX und RE
  GPIO_InitStructure.GPIO_Pin = UART4TX;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  GPIO_Init(GPIOC,&GPIO_InitStructure);

  //UART4 RE
  GPIO_InitStructure.GPIO_Pin = UART4RE;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC,&GPIO_InitStructure);

  //USART4 RTS
  GPIO_InitStructure.GPIO_Pin = UART4RTS;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD,&GPIO_InitStructure);

  //UART4_RX
  GPIO_InitStructure.GPIO_Pin = UART4RX;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOC,&GPIO_InitStructure);

  USART_InitStructure.USART_BaudRate=BAUD_RATE;
  USART_InitStructure.USART_WordLength=USART_WordLength_8b;
  USART_InitStructure.USART_StopBits=USART_StopBits_1;
  USART_InitStructure.USART_Parity=USART_Parity_No;
  USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
  USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;


  USART_Init(UART4,&USART_InitStructure);
  
  USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
  USART_ITConfig(UART4,USART_IT_TXE,DISABLE);
  USART_Cmd(UART4,ENABLE);

Das Senden der Daten funktioniert auf beiden Seiten Interrupt gesteuert:
  if((USART_GetITStatus(UART4, USART_IT_TXE) != RESET)){
    uint8_t* data = BufferOut();
    if (data) {
      USART_SendData(UART4,*data);
       return;
    } else {
      USART_ITConfig(UART4,USART_IT_TXE,DISABLE);
                        USART_ITConfig(UART4,USART_IT_TC,ENABLE);
    }
  }

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?

Autor: rmu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Verzweifler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Eule (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Verzweifler (Gast)
Datum:

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

Autor: rmu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.