1921 0 31 января, 2011 Опубликовано 31 января, 2011 · Жалоба Никогда не доводилось работать с шиной 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 по-прежнему висят две единицы. Старт не сбрасывается. Я полагал, что после выставления старта сброс бита происходит после передачи адреса слэйву и приёма от него подтверждения. Вроде пересмотрел все примеры – не помогло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1921 0 31 января, 2011 Опубликовано 31 января, 2011 · Жалоба P.S. Видимо, проблемы частично в дребезге - датчик висит на проводах длиной около 15 см, если в процессе инициализации старта прижать палец - вроде что-то проскакивает, но потом все равно выскакивает прерывание нарушения арбитража. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 158 31 января, 2011 Опубликовано 31 января, 2011 · Жалоба если в процессе инициализации старта прижать палец - вроде что-то проскакиваетА резисторы подтяжки внешние есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1921 0 31 января, 2011 Опубликовано 31 января, 2011 (изменено) · Жалоба А резисторы подтяжки внешние есть? Да, я написал. Основной вопрос в другом: никто не видит грубых ошибок? Если нет, буду бороться с дребезгом и прочими соплями. Изменено 31 января, 2011 пользователем 1921 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 31 января, 2011 Опубликовано 31 января, 2011 · Жалоба Основной вопрос в другом: никто не видит грубых ошибок?Грубые ошибки в процедуре инициализации модуля USCI. Ну оно в общем-то и понятно. Ведь пользовательские инструкции (User's manual) для лохов пишут, а реальные пацаны и без них обходятся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1921 0 31 января, 2011 Опубликовано 31 января, 2011 · Жалоба Грубые ошибки в процедуре инициализации модуля USCI. Ну оно в общем-то и понятно. Ведь пользовательские инструкции (User's manual) для лохов пишут, а реальные пацаны и без них обходятся. Да нет, я просто не стал приводить полный текст настройки, он стандартный. Там вроде всё в порядке. Да, в коде один бит неправильно обозвал (непоодтверждения приёма), уже исправил, но сути дела не меняет. Видимо, дело всё-таки в дребезге. Может, резисторы стоит перенести ближе к датчику, они у меня около MSP... В общем, танцы с бубном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shread 0 1 февраля, 2011 Опубликовано 1 февраля, 2011 · Жалоба В дребезге чего? :cranky: У меня есть девайс, где MSP430 мастером работает и до самого дальнего слейва метр почти и работает как часы. Осциллографом смотрели, что на линии творится? Есть вообще обмен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1921 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба В общем, всё оказалось банально до безобразия. Вывод первый: ну его аппаратный I2C, на 5438 глючит со страшной силой, сам себя подвешивает, что не сковырнёшь. Попробуйте цепочку: старт +адрес+RW+ACK+стоп <задержка> и сначала. Работает 3...5 секунд, потом клоки залипают внизу, выскакивает флаг бизи, стоп не проходит, по клокам постоянно прут импульсы... и всё! Дальше только через ресет. Программная реализация хоть предсказуема. Вывод второй: та микросхема, которая была слэйвом, сидела на аккумуляторе 4,2 В, соответственно I2C от контроллера (<3,3 В) не пробивали её по входу (не хватало уровня). Запитал одним питаним - и всё пошло (попробуйте нагрузить 155 серию на 564, если кто помнит, эффект тот же, причём возникает при повышении частоты). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shread 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба Талантливо) А у меня в 5438 не глючило и вроде как всё по глупым бумажкам сходилось... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться