nvt_rs485

Dependents:   modbus-over-rs485-sample NTOUEE-mbed-modbus-RTU NuMaker-mbed-modbus-sample NuMaker_NuWicam_Lite ... more

Committer:
wclin
Date:
Tue Sep 20 01:17:32 2016 +0000
Revision:
0:22be4d425fdb
Child:
1:783999122629
Add rs485 class

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"
wclin 0:22be4d425fdb 3
wclin 0:22be4d425fdb 4 NvtRS485::NvtRS485(PinName tx, PinName rx, PinName dir, E_PFM pfm)
wclin 0:22be4d425fdb 5 : Serial(tx, rx), m_ePFMID(pfm)
wclin 0:22be4d425fdb 6 {
wclin 0:22be4d425fdb 7 this->set_rs485_mode(dir);
wclin 0:22be4d425fdb 8 }
wclin 0:22be4d425fdb 9
wclin 0:22be4d425fdb 10 NvtRS485::~NvtRS485()
wclin 0:22be4d425fdb 11 {
wclin 0:22be4d425fdb 12
wclin 0:22be4d425fdb 13 }
wclin 0:22be4d425fdb 14
wclin 0:22be4d425fdb 15 int NvtRS485::set_rs485_mode(PinName dir)
wclin 0:22be4d425fdb 16 {
wclin 0:22be4d425fdb 17 int ret=0;
wclin 0:22be4d425fdb 18 mbed::SerialBase *ptrSerialBase = (mbed::SerialBase *)this;
wclin 0:22be4d425fdb 19 serial_t *obj = &_serial;
wclin 0:22be4d425fdb 20 UART_T *uart_base = (UART_T *) NU_MODBASE(obj->serial.uart);
wclin 0:22be4d425fdb 21
wclin 0:22be4d425fdb 22 lock();
wclin 0:22be4d425fdb 23 // First, disable flow control completely.
wclin 0:22be4d425fdb 24 uart_base->INTEN &= ~(UART_INTEN_ATORTSEN_Msk | UART_INTEN_ATOCTSEN_Msk);
wclin 0:22be4d425fdb 25
wclin 0:22be4d425fdb 26 //Implement RS485 mode for various platform of Nuvoton
wclin 0:22be4d425fdb 27 switch (m_ePFMID) {
wclin 0:22be4d425fdb 28 case NUC472: {
wclin 0:22be4d425fdb 29 /*
wclin 0:22be4d425fdb 30 Program Sequence example:
wclin 0:22be4d425fdb 31 1. Program FUNCSEL in UART_FUNCSEL to select RS-485 function.
wclin 0:22be4d425fdb 32 2. Program the RXOFF bit (UART_FIFO[8]) to determine enable or disable RS-485 receiver
wclin 0:22be4d425fdb 33 3. Program the RS-485_NMM or RS-485_AAD mode.
wclin 0:22be4d425fdb 34 4. If the RS-485_AAD mode is selected, the ADDRMV (UART_ALTCTL[31:24]) is programmed for auto address match value.
wclin 0:22be4d425fdb 35 5. Determine auto direction control by programming RS-485_AUD.
wclin 0:22be4d425fdb 36 */
wclin 0:22be4d425fdb 37
wclin 0:22be4d425fdb 38 // Check if RTS pin matches.
wclin 0:22be4d425fdb 39 uint32_t uart_rts = pinmap_peripheral(dir, PinMap_UART_RTS);
wclin 0:22be4d425fdb 40 MBED_ASSERT(uart_rts == obj->serial.uart);
wclin 0:22be4d425fdb 41
wclin 0:22be4d425fdb 42 // Enable the pin for RTS function
wclin 0:22be4d425fdb 43 pinmap_pinout(dir, PinMap_UART_RTS);
wclin 0:22be4d425fdb 44
wclin 0:22be4d425fdb 45 uart_base->FUNCSEL = (uart_base->FUNCSEL & ~UART_FUNCSEL_FUNCSEL_Msk) | 0x3;
wclin 0:22be4d425fdb 46 uart_base->ALTCTL = (uart_base->ALTCTL & ~UART_ALTCTL_RS485AUD_Msk) | UART_ALTCTL_RS485AUD_Msk;
wclin 0:22be4d425fdb 47
wclin 0:22be4d425fdb 48 // nRTS pin output is high level active
wclin 0:22be4d425fdb 49 //uart_base->MODEM = (uart_base->MODEM & ~UART_MODEM_RTSACTLV_Msk) | UART_MODEM_RTSACTLV_Msk;
wclin 0:22be4d425fdb 50 uart_base->MODEM = (uart_base->MODEM & ~UART_MODEM_RTSACTLV_Msk);
wclin 0:22be4d425fdb 51 //uart_base->FIFO = (uart_base->FIFO & ~UART_FIFO_RTSTRGLV_Msk);
wclin 0:22be4d425fdb 52 uart_base->FIFO = (uart_base->FIFO & ~UART_FIFO_RTSTRGLV_Msk) | (0x2 << UART_FIFO_RTSTRGLV_Pos);
wclin 0:22be4d425fdb 53
wclin 0:22be4d425fdb 54 // Enable RTS
wclin 0:22be4d425fdb 55 //uart_base->INTEN |= UART_INTEN_ATORTSEN_Msk;
wclin 0:22be4d425fdb 56 }
wclin 0:22be4d425fdb 57 break;
wclin 0:22be4d425fdb 58
wclin 0:22be4d425fdb 59 default:
wclin 0:22be4d425fdb 60 break;
wclin 0:22be4d425fdb 61 }
wclin 0:22be4d425fdb 62 unlock();
wclin 0:22be4d425fdb 63
wclin 0:22be4d425fdb 64 return ret;
wclin 0:22be4d425fdb 65 }