Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: lp1114 Проблема с I2C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Влад Р.
Здравствуйте!
Пытаюсь по I2C дать команду индикатору: сбрасываю индикатор, инициализирую I2C, жду 10 мс и пытаюсь записывать в память индикатора, но в регистре статуса I2C отображается состояние 0x28 еще до начала передачи по шине, как следствие, после выставления флага СТАРТ, I2C переходит в состояние 0x10, а не в ожидаемое 0x18 и дальше весь алгоритм работы с I2C идет наперекосяк. Прерывания не использую.
Что можете посоветовать?
_Артём_
Цитата(Влад Р. @ Apr 21 2012, 14:39) *
Прерывания не использую.
Что можете посоветовать?

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


Библиотеку не использую намеренно. Как раз потому, что работает на прерываниях. Хочется обойтись без них. У кого-нибудь есть идеи откуда берется состояния 0х28 еще до обращения по I2C?
Влад Р.
Библиотеку не использую намеренно. Как раз потому, что работает на прерываниях. Хочется обойтись без них. У кого-нибудь есть идеи откуда берется состояния 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, 23:58) *
Библиотеку не использую намеренно. Как раз потому, что работает на прерываниях.

Раз так не нравятся прерывания, можно взять функции прерываний, переименовать их и просто вызывать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.