Перейти к содержанию
    

Поможите с UART на высокой скорости

Имеем 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 */

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может VNC-1L выснет? замкни UART0 на UART1, или UART1 tx<->rx. Если косяк в VNC-1L, сам с собой lpc прогонит строки без проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не... тады бы все остальное работало. А виснет сам проц. И больше ни на что не реагирует. По ЮАРТ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;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуй поменять кварц было подобное изза кварца на LPC2294 стало все работать на ок !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеем 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 для публикации своего кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если кому интересно - разобрался с проблемой. И дело, как оказалось вовсе не в LPC. Просто с теми параметрами элементов, которые в даташите на VNC1L - на скоростях выше 230400 она работает крайне неустойчиво. Для корректной работы надо брать номиналы из даташита на VDRIVE2.

Нормальная работа на скорость вплоть до 921600 включительно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...