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

 
 
> Сколько байт можно гарантированно запихивать в UART LPC (UART0 LPC2292) по прерыванию THRE?, Видимо 16
Alex03
сообщение Oct 11 2006, 05:38
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Будем считать что процедура записи в U0THR мгновеная, а скорость передачи сверхнизкая, т.е. байты улетать не успевают smile.gif

16? Или если ещё и LST_TEMP=1 (но это вряд ли) то и 17?

PS Гады. Ну реализовали они 550 UART но могли бы расширить флагами для статуса FIFO, а то и прерыванием по окончанию передачи из сдвигового регистра.
PPS FIFO понятно включен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Oct 11 2006, 06:17
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Alex03 @ Oct 11 2006, 08:38) *
16? Или если ещё и LST_TEMP=1 (но это вряд ли) то и 17?

Естествено 16, поскольку мгновенным ничего не бывает, и скорость передачи не бесконечно низкая, то и пока будете 16 запихивать первый уже в сдвиговый регистр в большинстве реальных приложений попадет, значит 17. 17-тым не пользуюсь, а 16 загружаю.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение Oct 11 2006, 07:29
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(zltigo @ Oct 11 2006, 12:17) *
Естествено 16, поскольку мгновенным ничего не бывает, и скорость передачи не бесконечно низкая, то и пока будете 16 запихивать первый уже в сдвиговый регистр в большинстве реальных приложений попадет, значит 17. 17-тым не пользуюсь, а 16 загружаю.


17 - пожалуй перебор.
Такой ситуации практически не бывает на относительно невысоких скоростях передачи.
Время передачи одного/двух бит (стоповый бит) или 7..11 бит (целого слова) часто довольно большое.
Например для B9600 м.б. ~100..1100мкс.
Да и на макс. скорости для 8N1 у проца есть 10*16 тактов, что вполне соизмеримо с временем записи 16 байтиков в U0THR с учётом хорошей оптимизации, задержек на ISR и тормознутой переферии.

А смутил меня попавшийся в двух примерах такой (псевдо)код в ISR:
Код
while (U0LSR & ULSR_THRE)
{
    U0THR = uart0_tx_buffer[uart0_tx_extract_idx++];
}


Т.е. они там по одному (в лучшем случае два) байту за прерывание отправляли, при активированном FIFO.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 11 2006, 10:24
Сообщение #4


Гуру
******

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



Цитата(Alex03 @ Oct 11 2006, 10:29) *
А смутил меня попавшийся в двух примерах такой (псевдо)код в ISR:
Код
while (U0LSR & ULSR_THRE)
{
    U0THR = uart0_tx_buffer[uart0_tx_extract_idx++];
}


Т.е. они там по одному (в лучшем случае два) байту за прерывание отправляли, при активированном FIFO.
Ну почему же один? U0LSR читается на каждом проходе цикла, пока FIFO не заполнится ULSR_THRE равен 1 и цикл будет выполняться. Т.е. 16-17 легко.


--------------------
На любой вопрос даю любой ответ
"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
Alex03
сообщение Oct 11 2006, 10:38
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(Сергей Борщ @ Oct 11 2006, 16:24) *
Ну почему же один? U0LSR читается на каждом проходе цикла, пока FIFO не заполнится ULSR_THRE равен 1 и цикл будет выполняться. Т.е. 16-17 легко.


Вот видимо те авторы так-же думали.

THRE - Transmitter Holding Register Empty
0: U0THR contains valid data.
1: U0THR is empty.
THRE is set immediately upon detection of an empty UART0 THR and is cleared on a U0THR write.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 11 2006, 14:43
Сообщение #6


Гуру
******

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



Цитата(Alex03 @ Oct 11 2006, 13:38) *
Цитата(Сергей Борщ @ Oct 11 2006, 16:24) *

Ну почему же один? U0LSR читается на каждом проходе цикла, пока FIFO не заполнится ULSR_THRE равен 1 и цикл будет выполняться. Т.е. 16-17 легко.


Вот видимо те авторы так-же думали.

THRE - Transmitter Holding Register Empty
0: U0THR contains valid data.
1: U0THR is empty.
THRE is set immediately upon detection of an empty UART0 THR and is cleared on a U0THR write.
Так ведь то что в него записано тут же падает в FIFO и пока FIFO не полон THR пуст.
The U0THR is the top byte of the UART0 Tx FIFO. The top byte is the newest character in the Tx FIFO and can be written via
the bus interface. The LSB represents the first bit to transmit.

