реклама на сайте
подробности

 
 
> LPC_UART (550-совместимый)
_Артём_
сообщение Sep 16 2012, 22:02
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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 и прерываний?

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Sep 17 2012, 06:12
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Ну вот такой этот УАСПП загадочный, хотя zltigo нравится. Да, для начала передачи надо положить байт в THR. И увеличить счетчик на 1. Если счетчик меньше глубины FIFO, то можно докладывать данные. Если обнаружили LSR.THRE - счетчик сбрасываем на 0. Ну нету у него флага fifo.not_full, есть только empty. Где-то тут было обсуждение, где zltigo объяснял прелести этого, но не убедил.

Добавлено: нашел раз и два


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 17 2012, 06:31
Сообщение #3


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Сергей Борщ @ Sep 17 2012, 14:12) *
Да, для начала передачи надо положить байт в THR.

Да, часик помучался, пока смог отправить пакет через прерывания) Сейчас уже недельку стабильно работает прием и передача по прерываниям. Этот момент, ИМХО, в документации мутновато отражен. Но если прочитать несколько раз, то доходит rolleyes.gif rolleyes.gif rolleyes.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 17 2012, 14:42
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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();
}

Вроде работает.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Артём_   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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 13:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01434 секунд с 7
ELECTRONIX ©2004-2016