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

 
 
> Поможите с 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
Ответов
EXeGLuMATOR
сообщение Jan 18 2008, 12:14
Сообщение #2


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

Группа: Свой
Сообщений: 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



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

 


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


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