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

 
 
> LPC2148 UART baudrate, Странное поведение
gladov
сообщение Sep 13 2010, 06:04
Сообщение #1


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

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687




Имеется совершенно "стандартный" кит - Olimex LPC-P2148. На нем стоит кварц 12МГц (проверял осциллом - действительно так).
Отключаю (а точнее не включаю) PLL, делитель APB ставлю в 1. Должен получить PCLK = 12МГц.
FDR либо не трогаю, либо инициализирую значением по умолчанию, т.е. 0x10 чтобы он не работал.
Считаем по DS baudrate: DLM:DLL = PCLK / (16 * BR) = 12000000 / (16 * 9600) = 78.
И... не работает. Точнее работает, передает, но при передаче пачки нормально проходит только первый символ, а в последующих бъются биты. Явно слегка некорректный бодрейт. Экспериментально подобрал, что если выставить DLM:DLL в 82 все четко работает.
Аналогичная ситуация возникает если влючить PLL х4 и разделить в APB на 2. Получаем PCLK = 24, DLL = 156. А работает он при DLL = 165!!!
Никто с таким странным поведением не сталкивался? Мож кто подскажет где искать грабли?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
cornflyer
сообщение Sep 13 2010, 09:40
Сообщение #2


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

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



CODE

/*-------------------------------------------------------------------------*/
void SerialInit(void){
unsigned int reload = (15000000/(115200*16));
//Configure UART0 Pins
PINSEL0 |= 0x05;//Enable RxD0 and TxD0
U0LCR = 0x00000007;//Configure Data Bits and Parity MB_PAR_NONE
U0IER = UART_RX_TX;//UART0 Interrupts*/
U0LCR |= 0x80;//Set DLAB
U0DLL = reload;//Set Baud
U0DLM = reload>>8;//Set Baud
U0LCR &= ~0x80;//Clear DLAB
U0FCR = 0x07;//Activate and clear FIFOs
VICVectAddr0 = (unsigned long)sio_irq;
VICVectCntl0 = 0x20|6;
VICIntEnable = 1 << 6;//Enable UART0 Interrupt
}
/*-------------------------------------------------------------------------*/
void sio_irq(void) __irq{
switch (U0IIR&0x0E){
case 0x04://Receive Data Available
ModBusBuff[ModBusBuffIndex]=U0RBR;
ModBusBuffIndex++;
StartTimer();//check frame by timeout
break;
case 0x02://char sent
if(tx_i<tx_pos){
U0THR = tx_buf[tx_i++];
}
break;
}
VICVectAddr = 0xFF;//Acknowledge Interrupt
}
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:36
Рейтинг@Mail.ru


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