Easyelectronics.ru

Электроника для всех
Текущее время: 27 сен 2020, 23:19

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: LPC2468 + UART
СообщениеДобавлено: 11 мар 2012, 11:54 
Только пришел

Зарегистрирован: 11 мар 2012, 11:40
Сообщения: 5
Недавно начал изучать ARM. На первый раз решил сделать UART.
В целом что-то передается/принимается, но не то.
Электрическая часть работает, проверял замыканием входа на выход на шнурке. Ниже представляю код и результат работы. Прошу помощи в поиске грабель.
Инициализация UART:
Код:
void UARTInit( DWORD PortNum, DWORD baudrate )
{
  DWORD Fdiv;

  if ( PortNum == 0 )
  {
   PINSEL0 = 0x00000050;       /* RxD0 and TxD0 */

    U0LCR = 0x8F;      /* 8 bits, no Parity, 1 Stop bit */
    Fdiv = ( Fpclk / 16 ) / baudrate ;   /*baud rate */
    U0DLM = Fdiv / 256;                     
    U0DLL = Fdiv % 256;
   U0LCR = 0x03;      /* DLAB = 0 */
    U0FCR = 0x07;      /* Enable and reset TX and RX FIFO. */
  }
}

Вызов из маин:
Код:
UARTInit(0, 115200);

Функция отправки байта:
Код:
void sendchar (char ch)  {

    while (!(U0LSR & 0x20));
    U0THR = ch;
}

Вызов из маин:
Код:
while ( i < 100){
      //UARTsend(0,i,1);
      sendchar(i);
      i++;
   }

Результат:
Код:
ýûù÷õóñïíëéçåãáßÝÛÙ×ÕÓÑÏÍËÉÇÅÃÁ¿½»¹·µ³±¯­«©§¥£¡Ÿ›™—•“‘‹‰‡…ƒ}{ywusqomkigeca_][YWUSQOMKIGECA?=;9<0>

FD
FB
F9
F7
F5
F3
F1
EF
ED
EB
E9
E7
.
.
.
43
41
3F
3D
3B
39
00

Ощущение что переполнение переменной или что-то подобное.
Хотя я ожидаю вывод от 0 до 99


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LPC2468 + UART
СообщениеДобавлено: 12 мар 2012, 00:16 
Старожил
Аватара пользователя

Зарегистрирован: 30 окт 2010, 17:43
Сообщения: 372
Код:
Fdiv = ( Fpclk / 16 ) / baudrate ;   /*baud rate *

а разве не так?
Код:
Fdiv = ( Fpclk / 16 )* baudrate ;   /*baud rate *

_________________
"Арфы нет!Возьмите бубен."


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LPC2468 + UART
СообщениеДобавлено: 12 мар 2012, 18:40 
Только пришел

Зарегистрирован: 11 мар 2012, 11:40
Сообщения: 5
MixaNik писал(а):
Код:
Fdiv = ( Fpclk / 16 )* baudrate ;   /*baud rate *

Спасибо за интерес, но приведенная формула не корректна.

Формула от NXP:
Код:
Fdiv =  Fpclk /( 16 * baudrate );   /*baud rate *

Она идентична моей и частота вычисляется правильно.

Вопрос для меня открыт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LPC2468 + UART
СообщениеДобавлено: 12 мар 2012, 19:12 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Частота Fpclk какая?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LPC2468 + UART
СообщениеДобавлено: 12 мар 2012, 19:15 
Только пришел

Зарегистрирован: 11 мар 2012, 11:40
Сообщения: 5
Steel.ne писал(а):
Частота Fpclk какая?


15 МГц


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LPC2468 + UART
СообщениеДобавлено: 12 мар 2012, 19:27 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Это точно частота периферии?
Смотрим: DIV = 15000000/(16*115200) = 8.138
Дробная часть значительная (больше 1.5%), как бы не пришлось использовать Fractional Divider.

Попробуй на меньшей скорости, например 9600


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LPC2468 + UART
СообщениеДобавлено: 12 мар 2012, 19:31 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
И тут, мне кажется, бардак:

U0LCR = 0x8F;

0x8f = 10001111

На первый взгляд у тебя два стоп-бита вместо одного. Проверь побитно, я могу ошибиться

UPD. А, не, не заметил второго присвоения. Вроде с этим ОК.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LPC2468 + UART
СообщениеДобавлено: 13 мар 2012, 14:40 
Только пришел

Зарегистрирован: 11 мар 2012, 11:40
Сообщения: 5
to Steel.ne
Я пробовал при различных скоростях и режимах, результат устойчиво повторяется. Т.е. принимается всегда одно и тоже, я думаю, если проблемы были бы в задании частоты и режима, то принималась бы разная последовательность. Проблема где-то в коде.

При частоте 9600 дробной части нет, точная частота = 9664, что укладывается в границы.

Изучаю ассемблерный листинг на досуге.
Неужто никто не делал уарт? выложите свой код, у кого есть...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LPC2468 + UART
СообщениеДобавлено: 13 мар 2012, 14:53 
Только пришел

Зарегистрирован: 11 мар 2012, 11:40
Сообщения: 5
Код:
    14: void sendchar (char ch)  {
    15: 
0x00000498  E12FFF1E  BX        R14
    16:     while (!(U0LSR & 0x20));
0x0000049C  E1A00000  NOP       
0x000004A0  E59F1080  LDR       R1,[PC,#0x0080]
0x000004A4  E5911014  LDR       R1,[R1,#0x0014]
0x000004A8  E3110020  TST       R1,#0x00000020
0x000004AC  0AFFFFFB  BEQ       0x000004A0
    17:     U0THR = ch;
0x000004B0  E59F1070  LDR       R1,[PC,#0x0070]
0x000004B4  E5810000  STR       R0,[R1]
    18: }
    19: 


В симуляции отладки вроде тоже все нормально.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB