nvt_rs485
Dependents: modbus-over-rs485-sample NTOUEE-mbed-modbus-RTU NuMaker-mbed-modbus-sample NuMaker_NuWicam_Lite ... more
nvt_rs485.cpp@0:22be4d425fdb, 2016-09-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |