Мучаю отладочную плату с 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
}