Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC1768 UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
theBMV
Прошу помочь, ибо потратил уже 5 часов и
то ли лыжи не едут то ли...
Итак:
LPC1768
IAR 5.4
юзаю UART3
CODE
void init_clock(void)
{
FLASHCFG_bit.FLASHTIM = 6-1; // Èñïîëüçîâàòü àêñåëåðàòîðó ïàìÿòè 6 òàêòîâ ÿäðà

SCS_bit.OSCRANGE = 0; // ×àñòîòà êâàðöà îò 1 MHz äî 20 MHz
SCS_bit.OSCEN = 1; // Ðàçðåøàåì ðàáîòó ãëàâíîãî ãåíåðàòîðà

PLL0CON_bit.PLLC = 0; // Îòñîåäèíÿåì PLL0
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
PLL0CON_bit.PLLE = 0; // Çàïðåùàåì PLL0
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
CLKSRCSEL_bit.CLKSRC = 1; // Âûáèðàåì ãëàâíûé ãåíåðàòîð â êà÷åñòâå èñòî÷íèêà äëÿ PLL0

PCLKSEL1_bit.PCLK_UART3 = 1; // UART3 íà ÷àñòîòå ÿäðà

/*
Fcco = 275 MHz ... 550 MHz
Fin = 32 kHz ... 50 MHz
Fcco = (2*M*Fin)/N
Fin = 12 MHz
M = 25
N = 2
Fcco = 300 MHz
*/
PLL0CFG_bit.MSEL = 25-1; // M = 25
PLL0CFG_bit.NSEL = 2-1; // N = 2
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
PLL0CON_bit.PLLE = 1; // Ðàçðåøàåì PLL0
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
while(PLL0STAT_bit.PLOCK); // Æäåì, ïîêà PLL0 âîéäåâ â çàõâàò

CCLKCFG = 3-1; // ßäðî áóäåò ðàáîòàòü íà 1/3 ÷àñòîòû PLL0

PLL0CON_bit.PLLC = 1; // Ïîäñîåäèíÿåì PLL0
/*
Fcpu = 100 MHz
Fuart3 = 100 MHz
Fp = 25 MHz
*/
}

void init_peripheral(void)
{
// Ïèòàíèå ïåðèôåðèè
PCONP_bit.PCUART3 = 1; // Âêëþ÷àåì UART3

// Ôóíêöèè âûâîäîâ
PINSEL0_bit.P0_0 = 2; // P0[0] TXD3 DMX_OUT
PINSEL0_bit.P0_1 = 2; // P0[1] RXD3 DMX_IN

// Èíèöèàëèçàöèÿ ïåðèôåðèè
init_uart3();
init_wdt();

__enable_interrupt();
}

void init_uart3(void)
{
// Ñêîðîñòü
/*
F = Fp/(16*(DLM*256+DLL)*(1+DIV/MUL))
F = 250 kBod
Fp = 100 MHz
DLM = 0
DLL = 25
DIV = 0
MUL = 1
*/
U3LCR_bit.DLAB = 1;
U3DLL = 25;
U3DLM = 0;
U3LCR_bit.DLAB = 0;

// FIFO
U3FCR_bit.FCRFE = 1; // Âêëþ÷àåì FIFO
U3FCR_bit.RTLS = 2; // Ïîðîã ñðàáàòûâàíèÿ 8 ñèìâîëîâ

// Ôîðìàò
U3LCR_bit.WLS = 3; // 8 áèò
U3LCR_bit.SBS = 1; // 2 ñòîï-áèòà

// Ïðåûâàíèÿ
SETENA0_bit.SETENA8 = 1; // Ðàçðåøàåì â NVIC
U3IER_bit.RDAIE = 1; // Ðàçðåøàåì ïðåðûâàíèå ïî âõîäÿùèì äàííûì
U3IER_bit.RXLSIE = 1; // Ðàçðåøàåì ïðåðûâàíèå ïî ñòàòóñó ëèíèè
}

void init_wdt(void)
{
WDCLKSEL_bit.WDSEL = 1; // Èñòî÷íèê ÷àñòîòû Fp
WDCLKSEL_bit.WDLOCK = 1; // Ëî÷èì WDCLKSEL
/*
T = (WDTC*256*4)/Fp
T = 5 ñåê
Fp = 25 MHz
WDTC = 125000
*/
WDTC = 125000; // Ïåðèîä 5,12 ñåê
#ifndef DEBUG
WDMOD_bit.WDEN = 1; // Çàïóñêàåì WDT
WDMOD_bit.WDRESET = 1; // Ðàçðåøàåì WDT ñáðàñûâàòü êîíòðîëëåð
#endif /*DEBUG*/
}

void UART3_IRQHandler(void)
{
uiir = U3IIR;
ulsr = U3LSR;
urbr = U3RBR;

CLRPEND0_bit.CLRPEND8 = 1;
}

проект в аттаче
на входе осциллограмма:

шлю 0x55, 8 бит, 2 стоповых, без четности. скорость 250 кбод.

уже не знаю, куда копать: в отладчике делаю Live Watch для переменных
uiir, ulsr, urbr. и получаю одну и ту же картину:
uiir = 0xcc
ulsr = 0x61
urbr = 0xff

т.е. CTI постоянно...
как быть? куда копать? ткните носом.
спасибо
KRS
Так у вас на входе инверсия почему то!
у UART в TTL неактивный уровень - 1, потом стартовый бит 0. А у вас там все наоборот! Вот и прием идет левый!

не это меня начальный 0 уровень сбил, вроде все ок.
Вы с контролеера чего нибудь пошлите и посмотрите осцилограммму, может частоту неверно рассчитали!
=F8=
Вы с отладчиком и UARTом поосторожней. Там ведь часть флагов автоматически сбрасывается при чтении регистров, да и данные вычитанные из rbr отладчиком обратно в FIFO не засунеш.
KRS
Цитата(=F8= @ Jul 12 2011, 15:16) *
Вы с отладчиком и UARTом поосторожней.

Насколько я понял, все таки live watch на переменные используется, и данные идут непрерывно.
theBMV
Да, регистры UARTа я читаю один раз, как положено. live watch наложен на глобальные переменные uiir, ulsr, urbr
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.