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?