Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: I2C в LPC2378
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Caesium
Имеем LPC2378 на отладочной плате. Взяли примеры реализации I2C из книги Мартина Тревора. По команде "старт" (I20CONSET = 0x20;) не попадаем в обработчик прерывания. В чем может быть проблема?

Нажмите для просмотра прикрепленного файла
yashok
Вы компилируете со смещением адресов и прошивку в ram заливаете??
Если не, то это лишнее
Код
MEMMAP = 0x02;
Caesium
Убрал, ситуация та же самая. После установки старта, прерывания не возникает.
Стартап стандартный предложенный keil'ом для данного мк.
yashok
Код
I20CONCLR = 0x000000FF;

Может лучше придерживаться советов из мануала и очистить только нужные биты
Код
I2CONCLR= 0x6С;
Nixon
Посмотрите в визарде стартапа разрешена ли I2C. Или сразу лучше ручками ее разрешите (смотреть PCON и PCLKSELx заодно).
Caesium
Цитата(yashok @ May 26 2011, 10:13) *
Код
I20CONCLR = 0x000000FF;

Может лучше придерживаться советов из мануала и очистить только нужные биты
Код
I2CONCLR= 0x6С;


Спасибо за совет.

Цитата(Nixon @ May 26 2011, 10:23) *
Посмотрите в визарде стартапа разрешена ли I2C. Или сразу лучше ручками ее разрешите (смотреть PCON и PCLKSELx заодно).

Configuration wizard:
стоит галочка напротив
PCI2C0: I2C interface 0 power/clock enable
Caesium
Если установить вручную I20CONSET = 0x8; сразу после команды старт, то прерывание возникает. В статусном регистре при этом находится 0xC8. Может я неправильно задаю IRQ прерывание? Аналогичный код превосходно работает на LPC2138
yashok
Цитата
Может я неправильно задаю IRQ прерывание? Аналогичный код превосходно работает на LPC2138


VIC у lpc21xx и lpc23xx отличается.

Для 23-х необходимо

Код
VICIntSelect &= ~(1 << 9);  
VICVectAddr9  = (uint32_t)&I2CISR;
VICVectPriority9  = 13;
VICIntEnable  |= (1 << 9);
Caesium
Цитата(yashok @ May 30 2011, 15:58) *
VIC у lpc21xx и lpc23xx отличается.

Для 23-х необходимо

Код
VICIntSelect &= ~(1 << 9);  
VICVectAddr9  = (uint32_t)&I2CISR;
VICVectPriority9  = 13;
VICIntEnable  |= (1 << 9);

Внес изменения. Адрес обработчика прерывания заносится, приоритет выставляется (=13), IntEnable = 1. Но результат тот же. Выполнение программы зависает в while(lock == 1){}. в I2CISR никогда не попадаем.
yashok
А линии к питанию подтянуть не забыли??
Caesium
Цитата(yashok @ May 30 2011, 17:57) *
А линии к питанию подтянуть не забыли??

Да, забыли. Спасибо большое за помощь, проблема решилась.
Nixon
sm.gif sm.gif sm.gif Думал поначалу спросить, но боялся обидеть вопросом
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.