Piyamate Wisanuvej / Serial485
Committer:
piyamate
Date:
Mon Jun 30 18:34:25 2014 +0000
Revision:
0:b3faf92ccc5c
RS485 Library for K64F; - RTS pin for DE/RE; - 9-bit mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
piyamate 0:b3faf92ccc5c 1 #include "mbed.h"
piyamate 0:b3faf92ccc5c 2 #include "Serial485.h"
piyamate 0:b3faf92ccc5c 3 #include "fsl_uart_hal.h"
piyamate 0:b3faf92ccc5c 4
piyamate 0:b3faf92ccc5c 5 const PinMap Serial485::PinMap_UART_RTS[] = {
piyamate 0:b3faf92ccc5c 6 {PTE3 , UART_1, 3},
piyamate 0:b3faf92ccc5c 7 {PTA3 , UART_0, 2},
piyamate 0:b3faf92ccc5c 8 {PTA17, UART_0, 3},
piyamate 0:b3faf92ccc5c 9 {PTB2 , UART_0, 3},
piyamate 0:b3faf92ccc5c 10 {PTC1 , UART_1, 3},
piyamate 0:b3faf92ccc5c 11 {PTC12, UART_4, 3},
piyamate 0:b3faf92ccc5c 12 {PTC18, UART_3, 3},
piyamate 0:b3faf92ccc5c 13 {PTD0 , UART_2, 3},
piyamate 0:b3faf92ccc5c 14 {PTD4 , UART_0, 3},
piyamate 0:b3faf92ccc5c 15 {NC , NC , 0}
piyamate 0:b3faf92ccc5c 16 };
piyamate 0:b3faf92ccc5c 17
piyamate 0:b3faf92ccc5c 18 Serial485::Serial485(PinName tx, PinName rx, PinName rts):
piyamate 0:b3faf92ccc5c 19 RawSerial(tx, rx),
piyamate 0:b3faf92ccc5c 20 rts(rts)
piyamate 0:b3faf92ccc5c 21 {
piyamate 0:b3faf92ccc5c 22 if(rts != NC)
piyamate 0:b3faf92ccc5c 23 {
piyamate 0:b3faf92ccc5c 24 //find UART peripheral number
piyamate 0:b3faf92ccc5c 25 uint32_t uart_rts = pinmap_peripheral(rts, PinMap_UART_RTS);
piyamate 0:b3faf92ccc5c 26 if(uart_rts == (uint32_t)NC)
piyamate 0:b3faf92ccc5c 27 error("pinmap not found for peripheral");
piyamate 0:b3faf92ccc5c 28 else
piyamate 0:b3faf92ccc5c 29 {
piyamate 0:b3faf92ccc5c 30 uart_instance = uart_rts;
piyamate 0:b3faf92ccc5c 31 enableRS485();
piyamate 0:b3faf92ccc5c 32 }
piyamate 0:b3faf92ccc5c 33 }
piyamate 0:b3faf92ccc5c 34 }
piyamate 0:b3faf92ccc5c 35
piyamate 0:b3faf92ccc5c 36 Serial485::~Serial485()
piyamate 0:b3faf92ccc5c 37 {
piyamate 0:b3faf92ccc5c 38 if(rts != NC)
piyamate 0:b3faf92ccc5c 39 disableRS485();
piyamate 0:b3faf92ccc5c 40 }
piyamate 0:b3faf92ccc5c 41
piyamate 0:b3faf92ccc5c 42 void Serial485::enableRS485()
piyamate 0:b3faf92ccc5c 43 {
piyamate 0:b3faf92ccc5c 44 uart_hal_configure_transmitter_rts_polarity(uart_instance, 1);
piyamate 0:b3faf92ccc5c 45 uart_hal_enable_transmitter_rts(uart_instance);
piyamate 0:b3faf92ccc5c 46 pinmap_pinout(rts, PinMap_UART_RTS);
piyamate 0:b3faf92ccc5c 47 pin_mode(rts, PullDown);
piyamate 0:b3faf92ccc5c 48 }
piyamate 0:b3faf92ccc5c 49
piyamate 0:b3faf92ccc5c 50 void Serial485::disableRS485()
piyamate 0:b3faf92ccc5c 51 {
piyamate 0:b3faf92ccc5c 52 uart_hal_disable_transmitter_rts(uart_instance);
piyamate 0:b3faf92ccc5c 53 pin_function(rts, 0);
piyamate 0:b3faf92ccc5c 54 pin_mode(rts, PullUp);
piyamate 0:b3faf92ccc5c 55 }
piyamate 0:b3faf92ccc5c 56
piyamate 0:b3faf92ccc5c 57 void Serial485::set9thBit(uint8_t value)
piyamate 0:b3faf92ccc5c 58 {
piyamate 0:b3faf92ccc5c 59 BW_UART_C3_T8(uart_instance, value);
piyamate 0:b3faf92ccc5c 60 }
piyamate 0:b3faf92ccc5c 61
piyamate 0:b3faf92ccc5c 62 void Serial485::puts9(const uint16_t *data, uint16_t count)
piyamate 0:b3faf92ccc5c 63 {
piyamate 0:b3faf92ccc5c 64 while(count-- > 0)
piyamate 0:b3faf92ccc5c 65 {
piyamate 0:b3faf92ccc5c 66 while(!writeable());
piyamate 0:b3faf92ccc5c 67 putc9(*data++);
piyamate 0:b3faf92ccc5c 68 }
piyamate 0:b3faf92ccc5c 69 }
piyamate 0:b3faf92ccc5c 70
piyamate 0:b3faf92ccc5c 71 void Serial485::putc9(uint16_t data)
piyamate 0:b3faf92ccc5c 72 {
piyamate 0:b3faf92ccc5c 73 uart_hal_putchar9(uart_instance, data);
piyamate 0:b3faf92ccc5c 74 }
piyamate 0:b3faf92ccc5c 75
piyamate 0:b3faf92ccc5c 76 uint16_t Serial485::getc9()
piyamate 0:b3faf92ccc5c 77 {
piyamate 0:b3faf92ccc5c 78 uint16_t data;
piyamate 0:b3faf92ccc5c 79 while(!readable());
piyamate 0:b3faf92ccc5c 80 uart_hal_getchar9(uart_instance, &data);
piyamate 0:b3faf92ccc5c 81 return data;
piyamate 0:b3faf92ccc5c 82 }
piyamate 0:b3faf92ccc5c 83
piyamate 0:b3faf92ccc5c 84 uint32_t Serial485::getBaudRate()
piyamate 0:b3faf92ccc5c 85 {
piyamate 0:b3faf92ccc5c 86 return _baud;
piyamate 0:b3faf92ccc5c 87 }