|
LPC177x UART, использовать FIFO для передачи |
|
|
|
Sep 24 2013, 14:40
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Два независимых буфера для RX и TX. К примеру, в LPC1768 кажется нет индикатора заполненности TX буфера. Как и в LPC21xx, LPC111x. Так что забиваются по полному освобождению сразу 16 байт. В RX прерывании, если стоит уровень срабатывания 14, то можно вычитывать из RBR сразу 14 раз подряд, анализируя младший бит LSR. Пример обработчика Код void UART0_IRQHandler() { switch(U0IIR & 0x0f) { uInt lsr; default: U0LSR; U0RBR; break; case 0x02: //THRE interrupt proc_tx(&uart0); break; case 0x0C: //timeout case 0x06: //Rx line status error case 0x04: //Receive data available while ((lsr = U0LSR) & 0x01) proc_rx(&uart0, U0RBR, lsr & 0x9e); break; } NVIC_ClearPendingIRQ(UART_IRQn); } //uart0 - структура с данными
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Sep 27 2013, 11:35
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
QUOTE (Golikov A. @ Sep 27 2013, 12:53)  что значит вызывается обработчик при разрешении? Обработчик должен вызывать при возникновении прерывания а не просто при его разрешении... При возникновении прерывания "должен" ставиться флаг запроса на прерывание и ничего более. При разрешении прерывания и установленном флаге запроса контроллер прерывания запускает обработчик. Что курили голландские девелоперы, когда дизайнили уарт известно только им и богу. По факту код передачи по уарту для филипков должен быть продублирован в обработчике прерывания от уарта и в том месте кода, где нужно начать передачу. Для "нормальных" уарт архитектур достаточно разрешить прерывание "передатчик пуст"
|
|
|
|
|
Sep 27 2013, 11:51
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
чего то я не понимаю видать....
у меня это было так.
функция послать данные: если передатчик и доп буфер пусты пихает в передатчик 16 байт данных. Если их меньше и ладно, если их больше пихает 16 остальные кладет в буфер программный. если доп буфер был не пуст, кладет данные в него.
прерывание уарт пуст - если буфер программный пуст и ладно, если нет, то берет данные из него и пихает в передатчик.
я так понимаю что проблема ваша в том что при пустом буфере надо данные в него положить, а не в программный буфер... ну так это добавление одного ифа в функции отправки, зато момент отправки четко обозначен, можно чип селект какой - либо опустить...
вообщем никакой проблемы я не вижу если честно, все мне кажется логично... А вот что делать с прерывание буфер пуст если оно возникает всегда когда буфер пуст для меня как раз вопрос. Ведь большую часть времени если обмена нет, он как раз и пуст, вы прерывание что-ли запрещаете, а когда данные кладете разрешаете? Не уверен, что это прям мего логично...
|
|
|
|
|
Sep 27 2013, 12:04
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
QUOTE (Golikov A. @ Sep 27 2013, 14:51)  вообщем никакой проблемы я не вижу если честно, все мне кажется логично... А вот что делать с прерывание буфер пуст если оно возникает всегда когда буфер пуст для меня как раз вопрос. Ведь большую часть времени если обмена нет, он как раз и пуст, вы прерывание что-ли запрещаете, а когда данные кладете разрешаете? Не уверен, что это прям мего логично... Если вопрос ко мне, то в общем виде картина передачи данных выглядит так: - аппликейшн никогда не работает с уарт прямо. Только через кольцевой буфер. - после получения данных буфер проверяет разрешены ли прерывания на передачу и разрешает их, если запрещены. - обработчик прерывания заполняет выходной регистр (или выходное фифо) данными. Если данные закончились - запрещает преравания на передачу Прерывания разрешаются когда есть данные и запрещаются когда из нет. Просто , логично, компактно и надежно Ну и вы конечно правы, с уарт на лпс нет никаких проблем, одно мелкое неудобство.
|
|
|
|
|
Sep 27 2013, 16:40
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Да, конечно, 16550 уже давно морально устарел и можно сделать гораздо более удобный и современный интерфейс для UART (примеры есть). Но NXP решили для UART реализовать стандартный 16550 (с доп. фичами) и у этого подхода есть и серьёзный '+': UART - это единственная периферия, драйвера для которой я переношу между разными контроллерами практически без изменений, а это серьёзный '+' когда приходится одновременно работать с разными контроллерами. И реализовали они его грамотно - без багов. Цитата(ig_z @ Sep 27 2013, 17:35)  Что курили голландские девелоперы, когда дизайнили уарт известно только им и богу. По факту код передачи по уарту для филипков должен быть продублирован в обработчике прерывания от уарта и в том месте кода, где нужно начать передачу. В си есть такая чудесная вещь как функция(). Попробуйте - вам понравится  Цитата(ig_z @ Sep 27 2013, 17:35)  Для "нормальных" уарт архитектур достаточно разрешить прерывание "передатчик пуст" Это уж не в тех-ли нормальных (типа STM), где забыли добавить FIFO в UART?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|