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

 
 
 
Reply to this topicStart new topic
> lp1114 Проблема с I2C
Влад Р.
сообщение Apr 21 2012, 11:39
Сообщение #1


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Здравствуйте!
Пытаюсь по I2C дать команду индикатору: сбрасываю индикатор, инициализирую I2C, жду 10 мс и пытаюсь записывать в память индикатора, но в регистре статуса I2C отображается состояние 0x28 еще до начала передачи по шине, как следствие, после выставления флага СТАРТ, I2C переходит в состояние 0x10, а не в ожидаемое 0x18 и дальше весь алгоритм работы с I2C идет наперекосяк. Прерывания не использую.
Что можете посоветовать?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 21 2012, 13:32
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Влад Р. @ Apr 21 2012, 14:39) *
Прерывания не использую.
Что можете посоветовать?

Используйте библиотеку от NXP.
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Apr 21 2012, 17:46
Сообщение #3


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Цитата(_Артём_ @ Apr 21 2012, 16:32) *
Используйте библиотеку от NXP.


Библиотеку не использую намеренно. Как раз потому, что работает на прерываниях. Хочется обойтись без них. У кого-нибудь есть идеи откуда берется состояния 0х28 еще до обращения по I2C?
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Apr 21 2012, 20:58
Сообщение #4


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Библиотеку не использую намеренно. Как раз потому, что работает на прерываниях. Хочется обойтись без них. У кого-нибудь есть идеи откуда берется состояния 0х28 еще до обращения по I2C?

Вот используемые функции:
Код
uint8_t I2C_Handler(uint32_t set, uint32_t clear, uint32_t code) {
    LPC_I2C->CONSET = set;
    LPC_I2C->CONCLR = clear;
    while((LPC_I2C->CONSET & I2CONSET_SI) != I2CONSET_SI);
    return (LPC_I2C->STAT == code) ? 1 : 0;
}

void I2C_Write(uint8_t buf, LCDCmdData cd)
{
    while(1) {
        if(!I2C_Handler(I2CONSET_STA, I2CONCLR_SIC, 0x08)) break;
        if (cd) LPC_I2C->DAT = 0x72;
            else LPC_I2C->DAT = 0x70;
        if(!I2C_Handler(0, I2CONCLR_STAC | I2CONCLR_SIC, 0x18)) break;
        LPC_I2C->DAT = buf;
        if(!I2C_Handler(0, I2CONCLR_SIC, 0x28)) break;
    }
    LPC_I2C->CONSET = I2CONSET_STO;
    LPC_I2C->CONCLR = I2CONCLR_SIC;
}


Сообщение отредактировал Влад Р. - Apr 21 2012, 21:01
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 22 2012, 00:11
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Влад Р. @ Apr 21 2012, 23:58) *
Библиотеку не использую намеренно. Как раз потому, что работает на прерываниях.

Раз так не нравятся прерывания, можно взять функции прерываний, переименовать их и просто вызывать.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 02:51
Рейтинг@Mail.ru


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