Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2148 проблема с UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Сергей1
Здраствуйте!
Пытаюсь получить с компа строку символов, ничего не получается.

void UART0init(unsigned int baudrate)
{
PINSEL0_bit.P0_0 = 0x01; //линию P0.0 сделать выходом TXD0 UART0
PINSEL0_bit.P0_1 = 0x01; //линию P0.1 сделать входом RXD0 UART0

U0LCR_bit.DLAB = 1; //разрешить запись в настройки делителя UART0
U0DLL = 15000000/(16*baudrate); // задание мл байта скорости обмена
U0DLM = ((15000000/(16*baudrate)) >> 8); // задание ст байта скорости обмена
U0LCR_bit.DLAB = 0; //разрешить обращение к буферам UART0
U0LCR_bit.WLS = 0x03; //длина символа 8 битов
U0LCR_bit.SBS=1; //1 стоповый бит

U0FCR_bit.FCRFE =0;
U0FCR_bit.RFR = 1; //сбросить приемный буфер FIFO
U0FCR_bit.TFR = 1; //сбросить передающий буфер FIFO
U0FCR_bit.RTLS =0;
U0FCR_bit.IIRFE =0;
U0FCR_bit.IP =0;
U0IER_bit.RDAIE = 1; //разрешить прерывание по приему данных в буфер
}

//Функция передачи байта через UART0
void UART0send_byte(unsigned char tx_byte)
{
while(U0LSR_bit.THRE==0);

U0THR = tx_byte; //запись в буфер передачи UART0
}

void INITInterrupt(void)
{
VICProtection=0;
VICIntSelect=0x00000000;

VICVectAddr2=(unsigned int)&Int0;
VICVectAddr1=(unsigned int)&Int2;
VICVectAddr0=(unsigned int)&UART0_tx;

VICVectCntl2=0x0000002E;
VICVectCntl1=0x00000030;
VICVectCntl0=0x00000026;

VICIntEnable=0x00014040;
}

#pragma vector=0x18
__irq __arm void irq_handler(void)
{
void (*interrupt_function)();
unsigned int vector;
vector=VICVectAddr;
interrupt_function=(void(*)())vector;
(*interrupt_function)();
VICVectAddr=0;
}

static void UART0_tx()
{
tx_byt=U0RBR;
while(U0LSR_bit.DR==0);
UART0send_byte(tx_byt);

}
При передаче одного символа все нормально, а если передавать строку все плохо.
Например если передавать 123, то возвращается 3, если 12345- 5, т.е. последний символ.
Подскажите, где может быть проблема.
Alex03
Уж сколько раз тверили миру....
Что FCR доступен только на запись.
Поэтому как минимум вот это:
Цитата(Сергей1 @ Feb 9 2008, 16:50) *
...
U0FCR_bit.FCRFE =0;
U0FCR_bit.RFR = 1; //сбросить приемный буфер FIFO
U0FCR_bit.TFR = 1; //сбросить передающий буфер FIFO
U0FCR_bit.RTLS =0;
U0FCR_bit.IIRFE =0;
U0FCR_bit.IP =0;
...

не катит
MALLOY2
Это инициализация, а где код самой функции которая строку передает ?
Сергей1
static void UART0_tx()
{
tx_byt=U0RBR;
while(U0LSR_bit.DR==0);
UART0send_byte(tx_byt);

}

Принятый байт отправить. При передачи строки с компа, эта функция срабатывает только для последнего символа строки. Если с компа передавать не строку, а отдельные символы то все нормально!
KRS
Цитата(Сергей1 @ Feb 13 2008, 21:13) *
static void UART0_tx()
{
tx_byt=U0RBR;
while(U0LSR_bit.DR==0);
UART0send_byte(tx_byt);

}

Если это обработчик прерывания то он как миниму должен быть объявлен как __irq
Еще неплохо бы проверять в обработчике флаги уарта что символ действительно приянт!
И к тому же если фифо разрешено то может быть принято несколько символов.
Так же ожидать в обработчике прерывания освобождения UART на отправку не очень хорошо.

Попробуйте для начало все релаизовать без прерываний. (полингом) тем более что есть аппаратный FIFO
Сергей1
Без прерываний пробовал, все получается,но в этой задаче лучше с прерываниями.
(В AVRах таких проблем никогда не возникало)

_irq есть в первом сообщении(см.выше)
FIFO запрещен
Разрешено прерывание по приему символа
Следовательно программа должна заходить в функцию обработки прерываний после каждого символа, а она туда попадает после принятия последнего символа строки (не зависимо от длины строки)
Сергей1
А ошибка то была идиотская!

U0LCR_bit.SBS=0=1; 2 стоп-бита

А на компе терминал настроен на 1.

Вот так!" lol.gif lol.gif lol.gif
KRS
Цитата(Сергей1 @ Feb 20 2008, 02:24) *
А ошибка то была идиотская!

U0LCR_bit.SBS=0=1; 2 стоп-бита

А на компе терминал настроен на 1.

Вот так!" lol.gif lol.gif lol.gif

И что помогло???
Насколько я помню количество стоп битов влияет только на передатчик, для лучшей синхронизаии если частоты отличаются. А приемнику главное принять 1 стоп бит иначе будет FRAME ERROR
zltigo
Цитата(KRS @ Feb 20 2008, 10:11) *
И что помогло???

Вы же знаете правильный ответ - два стоп бита не причина smile.gif. Что-то другое действительно подправлено.
Сергей1
Цитата(KRS @ Feb 20 2008, 10:11) *
И что помогло???
Насколько я помню количество стоп битов влияет только на передатчик, для лучшей синхронизаии если частоты отличаются. А приемнику главное принять 1 стоп бит иначе будет FRAME ERROR


В программе я поменял только U0LCR_bit.SBS=1 на U0LCR_bit.SBS=0
И больше ничего.Хотя это на самом деле не должно влиять на приемник!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.