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

 
 
 
Reply to this topicStart new topic
> I2C в LPC2148, Не могу корректно обработать прерывание
Ivan73
сообщение Jun 4 2007, 16:03
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 30-05-07
Пользователь №: 28 052



Использую Keil uVision 3.50. Запускаю немного переделанную программу-образец работы с I2C. Разрешил интерфейс (I2CEN=1), поставил состояние START (STA=1), дальше идет такая вещь
while (lock == 1)
{;} //Wait for interrupt to signal end of I2C activity
Перед этим по программе lock был установлен 1. Именно в этом месте устройство приобретает Device Mode = master, и появляется запись START transmitted. I2CSTAT становится 0х08 что означает что передан START, а курсор в Disassembly Window слетает на строчку
0х00000018 00000000 ANDEQ R0,R0,R0
Вроде по этому адресу должна начаться обработка прерывания irq. Флаг Z=1.
Далее если нажать F10 (выполнение следующей команды, то есть ANDEQ R0,R0,R0), появляется следующая ошибка:
Error 65: access violation at 0x00000018 : no "execute/read" permission
Всё! Дальше программа не идёт!
Что здесь не так?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 4 2007, 16:26
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Ivan73 @ Jun 4 2007, 19:03) *
0х00000018 00000000 ANDEQ R0,R0,R0
Что здесь не так?
В этом месте должна находиться команда перехода на обработчик прерывания. Какая именно - зависит от того, как организованы обработчики. Либо вы забыли подключить к проекту какой-то из ассемблерных файлов, в котором прописана эта команда, либо как-то еще не описан обработчик IRQ.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Ivan73
сообщение Jun 5 2007, 13:15
Сообщение #3





Группа: Новичок
Сообщений: 3
Регистрация: 30-05-07
Пользователь №: 28 052



А может можно как-то вообще без прерываний обойтись, чтобы управлять I2C? Что нужно сделать после того, как я задал состояние Start, например? Как теперь его реализовать (пустить на шину, и чтобы I2C0STAT стал 0х08)?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 5 2007, 13:31
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Ivan73 @ Jun 5 2007, 16:15) *
А может можно....

Филипс автор I2C и его документация по контроллеру разжевывает все до безобразия.
Для 2148, если мне не изменяет память, они все уже включили в User Manual, для более старых контроллеров в UM приведена ссылка на классическое описание I2C контроллера.
Читайте. Образчик своей лабораторной работы (LPC2xxx) с обработчиком прерывания и разборкой нештатных ситуаций я на форуме выкладывал. Другие тоже многократно давали ссылки и исходники. Воспользуйтесь поиском.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 5 2007, 13:48
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jun 5 2007, 19:31) *
...Образчик своей лабораторной работы с обработчиком прерывания и разборкой нештатных ситуаций я на форуме выкладывал...
Сорок восьмым уже полсотни лет smile.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 5 2007, 13:52
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(GetSmart @ Jun 5 2007, 16:48) *
Сорок восьмым уже полсотни лет smile.gif

Ну и? Почему предосудительно начать заниматься I2C в 21 веке?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Kaplinsky
сообщение Jun 14 2007, 07:50
Сообщение #7


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

Группа: Свой
Сообщений: 97
Регистрация: 26-05-05
Из: Киев, Украина
Пользователь №: 5 426



Вот как я использую I2C в 2148(38)

Иннициализация:
Код
//========== I2C ==========================
    PINSEL0     |=0x50;    // I2C connect
    I2C0SCLH    = 0x3C;
    I2C0SCLL    = 0x3C;   // 12288000Hz / (0x0F+0x10) = 396387Hz
    I2C0CONSET  = 0x40;


Чтение
Код
unsigned char I2C_read(unsigned char reg){
unsigned char result;

//START
    I2C0CONSET = 0x20; //STA
    while (!( I2C0CONSET & SI)); // STAT == 0x08
//SLAVE ADDR, WRITE OP.
    I2C0DAT    = 0xE2;
    I2C0CONSET = AA; // Set AA
    I2C0CONCLR = STA | SI; // Im think 0x28
    while (!( I2C0CONSET & SI));
//DATA
    if (I2C0STAT == 0x18){
        I2C0DAT = reg;
        I2C0CONCLR = AA | SI; //Clear AA for /AA, Clear SI
    } else if (I2C0STAT == 0x20){
        I2C0CONSET = STO | AA;
        I2C0CONCLR = SI;
        return 0;
    }
    while (!( I2C0CONSET & SI));
//STOP
    I2C0CONSET = STO;
    I2C0CONCLR = SI;

//START
    I2C0CONSET = STA; //STA
    while (!( I2C0CONSET & SI)); // STAT == 0x08
//SLAVE ADDR, READ OP.    
    I2C0DAT        = 0xE3;
    I2C0CONSET    = AA;    //Set AA
    I2C0CONCLR    = STA | SI; //
    while (!( I2C0CONSET & SI));
//READ THE DATA
    if (I2C0STAT == 0x40){
        //I2C0CONSET    = AA;
        I2C0CONCLR    = SI | AA;
    }else if (I2C0STAT == 0x48){
        I2C0CONSET    = STO | AA;
        I2C0CONCLR    = SI;
    }
    while (!( I2C0CONSET & SI));
//STOP
    if (I2C0STAT == 0x50){
        
    }else if (I2C0STAT == 0x58){
        result = I2C0DAT;
        I2C0CONSET = STO | AA; //0x14;
        I2C0CONCLR = SI;
    }
    
//    I2C0CONSET = STO;
//    I2C0CONCLR = SI;
    return result;
}//I2C_read


Запись
Код
int I2C_write(unsigned char reg, unsigned char data){
//START
    I2C0CONSET = STA;
    while (!( I2C0CONSET & SI));
//SLAVE ADDR, WRITE OP.
    I2C0DAT    = 0xE2;
    I2C0CONSET = AA;
    I2C0CONCLR = STA | SI;
    while (!( I2C0CONSET & SI));
//REG
    if (I2C0STAT == 0x18){
        I2C0DAT = reg;
        I2C0CONCLR = SI; // Clear SI
    } else if (I2C0STAT == 0x20){
        I2C0CONSET = STO | AA;
        I2C0CONCLR = SI;
        return 1;
    }
    while (!( I2C0CONSET & SI));
//DATA
    if (I2C0STAT == 0x28){
        I2C0DAT = data;
        I2C0CONCLR = AA | SI; //Clear AA for /AA, Clear SI
    } else if (I2C0STAT == 0x30){
        I2C0CONSET = STO | AA;
        I2C0CONCLR = SI;
        return 1;
    }
    while (!( I2C0CONSET & SI));
//STOP
    I2C0CONSET = STO;
    I2C0CONCLR = SI;
    return 0;
}//I2C_write


Обработка состояний сдесь не полная.
Документация воистину рулит. Разжевано в картинках cool.gif


--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание.
Отладка / Софокл, "Аякс".
Go to the top of the page
 
+Quote Post

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

 


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


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