|
LPC_UART (550-совместимый) |
|
|
|
Sep 16 2012, 22:02
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Вечер добрый. Пытаюсь посылать данные через UART, использую fifo. Непонятно как правильно это делать. Код extern "C" void UART_IRQ_Handler() { LedBlink(); }
volatile uint16_t index; const uint8_t TestStr[]="0123456789\n"; void main() { InitUART(); LPC_UART->IER=1<<LPC_UART_IER_THRE; NVIC_EnableIRQ(UART_IRQn); for (index=0; TestStr[index]; index++) LPC_UART->THR=TestStr[index]; while (1); } Поставил breakpoint в UART_IRQ_Handler, программа попала в него, когда данные уже пришли в терминал. Получается, что нужно в основной программе послать хотя бы один байт в THR, чтобы возникло прерывание по опустошению буфера передачи? Попытка записывать данные в THR и проверять состояние флага LSR.THRE приводит к тому, что посылается только 1 байт - буфер не пуст, если в нём есть хотя бы 1 байт. Получается нет нормальной индикации, того что есть ещё место в буфере? Нет ли у кого-нибудь примера передачи с использованием FIFO и прерываний? Спасибо.
|
|
|
|
|
 |
Ответов
|
Sep 17 2012, 14:42
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Спасиба за ссылки. В первом приближении получился такой код Код #define TX_FIFO_SIZE 128 struct TUartTxBuffer { volatile uint8_t TxBuffer[TX_FIFO_SIZE]; volatile uint8_t TxNext; volatile uint8_t TxFirst; volatile int8_t IntEnabled; INLINE_FUNCTION void Send_Handler() { uint32_t iir=LPC_UART->IIR; uint8_t tx_next=TxNext, tx_first=TxFirst; uint_fast8_t fifo_free_size=16; while (tx_next!=tx_first && fifo_free_size) { LPC_UART->THR=TxBuffer[tx_first++]; fifo_free_size--; if (tx_first==TX_FIFO_SIZE) tx_first=0; } TxFirst=tx_first; if (tx_next==tx_first) { LPC_UART->IER=0; IntEnabled=0; } } void SendBuffer(const uint8_t *data_for_send, uint8_t byte_count); }; void TUartTxBuffer::SendBuffer(const uint8_t *data_for_send, uint8_t byte_count) { uint8_t tx_next=TxNext; for (uint_fast8_t i=0; i<byte_count; i++) { TxBuffer[tx_next++]=*data_for_send++; if (tx_next>=TX_FIFO_SIZE) tx_next=0; } NVIC_DisableIRQ(UART_IRQn); TxNext=tx_next; if (IntEnabled==0) { uint8_t tx_first=TxFirst; LPC_UART->THR=TxBuffer[tx_first++]; if (tx_first==TX_FIFO_SIZE) tx_first=0; TxFirst=tx_first; LPC_UART->IER=1<<LPC_UART_IER_THRE; IntEnabled=1; } NVIC_EnableIRQ(UART_IRQn); } TUartTxBuffer UartTxBuffer; extern "C" void UART_IRQ_Handler() { UartTxBuffer.Send_Handler(); } Вроде работает.
|
|
|
|
Сообщений в этой теме
_Артём_ LPC_UART (550-совместимый) Sep 16 2012, 22:02 SII Цитата(_Артём_ @ Sep 17 2012, 02:02) Полу... Sep 17 2012, 15:10 haker_fox QUOTE (SII @ Sep 18 2012, 00:10) Ведь куд... Sep 17 2012, 15:56 _Артём_ Цитата(SII @ Sep 17 2012, 18:10) По моему... Sep 17 2012, 19:08  haker_fox QUOTE (_Артём_ @ Sep 18 2012, 04:08) Но в... Sep 17 2012, 23:39   Сергей Борщ Вот мои страх и ужас (которые, как известно, всего... Sep 18 2012, 07:05   _Артём_ Цитата(haker_fox @ Sep 18 2012, 02:39) В ... Sep 18 2012, 12:30    haker_fox QUOTE (_Артём_ @ Sep 18 2012, 21:30) P.S.... Sep 18 2012, 13:40     _Артём_ Цитата(haker_fox @ Sep 18 2012, 16:40) А ... Sep 18 2012, 13:50      haker_fox QUOTE (_Артём_ @ Sep 18 2012, 22:50) Оно ... Sep 18 2012, 14:35       pitt К моему глубокому сожалению, ожидаю ту же проблему... Oct 21 2012, 16:23        _Артём_ Цитата(pitt @ Oct 21 2012, 19:23) ожидаю ... Oct 21 2012, 18:31         pitt Цитата(_Артём_ @ Oct 21 2012, 14:31) Не з... Oct 21 2012, 20:46          _Артём_ Цитата(pitt @ Oct 21 2012, 23:46) Кроме к... Oct 21 2012, 21:21           pitt мне не нужен тест, я уже убедился. С CAN еще не уб... Oct 21 2012, 21:27            _Артём_ Цитата(pitt @ Oct 22 2012, 00:27) мне не ... Oct 21 2012, 21:57             pitt Цитата(_Артём_ @ Oct 21 2012, 17:57) Мне ... Oct 21 2012, 22:35              _Артём_ Цитата(pitt @ Oct 22 2012, 01:35) Общее м... Oct 21 2012, 23:12               pitt Цитата(_Артём_ @ Oct 21 2012, 19:12) Прои... Oct 21 2012, 23:24                _Артём_ Цитата(pitt @ Oct 22 2012, 02:24) Я об... Oct 22 2012, 23:06                 pitt Цитата(_Артём_ @ Oct 22 2012, 19:06) Да, ... Oct 22 2012, 23:36                  _Артём_ Цитата(pitt @ Oct 23 2012, 02:36) Артем, ... Oct 23 2012, 12:25                   pitt Цитата(_Артём_ @ Oct 23 2012, 08:25) Отве... Oct 24 2012, 00:35           _Артём_ Цитата(_Артём_ @ Oct 22 2012, 00:21) Алго... Oct 22 2012, 12:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|