|
Сколько байт можно гарантированно запихивать в UART LPC (UART0 LPC2292) по прерыванию THRE?, Видимо 16 |
|
|
|
Oct 11 2006, 05:38
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Будем считать что процедура записи в U0THR мгновеная, а скорость передачи сверхнизкая, т.е. байты улетать не успевают  16? Или если ещё и LST_TEMP=1 (но это вряд ли) то и 17? PS Гады. Ну реализовали они 550 UART но могли бы расширить флагами для статуса FIFO, а то и прерыванием по окончанию передачи из сдвигового регистра. PPS FIFO понятно включен.
|
|
|
|
|
 |
Ответов
|
Oct 11 2006, 06:17
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Oct 11 2006, 07:29
|
Местный
  
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Oct 11 2006, 10:24
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Oct 11 2006, 10:38
|
Местный
  
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Oct 11 2006, 14:43
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Oct 12 2006, 03:18
|
Местный
  
Группа: Свой
Сообщений: 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) и т.д. Вроде всё просто, но понимание приходит со временем. В общем я уже на практике убедился в своих словах.
|
|
|
|
|
Oct 13 2006, 12:20
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|