Сообщение отредактировал Сергей Борщ - Oct 11 2006, 14:47


--------------------
На любой вопрос даю любой ответ
"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
Alex03
сообщение Oct 12 2006, 03:18
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(Сергей Борщ @ Oct 11 2006, 20:43) *
Так ведь то что в него записано тут же падает в FIFO и пока FIFO не полон THR пуст.
The U0THR is the top byte of the UART0 Tx FIFO. The top byte is the newest character in the Tx FIFO and can be written via the bus interface. The LSB represents the first bit to transmit.


Вы ж сами сказали
Цитата
The U0THR is the top byte of the UART0 Tx FIFO.

Т.е. U0THR это голова FIFO, а не отдельный регистр. И если в FIFO чтото есть то THR не пуст.

ИМХО у Филипса тут дока кривоватая. Все эти THRE (как прерывание и как бит в LSR) THR (как U0THR) и т.д. Вроде всё просто, но понимание приходит со временем.

В общем я уже на практике убедился в своих словах.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 13 2006, 12:20
Сообщение #8


Гуру
******

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



Цитата(Alex03 @ Oct 12 2006, 06:18) *
Вы ж сами сказали
Цитата
The U0THR is the top byte of the UART0 Tx FIFO.

Т.е. U0THR это голова FIFO, а не отдельный регистр. И если в FIFO чтото есть то THR не пуст.

ИМХО у Филипса тут дока кривоватая. Все эти THRE (как прерывание и как бит в LSR) THR (как U0THR) и т.д. Вроде всё просто, но понимание приходит со временем.

В общем я уже на практике убедился в своих словах.
Не поверив провел эксперимент. Действительно этот флаг сбрасывания при засовывании первого же байта. Обратился к прародителю, т.е. к TL16C550. Там расписано более подробно, и вот что нашлось:
Цитата
In the FIFO mode, this bit is set when the transmit FIFO is empty; it is cleared when at least 1 byte is written to the transmit FIFO.
Теперь все сходится, но осталось некоторое недоумение - внимательно перечитав доку на 550 я так и не нашел индикатора "в FIFO есть место". Получается если у меня есть один байт на передачу я его могу положить только в пустое FIFO, в противном случае никаких гарантий что я порушу предыдущие байты в FIFO. Выходит не только у филипса дока кривоватая, но и реализация у прародителя крива :-(


--------------------
На любой вопрос даю любой ответ
"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

Сообщений в этой теме
- Alex03   Сколько байт можно гарантированно запихивать в UART LPC (UART0 LPC2292) по прерыванию THRE?   Oct 11 2006, 05:38
|- - Сергей Борщ   Цитата(Alex03 @ Oct 12 2006, 06:18) Цитат...   Oct 12 2006, 07:09
||- - Alex03   Цитата(Сергей Борщ @ Oct 12 2006, 13:09) ...   Oct 12 2006, 08:49
||- - zltigo   Цитата(Alex03 @ Oct 12 2006, 11:49) А tbu...   Oct 12 2006, 12:01
||- - Alex03   Цитата(zltigo @ Oct 12 2006, 18:01) Сравн...   Oct 12 2006, 12:41
||- - zltigo   Цитата(Alex03 @ Oct 12 2006, 15:41) В как...   Oct 12 2006, 12:55
||- - Alex03   Цитата(zltigo @ Oct 12 2006, 18:55) Цитат...   Oct 13 2006, 07:37
||- - zltigo   Цитата(Alex03 @ Oct 13 2006, 10:37) Не по...   Oct 13 2006, 07:58
||- - Alex03   Цитата(zltigo @ Oct 13 2006, 13:58) В рас...   Oct 13 2006, 08:54
||- - zltigo   Цитата(Alex03 @ Oct 13 2006, 11:54) Если ...   Oct 13 2006, 09:29
|- - zltigo   Цитата(Сергей Борщ @ Oct 13 2006, 15:20) ...   Oct 13 2006, 15:06
- - zltigo   Код__irq __arm void uart_isr( void ) { reg...   Oct 12 2006, 06:52


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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 08:59
Рейтинг@Mail.ru


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