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

 
 
> UART не принимает на К1986, передача работает
AVR
сообщение Sep 21 2014, 18:06
Сообщение #1


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Мучаю отладочную плату с LDM-K1986BE92QI с контроллером соответственно К1986BE92QI.

Проблема такая: по RS-485 и RS-232 передача работает, а прием нет.
Смотрел осциллографом на выводах - сигнал поступает, вплоть до ножки PF0. Настройку порта UART брал из кода примеров для "Миландр"-а от среды Keil.
P.S.
Еще думаю попробовать UART через который прошивка идет, т.е. UART1 на ножках PD0/PD1.

Полный код: ссылка на полный код.
При включении вижу текст, он успешно отсылается по RS-232. Светодиоды показывают - один флаг пустоты приемного буфера, второй - переполнения. Если интенсивно бомбить со стороны ПК данными в контроллер и не вычитывать прием, то все равно флаг пустоты горит, флаг переполнения - никогда не загорается...
Увы, уже несколько дней не получается понять суть проблемы.

Прием:
Код
unsigned char usart_receive(char *ok)
{
    char timeout = 100;
    *ok = 0;
    while((!(MDR_UART2->FR & (1<<6))) && (timeout > 0))
    //while((MDR_UART2->FR & (1<<4)) && (timeout > 0))
    {
        delay_10us(1);
        timeout--;
    }
    if(timeout > 0)
    {
        *ok = 1;
        return (MDR_UART2->DR & 0xFF);
    }
    return 0;
}


Настройка:
Код
void init_usart()
{
    MDR_RST_CLK->PER_CLOCK |= (1UL << 29);

    MDR_PORTF->OE     = ((MDR_PORTF->OE     &  ~(0x00000001 << 0  ))                      );
    MDR_PORTF->FUNC   = ((MDR_PORTF->FUNC   &  ~(0x00000003 << 0*2)) | (0x00000003 << 0*2));
    MDR_PORTF->ANALOG = ((MDR_PORTF->ANALOG &  ~(0x00000001 << 0  )) | (0x00000001 << 0  ));
    MDR_PORTF->PULL   = ((MDR_PORTF->PULL   &  ~(0x00010001 << 0  ))                      );
    MDR_PORTF->PD     = ((MDR_PORTF->PD     &  ~(0x00010001 << 0  ))                      );
    MDR_PORTF->PWR    = ((MDR_PORTF->PWR    &  ~(0x00000003 << 0*2)) | (0x00000003 << 0*2));
    MDR_PORTF->GFEN   = ((MDR_PORTF->GFEN   &  ~(0x00000001 << 0  ))                      );

    MDR_PORTF->OE     = ((MDR_PORTF->OE     &  ~(0x00000001 << 1  )) | (0x00000001 << 1  ));
    MDR_PORTF->FUNC   = ((MDR_PORTF->FUNC   &  ~(0x00000003 << 1*2)) | (0x00000003 << 1*2));
    MDR_PORTF->ANALOG = ((MDR_PORTF->ANALOG &  ~(0x00000001 << 1  )) | (0x00000001 << 1  ));
    MDR_PORTF->PULL   = ((MDR_PORTF->PULL   &  ~(0x00010001 << 1  ))                      );
    MDR_PORTF->PD     = ((MDR_PORTF->PD     &  ~(0x00010001 << 1  ))                      );
    MDR_PORTF->PWR    = ((MDR_PORTF->PWR    &  ~(0x00000003 << 1*2)) | (0x00000003 << 1*2));
    MDR_PORTF->GFEN   = ((MDR_PORTF->GFEN   &  ~(0x00000001 << 1  ))                      );

    MDR_RST_CLK->PER_CLOCK  |= (1UL <<  7);
    MDR_RST_CLK->UART_CLOCK |= (1UL << 25);
    MDR_UART2->IBRD = 8; // 57600 @ 8 MHz
    MDR_UART2->FBRD = 44;
    MDR_UART2->LCR_H = ((3 << 5) | (0 << 3) | (0 << 1)  );
    MDR_UART2->CR = ((1 << 8) | (1 << 9));
    MDR_UART2->CR |= (1 << 0);
    usart_mode(0); // rx by default
}


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
AVR
сообщение Sep 25 2014, 19:51
Сообщение #2


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Решение нашлось тут на официальном форуме производителя: ССЫЛКА.


--------------------
Go to the top of the page
 
+Quote Post

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

 


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


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