nvt_rs485
Dependents: modbus-over-rs485-sample NTOUEE-mbed-modbus-RTU NuMaker-mbed-modbus-sample NuMaker_NuWicam_Lite ... more
Diff: nvt_rs485.cpp
- Revision:
- 0:22be4d425fdb
- Child:
- 1:783999122629
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nvt_rs485.cpp Tue Sep 20 01:17:32 2016 +0000 @@ -0,0 +1,65 @@ +#include "nvt_rs485.h" +#include "PeripheralPins.h" + +NvtRS485::NvtRS485(PinName tx, PinName rx, PinName dir, E_PFM pfm) + : Serial(tx, rx), m_ePFMID(pfm) +{ + this->set_rs485_mode(dir); +} + +NvtRS485::~NvtRS485() +{ + +} + +int NvtRS485::set_rs485_mode(PinName dir) +{ + int ret=0; + mbed::SerialBase *ptrSerialBase = (mbed::SerialBase *)this; + serial_t *obj = &_serial; + UART_T *uart_base = (UART_T *) NU_MODBASE(obj->serial.uart); + + lock(); + // First, disable flow control completely. + uart_base->INTEN &= ~(UART_INTEN_ATORTSEN_Msk | UART_INTEN_ATOCTSEN_Msk); + + //Implement RS485 mode for various platform of Nuvoton + switch (m_ePFMID) { + case NUC472: { + /* + Program Sequence example: + 1. Program FUNCSEL in UART_FUNCSEL to select RS-485 function. + 2. Program the RXOFF bit (UART_FIFO[8]) to determine enable or disable RS-485 receiver + 3. Program the RS-485_NMM or RS-485_AAD mode. + 4. If the RS-485_AAD mode is selected, the ADDRMV (UART_ALTCTL[31:24]) is programmed for auto address match value. + 5. Determine auto direction control by programming RS-485_AUD. + */ + + // Check if RTS pin matches. + uint32_t uart_rts = pinmap_peripheral(dir, PinMap_UART_RTS); + MBED_ASSERT(uart_rts == obj->serial.uart); + + // Enable the pin for RTS function + pinmap_pinout(dir, PinMap_UART_RTS); + + uart_base->FUNCSEL = (uart_base->FUNCSEL & ~UART_FUNCSEL_FUNCSEL_Msk) | 0x3; + uart_base->ALTCTL = (uart_base->ALTCTL & ~UART_ALTCTL_RS485AUD_Msk) | UART_ALTCTL_RS485AUD_Msk; + + // nRTS pin output is high level active + //uart_base->MODEM = (uart_base->MODEM & ~UART_MODEM_RTSACTLV_Msk) | UART_MODEM_RTSACTLV_Msk; + uart_base->MODEM = (uart_base->MODEM & ~UART_MODEM_RTSACTLV_Msk); + //uart_base->FIFO = (uart_base->FIFO & ~UART_FIFO_RTSTRGLV_Msk); + uart_base->FIFO = (uart_base->FIFO & ~UART_FIFO_RTSTRGLV_Msk) | (0x2 << UART_FIFO_RTSTRGLV_Pos); + + // Enable RTS + //uart_base->INTEN |= UART_INTEN_ATORTSEN_Msk; + } + break; + + default: + break; + } + unlock(); + + return ret; +} \ No newline at end of file