Полная версия этой страницы:
I2C
Никогда не доводилось работать с шиной 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 по-прежнему висят две единицы. Старт не сбрасывается. Я полагал, что после выставления старта сброс бита происходит после передачи адреса слэйву и приёма от него подтверждения. Вроде пересмотрел все примеры – не помогло.
P.S. Видимо, проблемы частично в дребезге - датчик висит на проводах длиной около 15 см, если в процессе инициализации старта прижать палец - вроде что-то проскакивает, но потом все равно выскакивает прерывание нарушения арбитража.
Сергей Борщ
Jan 31 2011, 11:12
QUOTE (1921 @ Jan 31 2011, 12:53)

если в процессе инициализации старта прижать палец - вроде что-то проскакивает
А резисторы подтяжки внешние есть?
Цитата(Сергей Борщ @ Jan 31 2011, 14:12)

А резисторы подтяжки внешние есть?
Да, я написал. Основной вопрос в другом: никто не видит грубых ошибок? Если нет, буду бороться с дребезгом и прочими соплями.
rezident
Jan 31 2011, 11:33
Цитата(1921 @ Jan 31 2011, 16:20)

Основной вопрос в другом: никто не видит грубых ошибок?
Грубые ошибки в процедуре инициализации модуля USCI. Ну оно в общем-то и понятно. Ведь пользовательские инструкции (User's manual) для лохов пишут, а реальные пацаны и без них обходятся.
Цитата(rezident @ Jan 31 2011, 14:33)

Грубые ошибки в процедуре инициализации модуля USCI. Ну оно в общем-то и понятно. Ведь пользовательские инструкции (User's manual) для лохов пишут, а реальные пацаны и без них обходятся.
Да нет, я просто не стал приводить полный текст настройки, он стандартный. Там вроде всё в порядке. Да, в коде один бит неправильно обозвал (непоодтверждения приёма), уже исправил, но сути дела не меняет. Видимо, дело всё-таки в дребезге. Может, резисторы стоит перенести ближе к датчику, они у меня около MSP... В общем, танцы с бубном.
В дребезге чего?

У меня есть девайс, где MSP430 мастером работает и до самого дальнего слейва метр почти и работает как часы. Осциллографом смотрели, что на линии творится? Есть вообще обмен?
В общем, всё оказалось банально до безобразия. Вывод первый: ну его аппаратный I2C, на 5438 глючит со страшной силой, сам себя подвешивает, что не сковырнёшь. Попробуйте цепочку: старт +адрес+RW+ACK+стоп <задержка> и сначала. Работает 3...5 секунд, потом клоки залипают внизу, выскакивает флаг бизи, стоп не проходит, по клокам постоянно прут импульсы... и всё! Дальше только через ресет. Программная реализация хоть предсказуема.
Вывод второй: та микросхема, которая была слэйвом, сидела на аккумуляторе 4,2 В, соответственно I2C от контроллера (<3,3 В) не пробивали её по входу (не хватало уровня). Запитал одним питаним - и всё пошло (попробуйте нагрузить 155 серию на 564, если кто помнит, эффект тот же, причём возникает при повышении частоты).
Талантливо) А у меня в 5438 не глючило и вроде как всё по глупым бумажкам сходилось...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.