Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите настроить
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
MixEr
Проблема в прнцепе простая:
Использую в LPC2124 UART0.
Проинициализировал его, настроил на использование прерываний.
Написал функции приема и передачи, запускающиеся из обработчика прерываний.
Так вот передача работает нормально, передается нужная посылка, состоящая из нескольких байт.
А при приеме возникли проблемы. Прерывание по приему байта не генерится. Причем в том, что данные приходят на RxD сомнений нет.
Может быть кто подскажет как правильно проинициализировать UART для работы и на прием и на передачу.

TUART::TUART()
{
PINSEL0 |= 0x05; //выбираем альтернативную функцию
U0FCR = 0x07; //активируем FIFO буфер для приемника и передатчика и очищаем их
U0LCR = 0x83; //8 бит без контроля четности 1 стоп-бит
U0DLL = BAUDRATEDIVISOR & 0x00ffж //записываем младший байт делителя
U0DLM = (BAUDRATEDIVISOR >> 8) & 0x00ff; //записываем старший байт делителя
U0LCR = 0x03;
U0IER = 0x03; // Rx and Tx interrupt
VICIntSelect &= ~VIC_UART0_bit; // IRQ on UART0.
VICVectAddr5 = (unsigned int)&UART0isr;
VICVectCntl5 = 0x20|isrUART0; // Enable vector interrupt for UART0.
VICIntEnable = VIC_UART0_bit; // Enable UART 0 interrupt.
U0LCR_bit.DLAB = 0;
}
etoja
1. Напиши программу приёма байта из UART по готовности (без прерываний) для проверки факта приёма.

2. Работа по прерыванию от приёма байта :

// --------------------------------------------------------------------------------
void UART1_Init(long baud)
{
unsigned int divisor = peripheralClockFrequency() / (16 * baud);

PCB_PINSEL0 |= 0x00050000; // Select UART1 RXD/TXD
UART1_LCR = 0x87; // 8N2, enable Divisor latch bit
UART1_IER = 0X00; // 0: запретить прерывания
UART1_DLL = divisor & 0xFF;
UART1_DLM = (divisor >> 8) & 0xFF;
UART1_LCR &= ~0x80;

UART1_FCR = 1; //1: Enable FIFO's
Uart_Init_Delay();
UART1_FCR = 7; //6: Reset TX and RX FIFO
Uart_Init_Delay();
}
// --------------------------------------------------------------------------------

//select interrupts

VICIntSelect=0x00000000; // IRQ
VICSoftInt = 0x00000000;
VICSoftIntClear = ~VICSoftInt;

VICVectAddr4=(unsigned)uart1_isr; // UART1 на приём
VICVectCntl4 = 0x20 | 7;
VICIntEnable = 0x00000080;

// --------------------------------------------------------------------------------
#pragma interrupt_handler uart1_isr // эта строчка - для компилятора ICCV7
void uart1_isr(void)
{
unsigned char id, status, bChar;
id=UART1_IIR; //read interrupt id to clear flag
if((id & 0b0100) != 0)
{
status = UART1_LSR; // Get status register

if(status & 1) // If Holding is empty then send
{
RxChar = UART1_RBR; // записываем принятый байт в переменную
RxRdy = 1; // признак, что прерывание произошло
if(xRx < RxLEN) Rxbuf[xRx++]= RxChar; // записываем принятый байт в буфер, пока есть место
}
}
VICVectAddr = 0; // Acknowledge Interrupt
}
// -------------------------------------------------------------------------------------------
// ---- приём по готовности, без прерываний -----------------------
unsigned char rx_char1( void)
{
while(RxRdy == 0);
RxRdy = 0;
return(RxChar);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.