EXeGLuMATOR 0 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба Имеем LPC2103 и соединение с VNC-1L по UART. На скоростях до 115200 все нормально. как только выше - виснет при приеме данных. Виснет в разных местах. Закономерность выявить не смог. Кварц 14.7456, т.е. скорости строго стандартные. Работает на прерываниях. Причем UART0 работает без проблем (по крайней мере не замечено никаких) до скорости 921600. UART1, к которому и подключен VNC по причине наличия аппаратного управления потоком, выше 115200 не хочет ни в какую. Одиночные символы и строки небольшой длины принимает/передает без проблем, но серию строк - уже никак. :( Виснет намертво. Где - никак не могу разобраться. Обработчик (одинаковые для UART0, UART1): void UART1Handler (void) __irq { u08 iid; // loop until not more interrupt sources while (((iid = U1IIR) & UIIR_NO_INT) == 0) { // identify & process the highest priority interrupt switch (iid & UIIR_ID_MASK) { case UIIR_RLS_INT: // Receive Line Status U1LSR; // read LSR to clear break; case UIIR_CTI_INT: // Character Timeout Indicator case UIIR_RDA_INT: // Receive Data Available do { // calc next insert index & store character utemp1 = (uart1_rx_insert_idx + 1) % UART1_RX_BUFFER_SIZE; uart1_rx_buffer[uart1_rx_insert_idx] = U1RBR; // check for more room in queue if (utemp1 != uart1_rx_extract_idx) uart1_rx_insert_idx = utemp1; // update insert index } while (U1LSR & ULSR_RDR); break; case UIIR_THRE_INT: // Transmit Holding Register Empty while (U1LSR & ULSR_THRE) { // check if more data to send if (uart1_tx_insert_idx != uart1_tx_extract_idx) { U1THR = uart1_tx_buffer[uart1_tx_extract_idx++]; uart1_tx_extract_idx %= UART1_TX_BUFFER_SIZE; } else { // no uart1_tx_running = 0; // clear running flag break; } } break; default: // Unknown U1LSR; U1RBR; U1MSR; break; } } VICVectAddr = 0; /* Acknowledge Interrupt */ } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба может VNC-1L выснет? замкни UART0 на UART1, или UART1 tx<->rx. Если косяк в VNC-1L, сам с собой lpc прогонит строки без проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EXeGLuMATOR 0 18 января, 2008 Опубликовано 18 января, 2008 · Жалоба Не... тады бы все остальное работало. А виснет сам проц. И больше ни на что не реагирует. По ЮАРТ0 идет управление всем этим делом. В оснвном цикле работы нету никаких операторов, которые могли-бы уйти в бесконечный цикл. Все операции имеют конечное число проходов. Остается только обработчик прерывания. Ну и еще процедурки приема-передачи символа/строки. Например вот: int uart1Putch(int ch) { u16 temp; temp = (uart1_tx_insert_idx + 1) % UART1_TX_BUFFER_SIZE; if (temp == uart1_tx_extract_idx) return -1; // no room U1IER &= ~UIER_ETBEI; // disable TX interrupts // check if in process of sending data if (uart1_tx_running) { // add to queue uart1_tx_buffer[uart1_tx_insert_idx] = (u08)ch; uart1_tx_insert_idx = temp; } else { // set running flag and write to output register uart1_tx_running = 1; U1THR = (u08)ch; } U1IER |= UIER_ETBEI; // enable TX interrupts return (u08)ch; } int uart1Getch(void) { u08 ch; if (uart1_rx_insert_idx == uart1_rx_extract_idx) // check if character is available return -1; ch = uart1_rx_buffer[uart1_rx_extract_idx++]; // get character, bump pointer uart1_rx_extract_idx %= UART1_RX_BUFFER_SIZE; // limit the pointer return ch; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asen 0 19 января, 2008 Опубликовано 19 января, 2008 · Жалоба Попробуй поменять кварц было подобное изза кварца на LPC2294 стало все работать на ок ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex03 0 21 января, 2008 Опубликовано 21 января, 2008 · Жалоба Имеем LPC2103 и соединение с VNC-1L по UART. На скоростях до 115200 все нормально. как только выше - виснет при приеме данных. Виснет в разных местах. Закономерность выявить не смог. Кварц 14.7456, т.е. скорости строго стандартные. Работает на прерываниях. Причем UART0 работает без проблем (по крайней мере не замечено никаких) до скорости 921600. UART1, к которому и подключен VNC по причине наличия аппаратного управления потоком, выше 115200 не хочет ни в какую. Одиночные символы и строки небольшой длины принимает/передает без проблем, но серию строк - уже никак. :( Виснет намертво. Где - никак не могу разобраться. Обработчик (одинаковые для UART0, UART1): А UART1 с отключенным управлением потока как себя ведёт? Бегло сравнил обработчик прерывания с моим - похожи. Но у меня на приёме do { ... } while (U1LSR & ULSR_RDR); наоборот while (U1LSR & ULSR_RDR) { ... } Может это конечно и не существенно.... На передаче если Вы используете ФИФО то while (U1LSR & ULSR_THRE) { U1THR = ...; } Не имеет смысла, надо запихивать не глядя вплоть до 16-ти байт. PS Пользуйтесь BB тегом code для публикации своего кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EXeGLuMATOR 0 26 марта, 2008 Опубликовано 26 марта, 2008 · Жалоба Если кому интересно - разобрался с проблемой. И дело, как оказалось вовсе не в LPC. Просто с теми параметрами элементов, которые в даташите на VNC1L - на скоростях выше 230400 она работает крайне неустойчиво. Для корректной работы надо брать номиналы из даташита на VDRIVE2. Нормальная работа на скорость вплоть до 921600 включительно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться