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

 
 
> LPC1768 UART, постоянно CTI
theBMV
сообщение Jul 11 2011, 14:21
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 14-10-08
Из: г. Королев
Пользователь №: 40 940



Прошу помочь, ибо потратил уже 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 постоянно...
как быть? куда копать? ткните носом.
спасибо

Сообщение отредактировал IgorKossak - Jul 11 2011, 15:58
Причина редактирования: [codebox]

Прикрепленные файлы
Прикрепленный файл  cw.rar ( 26.84 килобайт ) Кол-во скачиваний: 20
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
KRS
сообщение Jul 11 2011, 19:51
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



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

не это меня начальный 0 уровень сбил, вроде все ок.
Вы с контролеера чего нибудь пошлите и посмотрите осцилограммму, может частоту неверно рассчитали!
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jul 12 2011, 11:16
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Вы с отладчиком и UARTом поосторожней. Там ведь часть флагов автоматически сбрасывается при чтении регистров, да и данные вычитанные из rbr отладчиком обратно в FIFO не засунеш.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jul 12 2011, 19:06
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(=F8= @ Jul 12 2011, 15:16) *
Вы с отладчиком и UARTом поосторожней.

Насколько я понял, все таки live watch на переменные используется, и данные идут непрерывно.
Go to the top of the page
 
+Quote Post
theBMV
сообщение Jul 14 2011, 08:44
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 14-10-08
Из: г. Королев
Пользователь №: 40 940



Да, регистры UARTа я читаю один раз, как положено. live watch наложен на глобальные переменные uiir, ulsr, urbr
Go to the top of the page
 
+Quote Post

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

 


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


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