реклама на сайте
подробности

 
 
> Поможите с UART на высокой скорости
EXeGLuMATOR
сообщение Jan 18 2008, 11:27
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Имеем 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 */
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
klen
сообщение Jan 18 2008, 11:45
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



может VNC-1L выснет? замкни UART0 на UART1, или UART1 tx<->rx. Если косяк в VNC-1L, сам с собой lpc прогонит строки без проблем.
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Jan 18 2008, 12:14
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Не... тады бы все остальное работало. А виснет сам проц. И больше ни на что не реагирует. По ЮАРТ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;
}
Go to the top of the page
 
+Quote Post
asen
сообщение Jan 19 2008, 11:49
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 5-09-05
Из: Барнаул
Пользователь №: 8 220



Попробуй поменять кварц было подобное изза кварца на LPC2294 стало все работать на ок !
Go to the top of the page
 
+Quote Post
Alex03
сообщение Jan 21 2008, 06:25
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(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 для публикации своего кода.
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Mar 26 2008, 07:28
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Если кому интересно - разобрался с проблемой. И дело, как оказалось вовсе не в LPC. Просто с теми параметрами элементов, которые в даташите на VNC1L - на скоростях выше 230400 она работает крайне неустойчиво. Для корректной работы надо брать номиналы из даташита на VDRIVE2.
Нормальная работа на скорость вплоть до 921600 включительно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 00:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016