NuMaker RS485 lib

Dependents:   NuMaker-mbed-modbus-sample

Committer:
cyliang
Date:
Tue Mar 14 17:36:56 2023 +0800
Revision:
5:3725fa015f1d
Parent:
4:3bdf456890b6
Support NUMAKER_IOT_M467

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wclin 0:22be4d425fdb 1 #include "nvt_rs485.h"
wclin 0:22be4d425fdb 2 #include "PeripheralPins.h"
cyliang 4:3bdf456890b6 3 #if MBED_MAJOR_VERSION >= 6
cyliang 4:3bdf456890b6 4 NvtRS485::NvtRS485(PinName tx, PinName rx, PinName dir)
cyliang 4:3bdf456890b6 5 : MyUnbufferedSerial(tx, rx)
cyliang 4:3bdf456890b6 6 #else
wclin 1:783999122629 7 NvtRS485::NvtRS485(PinName tx, PinName rx, PinName dir)
wclin 1:783999122629 8 : Serial(tx, rx)
cyliang 4:3bdf456890b6 9 #endif
wclin 0:22be4d425fdb 10 {
wclin 0:22be4d425fdb 11 this->set_rs485_mode(dir);
wclin 0:22be4d425fdb 12 }
wclin 0:22be4d425fdb 13
wclin 0:22be4d425fdb 14 NvtRS485::~NvtRS485()
wclin 0:22be4d425fdb 15 {
wclin 0:22be4d425fdb 16
wclin 0:22be4d425fdb 17 }
wclin 0:22be4d425fdb 18
wclin 0:22be4d425fdb 19 int NvtRS485::set_rs485_mode(PinName dir)
wclin 0:22be4d425fdb 20 {
wclin 0:22be4d425fdb 21 int ret=0;
wclin 1:783999122629 22 serial_t *obj = &_serial; // Get pointer from grandfather-SerialBase.
wclin 1:783999122629 23
wclin 1:783999122629 24 lock();
wclin 1:783999122629 25
wclin 1:783999122629 26 //Implement RS485-AUD mode for various platform of Nuvoton
cyliang 5:3725fa015f1d 27 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M453) || defined(TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M467)
wclin 1:783999122629 28 /*
wclin 1:783999122629 29 Program Sequence example:
wclin 1:783999122629 30 1. Program FUNCSEL in UART_FUNCSEL to select RS-485 function.
wclin 1:783999122629 31 2. Program the RXOFF bit (UART_FIFO[8]) to determine enable or disable RS-485 receiver
wclin 1:783999122629 32 3. Program the RS-485_NMM or RS-485_AAD mode.
wclin 1:783999122629 33 4. If the RS-485_AAD mode is selected, the ADDRMV (UART_ALTCTL[31:24]) is programmed for auto address match value.
wclin 1:783999122629 34 5. Determine auto direction control by programming RS-485_AUD.
wclin 1:783999122629 35 */
wclin 1:783999122629 36
wclin 0:22be4d425fdb 37 UART_T *uart_base = (UART_T *) NU_MODBASE(obj->serial.uart);
wclin 0:22be4d425fdb 38
wclin 0:22be4d425fdb 39 // First, disable flow control completely.
wclin 0:22be4d425fdb 40 uart_base->INTEN &= ~(UART_INTEN_ATORTSEN_Msk | UART_INTEN_ATOCTSEN_Msk);
wclin 0:22be4d425fdb 41
wclin 1:783999122629 42 // Check if RTS pin matches.
wclin 1:783999122629 43 uint32_t uart_rts = pinmap_peripheral(dir, PinMap_UART_RTS);
wclin 1:783999122629 44 MBED_ASSERT(uart_rts == obj->serial.uart);
wclin 0:22be4d425fdb 45
wclin 1:783999122629 46 // Enable the pin for RTS function
wclin 1:783999122629 47 pinmap_pinout(dir, PinMap_UART_RTS);
wclin 0:22be4d425fdb 48
wclin 1:783999122629 49 uart_base->FUNCSEL = (uart_base->FUNCSEL & ~UART_FUNCSEL_FUNCSEL_Msk) | 0x3;
wclin 1:783999122629 50 uart_base->ALTCTL = (uart_base->ALTCTL & ~UART_ALTCTL_RS485AUD_Msk) | UART_ALTCTL_RS485AUD_Msk;
wclin 1:783999122629 51 uart_base->MODEM = (uart_base->MODEM & ~UART_MODEM_RTSACTLV_Msk);
wclin 1:783999122629 52 uart_base->FIFO = (uart_base->FIFO & ~UART_FIFO_RTSTRGLV_Msk) | (0x2 << UART_FIFO_RTSTRGLV_Pos);
wclin 1:783999122629 53
wclin 1:783999122629 54 #else
wclin 1:783999122629 55 #error "Unknown platform."
wclin 1:783999122629 56 #endif
wclin 0:22be4d425fdb 57
wclin 1:783999122629 58 unlock();
wclin 0:22be4d425fdb 59 return ret;
cyliang 5:3725fa015f1d 60 }