Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-дек-17 17:01

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-окт-17 09:45 
Не в сети

Зарегистрирован: 2012-окт-17 09:28
Сообщения: 12
Здравствуйте уважаемые форумчане.
Разбираюсь с отладочным комплектом на мк 1901ВЦ1х. Не могу разобраться с работой uart. Разъем DB-9 подключен к Uart 3. В демо примере реализован uart 1 для работы с lcd дисплеем.
Может есть примеры по реализации Uart 3? буду очень благодарен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-окт-19 09:07 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-авг-07 09:58
Сообщения: 132
Держите.


Вложения:
Uart.rar [4.06 МБ]
Скачиваний: 232
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-окт-19 09:22 
Не в сети

Зарегистрирован: 2012-окт-17 09:28
Сообщения: 12
Спасибо огромноеееее :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-дек-07 13:57 
Не в сети

Зарегистрирован: 2012-дек-07 13:52
Сообщения: 4
Добрый день

Подскажите пожалуйста, что я делаю не так при инициализации UAR3


#define RXE ((WORD)0x0200)
#define TXE ((WORD)0x0100)
#define UART_EN ((WORD)0x0001)


void Init_UART3()
{

DWORD integerdivider,fractionaldivider;

PORTF->FUNC=0x0000000A;
PORTF->PWR=0x0000000A;
PORTF->ANALOG=0x00000003;

RST_CLK->UART_CLOCK=0x04000000;

//divider = 40000000 / (9600 *16);
integerdivider = 260;
/* Determine the fractional part */
fractionaldivider = 27;

UART3->IBRD=integerdivider;//SPEED[NrSpeed].Integer;
UART3->FBRD=fractionaldivider;//SPEED[NrSpeed].Fraction;
UART3->LCR_H=data_bit_8|stop_bit_1|parity_none|FIFO_ON;
UART3->CR=RXE|TXE;//|UART_EN;
UART3->CR|=UART_EN;
}

Отправка байта

void sendchar_UART3(char c)
{
while(UART3->FR &0x00000020)

UART3->DR=c;
}

Что я делаю не так?

Инициализация частоты процессора как из вашего примера

Заранее спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-дек-07 15:26 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 733
Откуда: АО "ПКК Миландр"
в приведенном коде вроде бы все хорошо. Тактирование PORTF и UART3 вы включаете (в регистре RST_CLK->PER_CLOCK)? Если есть возможность, то выложите весь проект.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-дек-10 10:31 
Не в сети

Зарегистрирован: 2012-дек-07 13:52
Сообщения: 4
Получить / принять данные удалось, но с ошибкой

К примеру отправляю символ '2' а приходит '0'

Программа Terminal.exe также находиться в архиве.

В чем ошибка пока не могу понять. Может терминал "кривой".


Вложения:
IKAR_uOS.rar [837.58 КБ]
Скачиваний: 167
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-дек-10 17:01 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 733
Откуда: АО "ПКК Миландр"
Дмитрий Сергеев писал(а):
Получить / принять данные удалось, но с ошибкой

К примеру отправляю символ '2' а приходит '0'

Программа Terminal.exe также находиться в архиве.

В чем ошибка пока не могу понять. Может терминал "кривой".

Предлагаю функцию ClockConfigure() сделать такой:
Код:
void ClockConfigure()
{
  RST_CLK->PER_CLOCK = 0xFFFFFFFF;

  RST_CLK->HS_CONTROL = 0x01;                               // HSE_ON
  while ( (RST_CLK->CLOCK_STATUS & 0x04) == 0);

  RST_CLK->CPU_CLOCK = 0x02;                    //добавил эту строчку (HSE источник сигнала для PLL, ядро работает на частоте HSI)

  RST_CLK->PLL_CONTROL |= 0x0904;                   
  while ( (RST_CLK->CLOCK_STATUS & 0x02) == 0);
  EEPROM->CMD = 0x0018;
  RST_CLK->CPU_CLOCK = 0x0106;                //ядро и периферия работает на 80МГц от PLL                                 
}


И поменять делители в функции Init_UART3() на:
Код:
   UART3->IBRD = 0x0208;   // 9600 бит/с при 80МГц
        UART3->FBRD = 0x035;


