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

 
 
 
Reply to this topicStart new topic
> LPC2292 передача данных через UART, обслуживание прерывания THR FIFO is empty
HEX
сообщение Mar 19 2008, 07:06
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228



Нет уверености что делаю правельно. Как заполнить FIFO отсылки в одном прерывании THRE?

Обработчик прерывания:
Код
void UART_IRQHandler(void)
{
  Byte B;
  Byte Er;
  Byte Src;

  do {
    Src = U1IIR;
    switch(Src & 0x0E) {
      //Er
      case 0x06: {
        Er = U1LSR;
        break;
      }
      //RxData
      case 0x04: {
        while (U1LSR_bit.DR != 0)
          InQueue.Put(U1RBR);
        break;
      }
      //CTI
      case 0x0C: {
        while (U1LSR_bit.DR != 0)
          InQueue.Put(U1RBR);
        break;
      }
      //THRE
      case 0x02: {
        if (OutQueue.Get(&B))
          U1THR = B;
        break;
      }
    }
  }
  while((Src & 0x01) == 0);
}


Заранее спасибо.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 19 2008, 07:42
Сообщение #2


Гуру
******

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



Цитата(HEX @ Mar 19 2008, 10:06) *
Нет уверености что делаю правельно. Как заполнить FIFO отсылки в одном прерывании THRE?

Предлагаете по приведенному куску не толко догадатся ЧТО Вы хотите сделать, но и правилльно-ли Вы это сделали? Если речь идет о заполнении всего FIFO, то просто тупо забиваете его в прерывании на всю его глубину, посколько известно, что FIFO на данный момент совсем пустое.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ig_z
сообщение Mar 19 2008, 08:56
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Цитата(HEX @ Mar 19 2008, 11:06) *
Нет уверености что делаю правельно. Как заполнить FIFO отсылки в одном прерывании THRE?

Обработчик прерывания:
Код
      //THRE
      case 0x02: {
        if (OutQueue.Get(&B))
          U1THR = B;
        break;
      }


Заранее спасибо.


У меня в этом месте есть механизм запрета THRE прерываний (лпц2368). Т.е. если в Queue кол-во байт меньше чем глубина аппаратного фифо - стоп машина.
Go to the top of the page
 
+Quote Post
HEX
сообщение Mar 19 2008, 08:59
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228



Цитата(zltigo @ Mar 19 2008, 10:42) *
Предлагаете по приведенному куску не толко догадатся ЧТО Вы хотите сделать, но и правилльно-ли Вы это сделали? Если речь идет о заполнении всего FIFO, то просто тупо забиваете его в прерывании на всю его глубину, посколько известно, что FIFO на данный момент совсем пустое.


Вопрос в том как заполнить FIFO отсылки в одном прерывании.
Для приемного FIFO все понятно если в LineStatusRegister бит Data Ready != 0 в FIFO есть данные можно забирать.
Код
while (U1LSR_bit.DR != 0)
  InQueue.Put(U1RBR);


В обслуживании прерывания по причине THRE (UART THR FIFO is empty) есть ли какой либо флаг указывающий что можно писать в Transmit Holding Register? Или писать не более 16 байт (или склолько там размер FIFO)?
Тот же вопрос при запуске посылки. Что бы запустить передачу на до записать в Transmit Holding Register данные. Опять же, если используется FIFO можно записать сразу больше одного байта.

Одну неточность я у себя нашел, чего то запутался с уровнями и приорететами THRE третьй уровень но наиболее важное, соотв в приведенном коде обработчика надо поменять порядок обработки причин наооборот.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 19 2008, 10:01
Сообщение #5


Гуру
******

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



Цитата(HEX @ Mar 19 2008, 11:59) *
Или писать не более 16 байт (или склолько там размер FIFO)?

А я что писал? Именно так - Быстро и эффективно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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