|
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, 17:19
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(MALLOY2 @ Feb 21 2007, 17:43)  Вот кривизна, одно растройство, придется драйвер переписывать  , а что их привело к такому кривому решению ? К какому кривому? Мой примерный перевод (ускоренным ПРОМПТом) Цитата 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 пуст. Если плюёте пачками (в идеале по 16 байт) то прерывание когда очередь пуста, но ещё передаётся последний байт. Т.е. можно ещё 16 байт в ФИФО загонять. Если шлёте по одному байту то прерывание когда передаётся стоповый бит. Вот отсутствие прерывания по TEMP многие кто реализовывал 485 считают более существенным недостатком. Но... Во времена создания 16550 считали каждый транзистор в чипе.
|
|
|
|
|
Feb 21 2007, 17:30
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(Alex03 @ Feb 21 2007, 19:19)  Если шлёте по одному байту то прерывание когда передаётся стоповый бит.
Вот отсутствие прерывания по TEMP многие кто реализовывал 485 считают более существенным недостатком. Написал и подумал... А ведь это возможное решение. Т.е. при передаче песледний символ отправлять всегда отдельно. Тогда прерывание будет уже во время передачи СТОП-бита, который единичный. Конечно нехорошо в это время выключать передатчик 485, но в ряде случаев видимо получим приемлимый вариант? Подождать тем же полингом один бит всегда дешевле чем весь символ. Или например физический интерфейс типа к-лайна в авто, там оно видимо покатит. Ктонить пробовал? Раньше я про посимвольную передачу чтото и не думал, ФИФО по максимуму.
|
|
|
|
Сообщений в этой теме
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, 14:43) а чт... Feb 21 2007, 15:56 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 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|