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

 
 
> Регистр FCR UART0 не устанавливается должным образом, Не проходит инициализация
Цырен
сообщение Sep 11 2007, 14:30
Сообщение #1


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

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



Есть инициализация UART0, в ней есть строка установки FCR, которая задает, кроме всего прочего, длину буфера FIFO, по которой соответственно будут происходить прерывания. Мне нужно установить порог на один байт. Но при пошаговой отладке видно, что в инициализации в RTLS записывается 0х3 (порог в 14байт). Я уже не знаю на что думать. Может контроллер дефектный или есть хитрости работы с FCR? Результат работы UARTa - срабатывание обработчика прерывания по последнему пришедшему символу или полное игнорирование входящих данных. Помогите, только не общими словами, а, если можно, подробнее.

Вот код:

void UARTInit( DWORD baudrate, DWORD IntrPriority )
{
DWORD Fdiv;

U0LCR = 0x80;
Fdiv = ( Fpclk / 16 ) / baudrate ;
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x07;

U0FCR = (1<<0) | (1<<1) | (1<<2);

U0IER_bit.RDAIE = 1;

VIC_SetVectoredIRQ(UART0Interrupt,IntrPriority,VIC_UART0);
VICINTENABLE |= 1UL << VIC_UART0;

PINSEL0 = 0x00000050; /* RxD0 and TxD0 */
}

Заранее благодарю за дельные советы.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Цырен
сообщение Sep 13 2007, 15:40
Сообщение #2


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

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



Все спасибо, заработало.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 13 2007, 15:45
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Цырен @ Sep 13 2007, 19:40) *
Все спасибо, заработало.

Написали бы, в чем было дело, а то столько копий сломано было...
Go to the top of the page
 
+Quote Post
Цырен
сообщение Sep 15 2007, 08:18
Сообщение #4


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

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



Цитата(aaarrr @ Sep 13 2007, 19:45) *
Написали бы, в чем было дело, а то столько копий сломано было...


С удовольствием отвечу. Инициализировал UART0 так:
void MB_UARTInit( DWORD baudrate, DWORD IntrPriority )
{
DWORD Fdiv;

PINSEL0 = 0x00000050; /* RxD0 and TxD0 */

U0LCR = 0x83; // DLAB + 8 bits, no Parity, 1 Stop bit
Fdiv = ( Fpclk / 16 ) / baudrate ; /* baud rate */
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03; // DLAB = 0

U0IER = 0x01; // Rx interrupt

U0FCR = (1 << 0)|(1 << 1);

VIC_SetVectoredIRQ(UART0Interrupt,IntrPriority,VIC_UART0);
VICINTENABLE |= 1UL << VIC_UART0;

}

Прерывания организовал так:
static void UART0Interrupt(void)
{
int status = U0IIR & 0xF;
int data = U0RBR;
if (status == 0x04)
{
MB_buf[MB_len+1] = data;
MB_len++;
}
else if (status == 0x0C)
{
}

VICADDRESS = 0;
}

Прикол в том, что при отладке этот код работает хорошо если не открывать вкладочку view->registers. Думаю, отладчик считывая состояния регистров UART0 "сбивает" логику алгоритма обработки прерывания... Но это лишь предположение, основанное на моем сугубо субъективном эмпирическом опыте.
Go to the top of the page
 
+Quote Post



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

 


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


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