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

 
 
> 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
Ответов
SII
сообщение Sep 17 2012, 15:10
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Цитата(_Артём_ @ Sep 17 2012, 02:02) *
Получается, что нужно в основной программе послать хотя бы один байт в THR, чтобы возникло прерывание по опустошению буфера передачи?


По моему опыту выходит так, что запрос прерывания по наличию места в буфере передачи выдаётся не по самому факту наличия свободного места, а лишь по факту завершения передачи очередного байта из буфера. Таким образом, если разрешить прерывания при заведомо пустом буфере, прерывание так и не произойдёт -- передачи-то не было; однако, если разрешить прерывание и после этого пихнуть в буфер хотя бы один байт -- произойдёт, когда он будет передан (или когда будет переписан из буфера в сдвиговый регистр передатчика).

Лично у меня впечатление, что изначальной причиной такого странного поведения послужила аппаратная ошибка, которую не заметили и растиражировали, а дальше тянут из-за совместимости. Ведь куда логичней, если прерывание по наличию места будет "висеть" постоянно, пока в буфере есть хотя бы один свободный байт и само это прерывание разрешено.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 17 2012, 19:08
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(SII @ Sep 17 2012, 18:10) *
По моему опыту выходит так, что запрос прерывания по наличию места в буфере передачи выдаётся не по самому факту наличия свободного места, а лишь по факту завершения передачи очередного байта из буфера.

Похоже так, только не очередного, а последнего байта. И байт при этом уже передался в RS (программно можно RS485 делать).


Цитата(SII @ Sep 17 2012, 18:10) *
Таким образом, если разрешить прерывания при заведомо пустом буфере, прерывание так и не произойдёт -- передачи-то не было;

Выглядит именно так.

Цитата(SII @ Sep 17 2012, 18:10) *
По моему опыту выходит так, что запрос прерывания по наличию места в буфере передачи выдаётся не Лично у меня впечатление, что изначальной причиной такого странного поведения послужила аппаратная ошибка, которую не заметили и растиражировали

Может быть.

Цитата(haker_fox @ Sep 17 2012, 18:56) *
В AVR, например, так и сделано. Нужно что-то передать - подготовил буфер, разрешил прерывание "по пустому FIFO", и все. Буфер передался. А по завершению передачи последнего байта прерывание можно выключить...

Не только в АВР так сделано, думаю.
Но в общем работает, зато писать можно не байт как в АВР, а аж 16.

Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 17 2012, 23:39
Сообщение #4


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

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



QUOTE (_Артём_ @ Sep 18 2012, 04:08) *
Но в общем работает, зато писать можно не байт как в АВР, а аж 16.

В AVR FIFO двухуровневый)
Кстати, Вы так и делаете (я имею ввиду по прерыванию THRE сразу 16 байт отправляете)? rolleyes.gif Работает? rolleyes.gif Я пока машинально на каждый байт прерывание дергаю, на скорую руку писал обработчик)

Обработчик в контексте scmRTOS, но думаю, не суть важно...
CODE
OS_INTERRUPT void uart0ISRHandler()
{
    OS::TISRW ISRW;
    uint32_t iir;

    // While there are pending interrupts
    while( !( ( iir = U0IIR ) & 1 ) )
    {
        switch( ( iir >> 1 ) & 7UL )
        {
        case 2:
            // Receive data available
        case 6:
            // CTI
            rx_isr_byte = U0RBR;
            getPacketEF.signal_isr();
            break;

        case 1:
            // THRE Interrupt
            U0THR = *pOutBuffer++;
            if( pOutBuffer == pEndBuffer )
            {
                // Disable THRE Interrupt
                U0IER &= ~THRE_IE;
                pOutBuffer = outBuffer;
                sendFinishedEF.signal_isr();
            }
            break;
        }
    }

    IRQ_DONE();
}

Но это, конечно, у меня не оптимальный вариант. Создавался как тестовый вариант разбора полетов с USART ISR...


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


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(haker_fox @ Sep 18 2012, 02:39) *
В AVR FIFO двухуровневый)

Ну, это он двухуровневый, пока в него не пишешь долго, а потом всё равно в прерывании по одному байту пишешь.


Цитата(haker_fox @ Sep 18 2012, 02:39) *
Кстати, Вы так и делаете (я имею ввиду по прерыванию THRE сразу 16 байт отправляете)? rolleyes.gif Работает? rolleyes.gif Я пока машинально на каждый байт прерывание дергаю, на скорую руку писал обработчик)

Работоспособность буфера сомнений не вызывает.

Цитата(haker_fox @ Sep 18 2012, 02:39) *
IRQ_DONE();

P.S. А это кто? IRQ_DONE в смысле.

Цитата(Сергей Борщ @ Sep 18 2012, 10:05) *
Да, использую FIFO. Но насколько все это можно было бы написать проще, если бы был флаг "FIFO не полное"...

Спасибо за пример.

Да уж, трёхэтажно получилось, а всего лишь бит незаполненности фифо зажали.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Артём_   LPC_UART (550-совместимый)   Sep 16 2012, 22:02
- - Сергей Борщ   Ну вот такой этот УАСПП загадочный, хотя zltigo нр...   Sep 17 2012, 06:12
|- - haker_fox   QUOTE (Сергей Борщ @ Sep 17 2012, 14:12) ...   Sep 17 2012, 06:31
|- - _Артём_   Спасиба за ссылки. В первом приближении получился...   Sep 17 2012, 14:42
- - haker_fox   QUOTE (SII @ Sep 18 2012, 00:10) Ведь куд...   Sep 17 2012, 15:56
- - Сергей Борщ   Вот мои страх и ужас (которые, как известно, всего...   Sep 18 2012, 07:05
- - 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 Текстовая версия Сейчас: 21st July 2025 - 13:53
Рейтинг@Mail.ru


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