Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поможите с UART на высокой скорости
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
EXeGLuMATOR
Имеем LPC2103 и соединение с VNC-1L по UART. На скоростях до 115200 все нормально. как только выше - виснет при приеме данных. Виснет в разных местах. Закономерность выявить не смог. Кварц 14.7456, т.е. скорости строго стандартные. Работает на прерываниях. Причем UART0 работает без проблем (по крайней мере не замечено никаких) до скорости 921600. UART1, к которому и подключен VNC по причине наличия аппаратного управления потоком, выше 115200 не хочет ни в какую. Одиночные символы и строки небольшой длины принимает/передает без проблем, но серию строк - уже никак. sad.gif Виснет намертво. Где - никак не могу разобраться. Обработчик (одинаковые для 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
может VNC-1L выснет? замкни UART0 на UART1, или UART1 tx<->rx. Если косяк в VNC-1L, сам с собой lpc прогонит строки без проблем.
EXeGLuMATOR
Не... тады бы все остальное работало. А виснет сам проц. И больше ни на что не реагирует. По ЮАРТ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
Попробуй поменять кварц было подобное изза кварца на LPC2294 стало все работать на ок !
Alex03
Цитата(EXeGLuMATOR @ Jan 18 2008, 16:27) *
Имеем LPC2103 и соединение с VNC-1L по UART. На скоростях до 115200 все нормально. как только выше - виснет при приеме данных. Виснет в разных местах. Закономерность выявить не смог. Кварц 14.7456, т.е. скорости строго стандартные. Работает на прерываниях. Причем UART0 работает без проблем (по крайней мере не замечено никаких) до скорости 921600. UART1, к которому и подключен VNC по причине наличия аппаратного управления потоком, выше 115200 не хочет ни в какую. Одиночные символы и строки небольшой длины принимает/передает без проблем, но серию строк - уже никак. sad.gif Виснет намертво. Где - никак не могу разобраться. Обработчик (одинаковые для UART0, UART1):

А UART1 с отключенным управлением потока как себя ведёт?
Бегло сравнил обработчик прерывания с моим - похожи.
Но у меня на приёме
Код
    do
    {
        ...
    }
    while (U1LSR & ULSR_RDR);

наоборот
Код
    while (U1LSR & ULSR_RDR)
    {
        ...
    }
Может это конечно и не существенно....

На передаче если Вы используете ФИФО то
Код
    while (U1LSR & ULSR_THRE)
    {
        U1THR = ...;
    }

Не имеет смысла, надо запихивать не глядя вплоть до 16-ти байт.

PS Пользуйтесь BB тегом code для публикации своего кода.
EXeGLuMATOR
Если кому интересно - разобрался с проблемой. И дело, как оказалось вовсе не в LPC. Просто с теми параметрами элементов, которые в даташите на VNC1L - на скоростях выше 230400 она работает крайне неустойчиво. Для корректной работы надо брать номиналы из даташита на VDRIVE2.
Нормальная работа на скорость вплоть до 921600 включительно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.