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

 
 
 
Reply to this topicStart new topic
> LPC2148 проблема с UART, LPC2148 проблема с UART
Сергей1
сообщение Feb 9 2008, 11:50
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 9-02-08
Пользователь №: 34 886



Здраствуйте!
Пытаюсь получить с компа строку символов, ничего не получается.

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, т.е. последний символ.
Подскажите, где может быть проблема.
Go to the top of the page
 
+Quote Post
Alex03
сообщение Feb 13 2008, 03:28
Сообщение #2


Местный
***

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



Уж сколько раз тверили миру....
Что 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;
...

не катит
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Feb 13 2008, 05:00
Сообщение #3


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Это инициализация, а где код самой функции которая строку передает ?
Go to the top of the page
 
+Quote Post
Сергей1
сообщение Feb 13 2008, 18:13
Сообщение #4





Группа: Новичок
Сообщений: 8
Регистрация: 9-02-08
Пользователь №: 34 886



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

}

Принятый байт отправить. При передачи строки с компа, эта функция срабатывает только для последнего символа строки. Если с компа передавать не строку, а отдельные символы то все нормально!
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 13 2008, 20:53
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Сергей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
Go to the top of the page
 
+Quote Post
Сергей1
сообщение Feb 15 2008, 08:26
Сообщение #6





Группа: Новичок
Сообщений: 8
Регистрация: 9-02-08
Пользователь №: 34 886



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

_irq есть в первом сообщении(см.выше)
FIFO запрещен
Разрешено прерывание по приему символа
Следовательно программа должна заходить в функцию обработки прерываний после каждого символа, а она туда попадает после принятия последнего символа строки (не зависимо от длины строки)
Go to the top of the page
 
+Quote Post
Сергей1
сообщение Feb 19 2008, 23:24
Сообщение #7





Группа: Новичок
Сообщений: 8
Регистрация: 9-02-08
Пользователь №: 34 886



А ошибка то была идиотская!

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

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

Вот так!" lol.gif lol.gif lol.gif
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 20 2008, 07:11
Сообщение #8


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



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

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

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

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

И что помогло???
Насколько я помню количество стоп битов влияет только на передатчик, для лучшей синхронизаии если частоты отличаются. А приемнику главное принять 1 стоп бит иначе будет FRAME ERROR
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 20 2008, 07:28
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(KRS @ Feb 20 2008, 10:11) *
И что помогло???

Вы же знаете правильный ответ - два стоп бита не причина smile.gif. Что-то другое действительно подправлено.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей1
сообщение Feb 20 2008, 19:34
Сообщение #10





Группа: Новичок
Сообщений: 8
Регистрация: 9-02-08
Пользователь №: 34 886



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


В программе я поменял только U0LCR_bit.SBS=1 на U0LCR_bit.SBS=0
И больше ничего.Хотя это на самом деле не должно влиять на приемник!
Go to the top of the page
 
+Quote Post

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

 


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


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