Skip to content

Commit 85d3343

Browse files
authored
Fix UART config for RS485 (#3016)
***NO_CI***
1 parent 07108f0 commit 85d3343

File tree

1 file changed

+34
-4
lines changed

1 file changed

+34
-4
lines changed

targets/ChibiOS/_nanoCLR/System.IO.Ports/sys_io_ser_native_System_IO_Ports_SerialPort.cpp

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,16 +1070,46 @@ HRESULT Library_sys_io_ser_native_System_IO_Ports_SerialPort::NativeConfig___VOI
10701070
break;
10711071

10721072
case SerialMode_RS485:
1073+
10731074
#ifdef USART_CR3_DEM
1075+
// target has support for RS485 DE pin control
10741076
// Set Driver Enable Mode
10751077
palUart->Uart_cfg.cr3 |= USART_CR3_DEM;
1078+
10761079
// Set Driver Enable Polarity
1080+
1081+
#if defined(NF_SERIAL_RS485_DE_POLARITY_HIGH) || !defined(NF_SERIAL_RS485_DE_POLARITY_LOW)
1082+
// DEP is active high or not defined, therefore default is high, clear DEP bit
1083+
palUart->Uart_cfg.cr3 &= ~USART_CR3_DEP;
1084+
#elif defined(NF_SERIAL_RS485_DE_POLARITY_LOW)
1085+
// set DEP bit
10771086
palUart->Uart_cfg.cr3 |= USART_CR3_DEP;
1078-
// Auto-RTS delay - set to maximum
1079-
palUart->Uart_cfg.cr1 |= USART_CR1_DEDT;
1080-
// Auto-RTS delay - set to maximum
1081-
palUart->Uart_cfg.cr1 |= USART_CR1_DEAT;
1087+
#endif
1088+
1089+
// Auto-DE deassertion delay
1090+
// clear bits
1091+
palUart->Uart_cfg.cr1 &= ~USART_CR1_DEDT;
1092+
1093+
#if defined(NF_SERIAL_RS485_DE_DEASSERTION_DELAY)
1094+
palUart->Uart_cfg.cr1 |= NF_SERIAL_RS485_DE_DEASSERTION_DELAY;
1095+
#else
1096+
// set to default value, being 2 bit periods
1097+
palUart->Uart_cfg.cr1 |= USART_CR1_DEDT_1;
1098+
#endif
1099+
1100+
// Auto-DE assetion delay
1101+
// clear bits
1102+
palUart->Uart_cfg.cr1 &= ~USART_CR1_DEAT;
1103+
1104+
#if defined(NF_SERIAL_RS485_DE_ASSERTION_DELAY)
1105+
palUart->Uart_cfg.cr1 |= NF_SERIAL_RS485_DE_ASSERTION_DELAY;
1106+
#else
1107+
// set to default value, being 2 bit periods
1108+
palUart->Uart_cfg.cr1 |= USART_CR1_DEAT_1;
1109+
#endif
1110+
10821111
#else
1112+
// target doesn't have support for RS485 DE pin control
10831113
NANOCLR_SET_AND_LEAVE(CLR_E_NOT_SUPPORTED);
10841114
#endif
10851115
break;

0 commit comments

Comments
 (0)