An initial port to the FRDM-K46Z based on the the following: https://developer.mbed.org/users/okini3939/notebook/dmx512/

Dependents:   FRDM-Dowser

Fork of DMX by Suga koubou

Need to update the UART references to the K46Z. The KE02 Sub-Family Reference Manual provides us with the required information.

The modifications are wrapped with the target for the K46: For example, defined(TARGET_KL46Z)

Committer:
rosienej
Date:
Fri Mar 13 13:34:53 2015 +0000
Revision:
17:12dd79109ce3
Parent:
16:84a017ef96f8
Child:
18:6303931e4102
Minor update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:cbff6bf41542 1 /*
okini3939 0:cbff6bf41542 2 * DMX512 send/recv library
okini3939 6:9e7b4eeac6ec 3 * Copyright (c) 2013 Hiroshi Suga
okini3939 0:cbff6bf41542 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:cbff6bf41542 5 */
okini3939 0:cbff6bf41542 6
okini3939 7:16d6874076dd 7 /** @file
okini3939 0:cbff6bf41542 8 * @brief DMX512 send/recv
okini3939 0:cbff6bf41542 9 */
okini3939 0:cbff6bf41542 10
okini3939 0:cbff6bf41542 11 #include "mbed.h"
okini3939 0:cbff6bf41542 12 #include "DMX.h"
okini3939 0:cbff6bf41542 13
okini3939 5:72039cd4c874 14 DMX::DMX (PinName p_tx, PinName p_rx) : _dmx(p_tx, p_rx) {
okini3939 0:cbff6bf41542 15
okini3939 12:1f176eee2d28 16 clear();
okini3939 4:dd0544c80096 17 // mode_tx = DMX_MODE_BEGIN;
okini3939 4:dd0544c80096 18 mode_tx = DMX_MODE_STOP;
okini3939 0:cbff6bf41542 19 mode_rx = DMX_MODE_BEGIN;
okini3939 0:cbff6bf41542 20 is_recived = 0;
okini3939 0:cbff6bf41542 21 is_sent = 0;
okini3939 0:cbff6bf41542 22
okini3939 5:72039cd4c874 23 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 11:cb132e066057 24 if (p_rx == P0_3) {
okini3939 11:cb132e066057 25 _uart = (LPC_UART_TypeDef*)LPC_UART0;
okini3939 11:cb132e066057 26 NVIC_SetPriority(UART0_IRQn, 1);
okini3939 0:cbff6bf41542 27 } else
okini3939 0:cbff6bf41542 28 if (p_rx == p14) {
okini3939 8:d4a45bba41d2 29 _uart = (LPC_UART_TypeDef*)LPC_UART1;
okini3939 0:cbff6bf41542 30 NVIC_SetPriority(UART1_IRQn, 1);
okini3939 0:cbff6bf41542 31 } else
okini3939 0:cbff6bf41542 32 if (p_rx == p27) {
okini3939 8:d4a45bba41d2 33 _uart = LPC_UART2;
okini3939 0:cbff6bf41542 34 NVIC_SetPriority(UART2_IRQn, 1);
okini3939 11:cb132e066057 35 } else
okini3939 11:cb132e066057 36 if (p_rx == p10) {
okini3939 11:cb132e066057 37 _uart = LPC_UART3;
okini3939 11:cb132e066057 38 NVIC_SetPriority(UART3_IRQn, 1);
okini3939 0:cbff6bf41542 39 }
rosienej 16:84a017ef96f8 40 #elif defined(TARGET_KL46Z)
rosienej 16:84a017ef96f8 41 if ((p_rx == PTE21) || (p_rx == PTA1)){
rosienej 16:84a017ef96f8 42 _uart = (UARTLP_Type *)UART0;
rosienej 16:84a017ef96f8 43 NVIC_SetPriority(UART0_IRQn, 1);
rosienej 16:84a017ef96f8 44 } else
rosienej 16:84a017ef96f8 45 if (p_rx == PTE1) {
rosienej 16:84a017ef96f8 46 _uart = (UARTLP_Type *)UART1;
rosienej 16:84a017ef96f8 47 NVIC_SetPriority(UART1_IRQn, 1);
rosienej 16:84a017ef96f8 48 } else
rosienej 16:84a017ef96f8 49 if ((p_rx == PTE23) || (p_rx == PTE17)) {
rosienej 16:84a017ef96f8 50 _uart = (UARTLP_Type *)UART2;
rosienej 16:84a017ef96f8 51 NVIC_SetPriority(UART2_IRQn, 1);
rosienej 17:12dd79109ce3 52 }
rosienej 16:84a017ef96f8 53
okini3939 13:9841af9ac344 54 #elif defined(TARGET_LPC4088)
okini3939 13:9841af9ac344 55 if (p_rx == p10) {
okini3939 13:9841af9ac344 56 _uart = LPC_UART3;
okini3939 13:9841af9ac344 57 NVIC_SetPriority(UART3_IRQn, 1);
okini3939 13:9841af9ac344 58 } else
okini3939 13:9841af9ac344 59 if (p_rx == p31) {
okini3939 13:9841af9ac344 60 _uart = (LPC_UART_TypeDef*)LPC_UART4;
okini3939 13:9841af9ac344 61 NVIC_SetPriority(UART4_IRQn, 1);
okini3939 13:9841af9ac344 62 }
okini3939 15:4ea4a31c7609 63 #elif defined(TARGET_LPC11UXX)
okini3939 5:72039cd4c874 64 if (p_rx == p10) {
okini3939 8:d4a45bba41d2 65 _uart = LPC_USART;
okini3939 5:72039cd4c874 66 NVIC_SetPriority(UART_IRQn, 1);
okini3939 5:72039cd4c874 67 }
stanly88 10:b748aab8404c 68 #elif defined(TARGET_LPC11XX)
okini3939 11:cb132e066057 69 // LPC1114 support by Stanly Chen
stanly88 10:b748aab8404c 70 if (p_rx == P1_6) {
okini3939 13:9841af9ac344 71 _uart = (LPC_UART_TypeDef*)UART_0;
stanly88 10:b748aab8404c 72 NVIC_SetPriority(UART_IRQn, 1);
stanly88 10:b748aab8404c 73 }
okini3939 5:72039cd4c874 74 #endif
okini3939 0:cbff6bf41542 75
okini3939 5:72039cd4c874 76 _dmx.baud(250000);
okini3939 5:72039cd4c874 77 _dmx.format(8, Serial::None, 2);
okini3939 5:72039cd4c874 78 _dmx.attach(this, &DMX::int_rx, Serial::RxIrq);
okini3939 0:cbff6bf41542 79
okini3939 4:dd0544c80096 80 // timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN);
okini3939 0:cbff6bf41542 81 }
okini3939 0:cbff6bf41542 82
okini3939 6:9e7b4eeac6ec 83 void DMX::put (int addr, int data) {
okini3939 6:9e7b4eeac6ec 84 if (addr < 0 || addr >= DMX_SIZE) return;
okini3939 6:9e7b4eeac6ec 85 data_tx[addr] = data;
okini3939 0:cbff6bf41542 86 }
okini3939 0:cbff6bf41542 87
okini3939 6:9e7b4eeac6ec 88 void DMX::put (unsigned char *buf, int addr, int len) {
okini3939 6:9e7b4eeac6ec 89 if (addr < 0 || addr >= DMX_SIZE) return;
okini3939 6:9e7b4eeac6ec 90 if (len > DMX_SIZE - addr) len = DMX_SIZE - addr;
okini3939 6:9e7b4eeac6ec 91 memcpy(&data_tx[addr], buf, len);
okini3939 6:9e7b4eeac6ec 92 }
okini3939 6:9e7b4eeac6ec 93
okini3939 6:9e7b4eeac6ec 94 int DMX::get (int addr) {
okini3939 6:9e7b4eeac6ec 95 if (addr < 0 || addr >= DMX_SIZE) return -1;
okini3939 6:9e7b4eeac6ec 96 return data_rx[addr];
okini3939 6:9e7b4eeac6ec 97 }
okini3939 6:9e7b4eeac6ec 98
okini3939 6:9e7b4eeac6ec 99 void DMX::get (unsigned char *buf, int addr, int len) {
okini3939 6:9e7b4eeac6ec 100 if (addr < 0 || addr >= DMX_SIZE) return;
okini3939 6:9e7b4eeac6ec 101 if (len > DMX_SIZE - addr) len = DMX_SIZE - addr;
okini3939 6:9e7b4eeac6ec 102 memcpy(buf, &data_rx[addr], len);
okini3939 0:cbff6bf41542 103 }
okini3939 0:cbff6bf41542 104
okini3939 0:cbff6bf41542 105 void DMX::int_timer () {
okini3939 0:cbff6bf41542 106
okini3939 0:cbff6bf41542 107 switch (mode_tx) {
okini3939 0:cbff6bf41542 108 case DMX_MODE_BEGIN:
okini3939 0:cbff6bf41542 109 // Break Time
okini3939 0:cbff6bf41542 110 timeout01.detach();
rosienej 16:84a017ef96f8 111 #if defined(TARGET_KL46Z)
rosienej 16:84a017ef96f8 112 _uart->C2 |= UART_C2_SBK_MASK | UART_C2_TE_MASK | UART_C2_RE_MASK;
rosienej 16:84a017ef96f8 113 #else
rosienej 16:84a017ef96f8 114 _uart->LCR |= (1 << 6);
rosienej 16:84a017ef96f8 115 #endif
okini3939 0:cbff6bf41542 116 mode_tx = DMX_MODE_BREAK;
okini3939 0:cbff6bf41542 117 timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BREAK);
okini3939 0:cbff6bf41542 118 break;
okini3939 0:cbff6bf41542 119
okini3939 0:cbff6bf41542 120 case DMX_MODE_BREAK:
okini3939 0:cbff6bf41542 121 // Mark After Break
okini3939 0:cbff6bf41542 122 timeout01.detach();
rosienej 16:84a017ef96f8 123 #if defined(TARGET_KL46Z)
rosienej 16:84a017ef96f8 124 _uart->C2 &= ~UART_C2_SBK_MASK;
rosienej 16:84a017ef96f8 125 #else
okini3939 8:d4a45bba41d2 126 _uart->LCR &= ~(1 << 6);
rosienej 16:84a017ef96f8 127 #endif
okini3939 0:cbff6bf41542 128 mode_tx = DMX_MODE_MAB;
okini3939 0:cbff6bf41542 129 timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_MAB);
okini3939 0:cbff6bf41542 130 break;
okini3939 0:cbff6bf41542 131
okini3939 0:cbff6bf41542 132 case DMX_MODE_MAB:
okini3939 0:cbff6bf41542 133 // Start code
okini3939 0:cbff6bf41542 134 timeout01.detach();
okini3939 0:cbff6bf41542 135 addr_tx = 0;
okini3939 0:cbff6bf41542 136 mode_tx = DMX_MODE_DATA;
okini3939 5:72039cd4c874 137 _dmx.attach(this, &DMX::int_tx, Serial::TxIrq);
okini3939 2:d7677060f8eb 138 #ifdef DMX_UART_DIRECT
rosienej 16:84a017ef96f8 139
rosienej 16:84a017ef96f8 140
rosienej 16:84a017ef96f8 141 #if defined(TARGET_KL46Z)
rosienej 16:84a017ef96f8 142 while(!(_uart->S1 & UART_S1_TDRE_MASK));
rosienej 16:84a017ef96f8 143 _uart->D = DMX_START_CODE; // Freescale
rosienej 16:84a017ef96f8 144 #else
okini3939 9:e687f321c428 145 while(!(_uart->LSR & (1<<5)));
okini3939 9:e687f321c428 146 _uart->THR = DMX_START_CODE;
rosienej 16:84a017ef96f8 147 #endif
okini3939 2:d7677060f8eb 148 #else
okini3939 9:e687f321c428 149 _dmx.putc(DMX_START_CODE);
okini3939 2:d7677060f8eb 150 #endif
okini3939 0:cbff6bf41542 151 break;
okini3939 0:cbff6bf41542 152 }
okini3939 0:cbff6bf41542 153 }
okini3939 0:cbff6bf41542 154
okini3939 0:cbff6bf41542 155 void DMX::int_tx () {
okini3939 0:cbff6bf41542 156 // Data
okini3939 0:cbff6bf41542 157 if (mode_tx == DMX_MODE_DATA) {
okini3939 0:cbff6bf41542 158 if (addr_tx < DMX_SIZE) {
okini3939 1:f0d988e15810 159 #ifdef DMX_UART_DIRECT
rosienej 16:84a017ef96f8 160
rosienej 16:84a017ef96f8 161 #if defined(TARGET_KL46Z)
rosienej 16:84a017ef96f8 162 _uart->D = (uint8_t)data_tx[addr_tx]; // Freescale
rosienej 16:84a017ef96f8 163 #else
okini3939 8:d4a45bba41d2 164 _uart->THR = (uint8_t)data_tx[addr_tx];
rosienej 16:84a017ef96f8 165 #endif
okini3939 0:cbff6bf41542 166 #else
okini3939 5:72039cd4c874 167 _dmx.putc(data_tx[addr_tx]);
okini3939 0:cbff6bf41542 168 #endif
okini3939 0:cbff6bf41542 169 addr_tx ++;
okini3939 0:cbff6bf41542 170 } else {
okini3939 5:72039cd4c874 171 _dmx.attach(0, Serial::TxIrq);
okini3939 0:cbff6bf41542 172 mode_tx = DMX_MODE_BEGIN;
okini3939 0:cbff6bf41542 173 is_sent = 1;
okini3939 0:cbff6bf41542 174 timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN);
okini3939 0:cbff6bf41542 175 }
okini3939 0:cbff6bf41542 176 }
okini3939 0:cbff6bf41542 177 }
okini3939 0:cbff6bf41542 178
okini3939 0:cbff6bf41542 179 void DMX::int_rx () {
okini3939 0:cbff6bf41542 180 int flg, dat;
rosienej 16:84a017ef96f8 181 int tmp1,tmp2;
rosienej 16:84a017ef96f8 182 #if defined(TARGET_KL46Z) // looking for (7)errornous data,(3) Framming Error, (4) Break
rosienej 16:84a017ef96f8 183 tmp1 = (_uart->S1 & (UART_S1_NF_MASK|UART_S1_FE_MASK)); // NF,FE
rosienej 16:84a017ef96f8 184 tmp2 = (_uart->S2 & UART_S2_LBKDIF_MASK); //LBKDIF
rosienej 16:84a017ef96f8 185 flg = (tmp1<<1) | tmp2;
rosienej 16:84a017ef96f8 186 #else
rosienej 16:84a017ef96f8 187 flg = _uart->LSR;
rosienej 16:84a017ef96f8 188 #endif
rosienej 16:84a017ef96f8 189
okini3939 1:f0d988e15810 190 #ifdef DMX_UART_DIRECT
rosienej 16:84a017ef96f8 191 #if defined(TARGET_KL46Z)
rosienej 16:84a017ef96f8 192 dat = _uart->D; // Freescale
rosienej 16:84a017ef96f8 193 #else
okini3939 8:d4a45bba41d2 194 dat = _uart->RBR;
rosienej 16:84a017ef96f8 195 #endif
rosienej 16:84a017ef96f8 196
rosienej 16:84a017ef96f8 197
okini3939 1:f0d988e15810 198 #else
okini3939 5:72039cd4c874 199 dat = _dmx.getc();
okini3939 1:f0d988e15810 200 #endif
okini3939 0:cbff6bf41542 201
okini3939 0:cbff6bf41542 202 if (flg & ((1 << 7)|(1 << 3)|(1 << 4))) {
okini3939 0:cbff6bf41542 203 // Break Time
okini3939 15:4ea4a31c7609 204 if (addr_rx >= 24 && mode_rx == DMX_MODE_DATA) {
okini3939 0:cbff6bf41542 205 is_recived = 1;
okini3939 0:cbff6bf41542 206 }
okini3939 0:cbff6bf41542 207 mode_rx = DMX_MODE_BREAK;
okini3939 0:cbff6bf41542 208 return;
okini3939 0:cbff6bf41542 209 }
okini3939 0:cbff6bf41542 210
okini3939 0:cbff6bf41542 211 if (mode_rx == DMX_MODE_BREAK) {
okini3939 0:cbff6bf41542 212
okini3939 0:cbff6bf41542 213 // Start Code
okini3939 9:e687f321c428 214 if (dat == DMX_START_CODE) {
okini3939 0:cbff6bf41542 215 addr_rx = 0;
okini3939 0:cbff6bf41542 216 mode_rx = DMX_MODE_DATA;
okini3939 0:cbff6bf41542 217 } else {
okini3939 0:cbff6bf41542 218 mode_rx = DMX_MODE_ERROR;
okini3939 0:cbff6bf41542 219 }
okini3939 0:cbff6bf41542 220
okini3939 0:cbff6bf41542 221 } else
okini3939 0:cbff6bf41542 222 if (mode_rx == DMX_MODE_DATA) {
okini3939 0:cbff6bf41542 223
okini3939 0:cbff6bf41542 224 // Data
okini3939 0:cbff6bf41542 225 data_rx[addr_rx] = dat;
okini3939 0:cbff6bf41542 226 addr_rx ++;
okini3939 0:cbff6bf41542 227
okini3939 0:cbff6bf41542 228 if (addr_rx >= DMX_SIZE) {
okini3939 0:cbff6bf41542 229 is_recived = 1;
okini3939 0:cbff6bf41542 230 mode_rx = DMX_MODE_BEGIN;
okini3939 0:cbff6bf41542 231 }
okini3939 0:cbff6bf41542 232 }
okini3939 0:cbff6bf41542 233 }
okini3939 0:cbff6bf41542 234
okini3939 4:dd0544c80096 235 void DMX::start () {
okini3939 4:dd0544c80096 236 if (mode_tx == DMX_MODE_STOP) {
okini3939 4:dd0544c80096 237 mode_tx = DMX_MODE_BEGIN;
okini3939 4:dd0544c80096 238 is_sent = 0;
okini3939 4:dd0544c80096 239 timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN);
okini3939 4:dd0544c80096 240 }
okini3939 4:dd0544c80096 241 }
okini3939 4:dd0544c80096 242
okini3939 4:dd0544c80096 243 void DMX::stop () {
okini3939 5:72039cd4c874 244 _dmx.attach(0, Serial::TxIrq);
okini3939 3:2eb66b4d99bd 245 timeout01.detach();
okini3939 4:dd0544c80096 246 mode_tx = DMX_MODE_STOP;
okini3939 3:2eb66b4d99bd 247 }
okini3939 12:1f176eee2d28 248
okini3939 12:1f176eee2d28 249 void DMX::clear () {
okini3939 12:1f176eee2d28 250 int i;
okini3939 12:1f176eee2d28 251
okini3939 12:1f176eee2d28 252 for (i = 0; i < DMX_SIZE; i ++) {
okini3939 12:1f176eee2d28 253 data_tx[i] = 0;
okini3939 12:1f176eee2d28 254 data_rx[i] = 0;
okini3939 12:1f176eee2d28 255 }
okini3939 12:1f176eee2d28 256 }