|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define IRQ_PRIORITY 64 // 0 = highest priority, 255 = lowest |
|
|
#define IRQ_PRIORITY 64 // 0 = highest priority, 255 = lowest |
|
|
|
|
|
|
|
|
#define CTRL_ENABLE (LPUART_CTRL_TE | LPUART_CTRL_RE | LPUART_CTRL_RIE) |
|
|
|
|
|
|
|
|
#define CTRL_ENABLE (LPUART_CTRL_TE | LPUART_CTRL_RE | LPUART_CTRL_RIE | LPUART_CTRL_ILIE) |
|
|
#define CTRL_TX_ACTIVE (CTRL_ENABLE | LPUART_CTRL_TIE) |
|
|
#define CTRL_TX_ACTIVE (CTRL_ENABLE | LPUART_CTRL_TIE) |
|
|
#define CTRL_TX_COMPLETING (CTRL_ENABLE | LPUART_CTRL_TCIE) |
|
|
#define CTRL_TX_COMPLETING (CTRL_ENABLE | LPUART_CTRL_TCIE) |
|
|
#define CTRL_TX_INACTIVE CTRL_ENABLE |
|
|
#define CTRL_TX_INACTIVE CTRL_ENABLE |
|
|
|
|
|
|
|
|
uint32_t ctrl; |
|
|
uint32_t ctrl; |
|
|
|
|
|
|
|
|
// See if we have stuff to read in. |
|
|
// See if we have stuff to read in. |
|
|
if (port->STAT & LPUART_STAT_RDRF) { |
|
|
|
|
|
|
|
|
// Todo - Check idle. |
|
|
|
|
|
if (port->STAT & (LPUART_STAT_RDRF | LPUART_STAT_IDLE)) { |
|
|
|
|
|
// See how many bytes or pending. |
|
|
//digitalWrite(5, HIGH); |
|
|
//digitalWrite(5, HIGH); |
|
|
#if 1 |
|
|
|
|
|
n = port->DATA; // get the byte... |
|
|
|
|
|
#else |
|
|
|
|
|
if (use9Bits_ && (port().C3 & 0x80)) { |
|
|
|
|
|
n = port().D | 0x100; |
|
|
|
|
|
} else { |
|
|
|
|
|
n = port().D; |
|
|
|
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
head = rx_buffer_head_ + 1; |
|
|
|
|
|
if (head >= rx_buffer_total_size_) head = 0; |
|
|
|
|
|
if (head != rx_buffer_tail_) { |
|
|
|
|
|
if (head < rx_buffer_size_) { |
|
|
|
|
|
rx_buffer_[head] = n; |
|
|
|
|
|
} else { |
|
|
|
|
|
rx_buffer_storage_[head-rx_buffer_size_] = n; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
uint8_t avail = (port->WATER >> 24) & 0x7; |
|
|
|
|
|
if (avail) { |
|
|
|
|
|
uint32_t newhead; |
|
|
|
|
|
head = rx_buffer_head_; |
|
|
|
|
|
tail = rx_buffer_tail_; |
|
|
|
|
|
do { |
|
|
|
|
|
#if 1 |
|
|
|
|
|
n = port->DATA; // get the byte... |
|
|
|
|
|
#else |
|
|
|
|
|
if (use9Bits_ && (port().C3 & 0x80)) { |
|
|
|
|
|
n = port().D | 0x100; |
|
|
|
|
|
} else { |
|
|
|
|
|
n = port().D; |
|
|
|
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
newhead = head + 1; |
|
|
|
|
|
|
|
|
|
|
|
if (newhead >= rx_buffer_total_size_) newhead = 0; |
|
|
|
|
|
if (newhead != rx_buffer_tail_) { |
|
|
|
|
|
head = newhead; |
|
|
|
|
|
if (newhead < rx_buffer_size_) { |
|
|
|
|
|
rx_buffer_[head] = n; |
|
|
|
|
|
} else { |
|
|
|
|
|
rx_buffer_storage_[head-rx_buffer_size_] = n; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} while (--avail > 0) ; |
|
|
rx_buffer_head_ = head; |
|
|
rx_buffer_head_ = head; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// If it was an idle status clear the idle |
|
|
|
|
|
if (port->STAT & LPUART_STAT_IDLE) { |
|
|
|
|
|
port->STAT |= LPUART_STAT_IDLE; // writing a 1 to idle should clear it. |
|
|
|
|
|
} |
|
|
//digitalWrite(5, LOW); |
|
|
//digitalWrite(5, LOW); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// See if we are transmitting and room in buffer. |
|
|
// See if we are transmitting and room in buffer. |
|
|
ctrl = port->CTRL; |
|
|
ctrl = port->CTRL; |