HSI нестабильный генератор, и я бы рекомендовал вам работать от внешнего резонатора/генератора. Нестабильная частота HSI, скорее всего, и дает плавающий прием/передачу данных через UART.

Я рассматривал работу только UART, остальные детали проекта не смотрел, и как повлияли данные изменения стоит уточнить вам.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-дек-11 08:10 
Не в сети

Зарегистрирован: 2012-дек-07 13:52
Сообщения: 4
Спасибо огромное, все заработало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2015-мар-25 16:18 
Не в сети

Зарегистрирован: 2012-июн-01 14:12
Сообщения: 38
Относительно работы UART возник следующий вопрос.

Исходные данные:

Есть код, запускающий работу UART

Код:
   RST_CLK->PER_CLOCK |= PER_PORTF;
   PORTF->FUNC = (PORTF->FUNC & 0xFFFFFFF0)
                  |(2 << PORT_FUNC_MODE0_Pos)
                  |(2 << PORT_FUNC_MODE1_Pos);
   PORTF->ANALOG |= 0x0003;
   PORTF->PWR |= (3 << PORT_PWR_PWR0_Pos)|(3 << PORT_PWR_PWR1_Pos);

   RST_CLK->PER_CLOCK |= PER_UART3;
   RST_CLK->UART_CLOCK = (1 << 26)|(4 << 16);
   UART3->IBRD = 1;
   UART3->FBRD = 25;
   UART3->LCR_H = (3 << UART_LCR_H_WLEN_Pos) | UART_LCR_H_FEN;
   UART3->IFLS = (2 << UART_IFLS_RXIFLSEL_Pos)|(2 << UART_IFLS_TXIFLSEL_Pos);
   UART3->IMSC |= UART_IMSC_RXIM | UART_IMSC_TXIM;
   UART3->CR = UART_CR_UARTEN | UART_CR_TXE | UART_CR_RXE; // +

   NVIC_EnableIRQ(UART3_IRQn);


Который, в том числе, настраивает работу по прерываниям (полуполные очереди) для приемника и передатчика. Очередь при этом включена(разрешена).
Если с внешнего терминала я ввожу восемь символов, то прерывание приемника срабатывает, но как я не пытался получить прерывание от передатчика - результат нулевой.

Вопросы:
1. Почему при заданной настройке я не попадаю в прерывание по передатчику? Даже флаг не взодится в регистре RIS, хотя данные я ложу часто

Код:
   while (1)
      {
      UART3RIS = UART3->RIS;
      if (UART3RIS & 0x400)
         {
         UART3->DR = (uint8_t)(UART3CountData & 0xFF);
         }
      UART3->DR = (uint8_t)(UART3CountData & 0xFF);
      //sleep_clk(1000000);
      UART3CountData++;
      }

2. В документации описано

Цитата:
2…0 TXIFLSEL Порог прерывания по заполнению буфера передатчика:
b000 = буфер заполнен на 1/8
b001 = буфер заполнен на 1/4
b010 = буфер заполнен на 1/2
b011 = буфер заполнен на 3/4
b100 = буфер заполнен на 7/8
b101-b111 = резерв

Хочу уточнить, "заполнен" или "заполнен менее чем" как в других переферийных блоках?

Проверял на скорости работы 115200 и 9600. 9600 явно не должен успевать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2015-мар-26 15:52 
Не в сети

Зарегистрирован: 2012-июн-01 14:12
Сообщения: 38
В общем странно работает (не работает) прерывание по передаче UART. С очередью работает, но надо заполнить ВЕСЬ буфер. и прерывание срабатывает если заполнен ВЕСЬ(возможно больше границы) буфер.
А если отключить очередь, то прерывание срабатывает не когда данные передадутся (освободится регистр ), а когда заполнится регистр(возможно).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2015-апр-03 18:22 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 733
Откуда: АО "ПКК Миландр"
Перечитайте ещё раз раздел спецификации, посвященный прерываниям от передатчика блока UART (раздел "28 Контроллер UART", пункт "28.10 Прерывания", подпункт 28.10.3 UARTTXINTR).


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

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


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

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


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB