Подскажите, может кто сталкивался. Проблема с UART0 на NXP LPC2214 при совместной работе с PLL. Без PLL все работает чудесно, но стоит включить PLL, как.
1.) Программа работает так: хватает по входу байты, а потом посылает ответ. Дак вот, если приходит ДО 11 байт включительно, то ответ формируется нормальный. Но если заслать от 12 включительно и больше, то выплевывает кроме того что аброкадабру, дак ещи и не то, что кидаю в FIFO. Но... Взводим таймаут между временем когда приняли последний символ и отправляем следующий, и все нормально.
Вот, отослал на вход 11 символов
Write data
00000000: 10 02 00 80 03 00 00 0A | 0B 10 03 ...Ђ.......
Read data
00000000: 10 02 80 00 02 01 0A 0B | 10 03 ..Ђ.......
Это правильный ответ
А вот теперь 12
Write data
00000000: 10 02 00 80 03 00 00 00 | 0A 0B 10 03 ...Ђ........
Read data
00000000: 40 A1 21 A2 E0 @Ў!ўа
Он кроме того, что проглотил отправленные в FIFO символы, но и изуродовал их...
Но если поставить задержку между окончанием приема последнего символа и загрузкой первого в FIFO, то.... Все в ажуре....
Write data
00000000: 10 02 00 80 03 00 00 00 | 0A 0B 10 03 ...Ђ........
Read data
00000000: 10 02 80 00 02 01 0A 0B | 10 03 ..Ђ.......
А если пропустить первый символ, а потом поставить задержку, то первый символ канет в лету, а остальные (после задержки) передадутся нормально.
На всякий случай код настройки PLL и MAM (отключение MAM ситуацию не спасает)
//================================================== =======
//============== Н А С Т Р О Й К А P L L ============
//================================================== ======
//Настройка PLL
void PLL_First_Setup(void)
{
PLLCFG_bit.MSEL = 3;
PLLCFG_bit.PSEL = 1;
PLLFEED = 0XAA;
PLLFEED = 0X55;
//Включаем PLL без подключения к ядру
PLLCON_bit.PLLE = 1;
PLLFEED = 0XAA;
PLLFEED = 0X55;
while (!(PLLSTAT & 0X400)); // ОЖИДАЕМ ЗАМЫКАНИЯ ПЕТЛИ PLL
//Включаем PLL к ядру
PLLCON_bit.PLLC = 1;
PLLFEED = 0XAA;
PLLFEED = 0X55;
}
//================================================== =======
//============== Н А С Т Р О Й К А M A M ============
//================================================== ======
//Настройка MAM
void MAM_First_Setup(void)
{
MAMCR_bit.MODECTRL = 0; //откл. mam
MAMTIM_bit.CYCLES = 3; // ДЛЯ cclk ›40 MGz
MAMCR_bit.MODECTRL = 2; //ВКЛ. mam
VPBDIV_bit.VPBDIV = 0;
}
Настройка UART
//=========================================
//======== Н А С Т Р О Й К А UART_0 ====
//=========================================
//Н А С Т Р А И В А Е М С О Б С Т В Е Н Н О U A R T 0
U0LCR_bit.DLAB=1; // Разрешить запись в настройках делителя UART 0
// Считаем и прописываем частоту.
U0DLL=ExKUC_Fosc/(16*ExKUI_UART_0_Boundrate); //задание младшего байта скорости обмена по UART_0
// 16, ПОТОМУЧТО ВКЛ. PLL
U0DLM=((ExKUC_Fosc/(16*ExKUI_UART_0_Boundrate))››
; //задание cтаршего байта скорости обмена по UART_0
// 16, ПОТОМУ ЧТО ВКЛ. PLL
U0LCR_bit.DLAB=0; //Разрешить обращение к буферам UART_0+ЗАЩЕЛКИВАЕМ ДЕЛИТЕЛЬ
U0FDR_bit.MulVal=1;
U0FDR_bit.DivAddVal=0;
U0LCR_bit.WLS = 0X03; //Длина символа 8 бит
U0LCR_bit.SBS = 0; //Один стоповый бит
U0FCR_bit.FCRF=0; //Разрешить буфер FIFO с уровнем триггера 1 символ.
U0FCR_bit.RTLS=0X00; // оДИН СИМВОЛ НА СРАБАТЫВАНИЕ ПРЕРЫВАНИ
U0FCR_bit.RFR = 1; //Cбросить приемный буфер FIFO
U0FCR_bit.TFR = 1; //Cбросить передающий буфер FIFO
U0IER_bit.THREIE = 0; //ЗАПРЕТить прерывание по передаче данных в буфер
U0IER_bit.RDAIE = 0; //ЗАПРЕТить прерывание по приему данных в буфер
Я вот думаю, может быть контроллер UART работает медленно и не успевает.... Но это же бред.