Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UART не принимает на К1986
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
AVR
Мучаю отладочную плату с 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
}
AVR
Решение нашлось тут на официальном форуме производителя: ССЫЛКА.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.