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

 
 
> LPC2124 проблема с прерыванием на UART THRE
MALLOY2
сообщение Feb 21 2007, 14:51
Сообщение #1


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



При включении прерывания U0IER_bit.THREIE = 1 не происходит прерывание при этом в U0LSR бит THRE и TEMT установлины. Происходит только после того как что то запишеш в U0THR. Я уже замучялся...

Код инициализации:

Код
    ubuff = &u0buff;
       ubuff->tx_buff = u0_buff_tx;
       ubuff->rx_buff = u0_buff_rx;
    ubuff->tx_buff_size = sizeof(u0_buff_tx);
    ubuff->rx_buff_size = sizeof(u0_buff_rx);
    PCONP_bit.PCURT0 = 1; //UART power on
    PINSEL0_bit.P0_0 = 1;//select pin for UART0  
    PINSEL0_bit.P0_1 = 1;
    U0FCR = 0xC1;
    uart_bautrate(UART0,32);
    U0LCR = 0x03; //1-8-N
    INT_Plug(UART0_ISR,VIC_UART0,IRQ_int,IRQ_Slot0);
    VIC_IntEnable(BIT(VIC_UART0));
    U0IER_bit.RDAIE = 1;
    U0IER_bit.RXLSIE = 1;


код функции передачи


Код
int uart_send_str(TUartChanel dev, const char* data)
{
  TUART_BUFF* ubuff;
  int len,fsize,head,i;
  unsigned long old_irq;
  char *ptr;
  ubuff = &u0buff;
  fsize = 0;
  len = strlen(data);
  ptr = (char*)data;
  do
   {
    do fsize = uart_tx_free(dev); while(fsize == 0);
    if (fsize > len) fsize = len;
    head = ubuff->tx_head;
    for (i=0;i<fsize;i++)
     {
      ubuff->tx_buff[head] = *ptr++;
      if(++head == ubuff->tx_buff_size) head = 0;
     }
    ubuff->tx_head = head;
    old_irq = disable_IRQ();
    ubuff->tx_size = ubuff->tx_size+i;
    restore_IRQ(old_irq);
    U0IER_bit.THREIE = 1; //<= включаем прерывание и оно не происходит
    len = len - fsize;    
   }
  while((*ptr!='\0')&&(len > 0));
  return(0);
};


код main

Код
  //U0THR = 0x00;  //<- если включить эту строку UART начинает генерить прерывания
  while(1)
   {
     uart_send_str(UART0,"HELLO WORD");
   }





Код обработчика:

Код
void UART0_ISR (void)
{
unsigned int tmp;
TUART_BUFF* ubuff = &u0buff;  
switch((U0IIR>>1)&0x7)
  {
   case IIR_THRE:   // continue sending data
        if (ubuff->tx_size == 0)U0IER_bit.THREIE = 0;
        else
         {
          U0THR = ubuff->tx_buff[ubuff->tx_tail];  
          ubuff->tx_size--;
          if (++ubuff->tx_tail == ubuff->tx_buff_size) ubuff->tx_tail = 0;
         }  
        break;
   case IIR_RSL:    
        tmp = U0LSR;
        ubuff->last_error |= tmp & 0x9E;
        break;
   case IIR_RDA:    // receive data
   case IIR_CTI:    // time out
        tmp = U0RBR;
        if (ubuff->eho_state == ON)
         {
          while(!U0LSR_bit.THRE);
          U0THR = tmp;
         };    
        if ((tmp == 0x0D) || (tmp == 0x0A)) ubuff->str_flag = 1;
        if (ubuff->rx_size == (ubuff->rx_buff_size-1))
         {
          ubuff->last_error |= RC_FIFO_OVERRUN_ERR;
         }
        else
         {
          ubuff->rx_buff[ubuff->rx_head] = tmp;    
          ubuff->rx_size++;
          if (++ubuff->rx_head == ubuff->rx_buff_size) ubuff->rx_head = 0;
         }
        break;
   }//switch
}  //isr
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MALLOY2
сообщение Feb 21 2007, 17:41
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
К какому кривому?
Мой примерный перевод (ускоренным ПРОМПТом)


UART0 THRE прерывание (U0IIR [3:1] = 001) - прерывание третьего уровня (приоритета), оно активизируется когда UART0 THR FIFO пуст и выполнены определенные условия.
Эти условия предназначены, чтобы дать UART0 THR FIFO шанс заполниться данными, чтобы устранить много прерываний THRE при запуске передачи.
Прерываний THRE имеет задержку на один символ минус СТОП-бит всякий раз, когда THRE=1 и не было по крайней мере двух символов в U0THR единовременно начиная с последнего THRE = 1 события. Эта задержка создана, чтобы дать время ЦПУ на запись данных в U0THR без прерывания THRE.
Прерывание THRE активизируется немедленно, если UART0 THR FIFO содержал как минимум два символа единовременно, а в настоящее время U0THR пуст.


кривизна в том, что при пустом передатчике и включении прерываний THRE прерывание не возникает пока не запишешь в THR хотя бы 1 символ. Не знаю откуда там они что сдирали или делали но у меня лежит плата с ST16C1550 и все он генерирует при включении прерывания.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 21 2007, 18:25
Сообщение #3


Гуру
******

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



Цитата(MALLOY2 @ Feb 21 2007, 16:41) *
но у меня лежит плата с ST16C1550 и все он генерирует при включении прерывания.

