|
|
  |
I2C, Кто виноват и что делать |
|
|
|
Jan 31 2011, 09:23
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Никогда не доводилось работать с шиной 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 по-прежнему висят две единицы. Старт не сбрасывается. Я полагал, что после выставления старта сброс бита происходит после передачи адреса слэйву и приёма от него подтверждения. Вроде пересмотрел все примеры – не помогло.
|
|
|
|
|
Jan 31 2011, 10:53
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
P.S. Видимо, проблемы частично в дребезге - датчик висит на проводах длиной около 15 см, если в процессе инициализации старта прижать палец - вроде что-то проскакивает, но потом все равно выскакивает прерывание нарушения арбитража.
|
|
|
|
|
Jan 31 2011, 11:20
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Цитата(Сергей Борщ @ Jan 31 2011, 14:12)  А резисторы подтяжки внешние есть? Да, я написал. Основной вопрос в другом: никто не видит грубых ошибок? Если нет, буду бороться с дребезгом и прочими соплями.
Сообщение отредактировал 1921 - Jan 31 2011, 11:22
|
|
|
|
|
Jan 31 2011, 12:04
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Цитата(rezident @ Jan 31 2011, 14:33)  Грубые ошибки в процедуре инициализации модуля USCI. Ну оно в общем-то и понятно. Ведь пользовательские инструкции (User's manual) для лохов пишут, а реальные пацаны и без них обходятся. Да нет, я просто не стал приводить полный текст настройки, он стандартный. Там вроде всё в порядке. Да, в коде один бит неправильно обозвал (непоодтверждения приёма), уже исправил, но сути дела не меняет. Видимо, дело всё-таки в дребезге. Может, резисторы стоит перенести ближе к датчику, они у меня около MSP... В общем, танцы с бубном.
|
|
|
|
|
Feb 2 2011, 11:16
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

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