Никогда не доводилось работать с шиной I2C. Пришла пора попробовать – и полный облом. Похоже, упустил что-то очень важное. Может, подскажет кто. ИС=5438, работает в режиме мастера с аккумуляторным датчиком LTC2942 Настройки: UCB3CTL0=0x0F UCB3CTL1=0x40 (ACLK) (P10.1, P10.2)SEL=1 (P10.1, P10.2)DIR=1 UCB3I2CSA=0x64 - адрес датчика UCSCTL4=0x0755 (все частоты на кварц, кварц запущен) Частота приёма-передачи 10 кГц (чтобы смотреть было удобнее) Вроде всё. Подтягивающие сопротивления есть. Работа: UCB3IFG=0; UCB3CTL1|=UCTR; // UCTR=1 while (UCB3CTL1 & UCTXSTP); // проверка стопа UCB3CTL1 |= UCTXSTT; // старт while(UCB3CTL1 & UCTXSTT); // ждём, пока старт сбросится UCB3TXBUF=0; // передать адрес регистра в слэйве while(!(UCB3IFG&UCTXIFG)); // дождаться ухода while(UCB3CTL1&UCTXNACK); // проверить получение подтверждения UCB3CTL1&=~UCTR; // переключиться на чтение UCB3CTL1 |= UCTXSTT; // рестарт while(UCB3CTL1 & UCTXSTT); // ждём, пока старт сбросится while(!(UCB3IFG&UCRXIFG)); // принять информацию статусного регистра LTC2942 Status=UCB3RXBUF; Проблема в следующем: после выставления бита «старт» ничего не меняется. На выходах SCL и SDA по-прежнему висят две единицы. Старт не сбрасывается. Я полагал, что после выставления старта сброс бита происходит после передачи адреса слэйву и приёма от него подтверждения. Вроде пересмотрел все примеры – не помогло.
|