Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2292 передача данных через UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
HEX
Нет уверености что делаю правельно. Как заполнить 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);
}


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

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

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


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


У меня в этом месте есть механизм запрета THRE прерываний (лпц2368). Т.е. если в Queue кол-во байт меньше чем глубина аппаратного фифо - стоп машина.
HEX
Цитата(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 третьй уровень но наиболее важное, соотв в приведенном коде обработчика надо поменять порядок обработки причин наооборот.
zltigo
Цитата(HEX @ Mar 19 2008, 11:59) *
Или писать не более 16 байт (или склолько там размер FIFO)?

А я что писал? Именно так - Быстро и эффективно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.