Вот именно он и "кривой", если так поступает.
У прародителя прерывание генерится при передаче стопового бита. Кроме того наличие "ложного" прерывания ничего не решает - ну разрешили прерывание, ну получили стартовый пинок. Ну а потом пауза в передаче и ..... кто пинок делать будет? 'Проблема' отсутствия прерывания
при его первом разрешении просто высосана из пальца.



Цитата(Alex03 @ Feb 21 2007, 16:30) *
Раньше я про посимвольную передачу чтото и не думал, ФИФО по максимуму. smile.gif

Так отключите FIFO и посимвольно с полным контролем над передачей.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение Feb 22 2007, 08:38
Сообщение #4


Местный
***

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



Цитата(zltigo @ Feb 21 2007, 20:25) *
Цитата(Alex03 @ Feb 21 2007, 16:30) *

Раньше я про посимвольную передачу чтото и не думал, ФИФО по максимуму. smile.gif

Так отключите FIFO и посимвольно с полным контролем над передачей.

ИМХО отключение FIFO насовсем не есть гут (накладных расходов на кучу прерываний может быть больше чем выйгрыш, да и шансов создания нежелательных пауз между передаваемыми словами побольше). smile.gif
А вот отправка последнего символа отдельно от всего пакета, тут можно подумать.

Меня и заинтересовало - пользовался ли кто этим для 485 в частности?


Ну а применительно к топикосоздателю:
Накой все эти игры с разрешениями/запретами прерываний? У меня все нужные прерывания включенны всегда, ну а происходят они тогда когда надо, если это не так, то порой можно отловить глюки, которых иначе не поймать было бы.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 22 2007, 09:22
Сообщение #5


Гуру
******

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



Цитата(Alex03 @ Feb 22 2007, 07:38) *
ИМХО отключение FIFO насовсем не есть гут (накладных расходов на кучу прерываний может быть больше чем выйгрыш,

Дело не в проигрыше/выигрыше а _необходимости_ выполнить какие-либо действия после передачи, например, байта. Если физический протокол так спроектировал кто-то, то это перечеркивает использование FIFO.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Alex03
сообщение Feb 22 2007, 10:44
Сообщение #6


Местный
***

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



Цитата(zltigo @ Feb 22 2007, 11:22) *
Цитата(Alex03 @ Feb 22 2007, 07:38) *

ИМХО отключение FIFO насовсем не есть гут (накладных расходов на кучу прерываний может быть больше чем выйгрыш,

Дело не в проигрыше/выигрыше а _необходимости_ выполнить какие-либо действия после передачи, например, байта. Если физический протокол так спроектировал кто-то, то это перечеркивает использование FIFO.

Угу. А реализовать эту _необходимость_ можно всякими способами. Вот тут и рассматриваются варианты с плюсами/минусами пройгрышами/выйгрышами.
Ну да ладно, думаю мы друг-друга поняли.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MALLOY2   LPC2124 проблема с прерыванием на UART THRE   Feb 21 2007, 14:51
- - DASM   Читаем. Внимательно. The UART0 THRE interrupt (U0I...   Feb 21 2007, 15:07
- - Сергей Борщ   Цитата(MALLOY2 @ Feb 21 2007, 13:51) При ...   Feb 21 2007, 15:13
- - MALLOY2   Вот кривизна, одно растройство, придется драйвер п...   Feb 21 2007, 15:43
|- - Сергей Борщ   Цитата(MALLOY2 @ Feb 21 2007, 14:43) а чт...   Feb 21 2007, 15:56
|- - Alex03   Цитата(MALLOY2 @ Feb 21 2007, 17:43) Вот ...   Feb 21 2007, 17:19
|- - Alex03   Цитата(Alex03 @ Feb 21 2007, 19:19) Если ...   Feb 21 2007, 17:30
- - MALLOY2   Цитата7:6 Rx Trigger Level Select 00: trigger leve...   Feb 21 2007, 16:19
|- - Сергей Борщ   Цитата(MALLOY2 @ Feb 21 2007, 15:19) а эт...   Feb 21 2007, 17:23
- - MALLOY2   ЦитатаНу а потом пауза в передаче и ..... кто пино...   Feb 21 2007, 18:38
|- - zltigo   Цитата(MALLOY2 @ Feb 21 2007, 17:38) Это ...   Feb 21 2007, 20:36
|- - Сергей Борщ   Цитата(zltigo @ Feb 21 2007, 19:36) После...   Feb 21 2007, 22:22
|- - zltigo   Цитата(Сергей Борщ @ Feb 21 2007, 21:22) ...   Feb 21 2007, 22:40
|- - smac   Цитата(zltigo @ Feb 22 2007, 01:40) .. ре...   Nov 29 2009, 15:42
- - MALLOY2   ЦитатаВ "идеальном" с Вашей точки зрения...   Feb 22 2007, 01:08
|- - zltigo   Цитата(MALLOY2 @ Feb 22 2007, 00:08) но к...   Feb 22 2007, 01:51
- - MALLOY2   Цитатаи нигде небыло проблем. Их нет и в LPC, ес...   Feb 22 2007, 12:18
|- - gladov   Цитата(MALLOY2 @ Feb 22 2007, 12:18) врям...   Feb 22 2007, 12:44
||- - zltigo   Цитата(gladov @ Feb 22 2007, 11:44) У Вас...   Feb 22 2007, 18:24
|- - zltigo   Цитата(MALLOY2 @ Feb 22 2007, 11:18) а у ...   Feb 22 2007, 18:12
- - MALLOY2   результат такой же , и АRM имеет команды которые ...   Feb 22 2007, 13:20


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

 


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


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