|
LPC2124 проблема с прерыванием на UART THRE |
|
|
|
Feb 21 2007, 14:51
|
Знающий
   
Группа: 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
|
|
|
|
|
 |
Ответов
|
Feb 21 2007, 18:38
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата Ну а потом пауза в передаче и ..... кто пинок делать будет? 'Проблема' отсутствия прерывания при его первом разрешении просто высосана из пальца. Это как раз и проблема, так я в процедуре отправки скопировал в буфе включил прерывание и он пошел колбасится, а тут еще и пинать надо  , так что это проблема не первого включения а проблема связана с тем что когда нечего передавать надо выключить прерывание, а когда надо что то передать приходится пинки раздавать разве это работа ?
|
|
|
|
|
Feb 21 2007, 20:36
|

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

|
Цитата(MALLOY2 @ Feb 21 2007, 17:38)  Это как раз и проблема Мне бы всегда такие "проблемы". В "идеальном" с Вашей точки зрения железе дергать разрешение прерывания когда есть/нет чего передавать (разбираясь перед этим есть или нет чего)это типа "прямо" и правильно  . А глянуть на один флаг в момент начала передачи порции это "разве это работа". Это гипотетический "идеальный" описанный Вами алгоритм. Код void print_zzz( char *string ) { //"я в процедуре отправки скопировал в буфер" while( *string ) { tbuf.buf[tbuf.tail&(TBUF_SIZE_MSK)] = *string++; tbuf.tail++; } //"включил прерывание" U0IER |= IER_THREIE;
//"и он пошел колбасится" } После того, как отколбасился еще некая процедура должна по каим-то признакам запретить прерывание Это "НЕПРАВИЛЬНЫЙ" Код void print_zzz( char *string ) { U0THR = *string++; while( *string ) { tbuf.buf[tbuf.tail&(TBUF_SIZE_MSK)] = *string++; tbuf.tail++; } } Ну и где "проблема"???
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 21 2007, 22:22
|

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

|
Цитата(zltigo @ Feb 21 2007, 19:36)  После того, как отколбасился еще некая процедура должна по каим-то признакам запретить прерывание само прерывание - если из буфера извлечен последний символ. Цитата(zltigo @ Feb 21 2007, 19:36)  Это "НЕПРАВИЛЬНЫЙ" Код void print_zzz( char *string ) { U0THR = *string++; while( *string ) { tbuf.buf[tbuf.tail&(TBUF_SIZE_MSK)] = *string++; tbuf.tail++; } } Ну и где "проблема"??? print_zzz("Tipa "); print_zzz("test"); В результате "Tt" попало в FIFO а "ipa est" в буфер. Неувязка.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 21 2007, 22:40
|

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

|
Цитата(Сергей Борщ @ Feb 21 2007, 21:22)  Неувязка. Читаем внимательно - приводился текст ТОЧНО по предложенному возмущающимся заданию. В задании НЕ ПРЕДУСМОТРЕН вариант, когда вызов функции запонения буфера производится до его опустошения. Какие проблемы? В противном случае - заводится флаг и реальная функция у меня выглядит так: Код void print_str( char *string ) { if( !(status_word & STW_THR_BUSY) ) { status_word |= STW_THR_BUSY; U0THR = *string++; } while( *string ) { tbuf.buf[tbuf.tail&(TBUF_SIZE_MSK)] = *string++; tbuf.tail++; } } Цитата(Сергей Борщ @ Feb 21 2007, 21:22)  само прерывание - если из буфера извлечен последний символ. Само - нет. Для "хорошего" UART придется еще написать: U0ICR |= IER_THREIE; Для "плохого" - ничего лишнего.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 29 2009, 15:42
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003

|
Цитата(zltigo @ Feb 22 2007, 01:40)  .. реальная функция у меня выглядит так... Извините за тупизну и поднятие старой темы, у меня есть вопросы касающийся кода функци приведнной в сообщении zltigo. Как реализовано "выгребание" буфера tbuf.buf? В прерываниях? Как реализована установка флага STW_THR_BUSY? Интересует конечно не конкретный код а алгоритм. Достаточно долго пытаюсь понять предложенное решение но что-то мозжечка не хватает, если не трудно, поясните пожалуйста. Заранее спасибо.
|
|
|
|
Сообщений в этой теме
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, 17:41 zltigo Цитата(MALLOY2 @ Feb 21 2007, 16:41) но у... Feb 21 2007, 18:25  Alex03 Цитата(zltigo @ Feb 21 2007, 20:25) Цитат... Feb 22 2007, 08:38   zltigo Цитата(Alex03 @ Feb 22 2007, 07:38) ИМХО ... Feb 22 2007, 09:22    Alex03 Цитата(zltigo @ Feb 22 2007, 11:22) Цитат... Feb 22 2007, 10:44 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|