реклама на сайте
подробности

 
 
> I2C, Кто виноват и что делать
1921
сообщение Jan 31 2011, 09:23
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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 по-прежнему висят две единицы. Старт не сбрасывается. Я полагал, что после выставления старта сброс бита происходит после передачи адреса слэйву и приёма от него подтверждения. Вроде пересмотрел все примеры – не помогло.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Shread
сообщение Feb 1 2011, 09:39
Сообщение #2


иногда заглядывающий
****

Группа: Свой
Сообщений: 900
Регистрация: 18-05-05
Из: Зеленоград
Пользователь №: 5 170



В дребезге чего? cranky.gif У меня есть девайс, где MSP430 мастером работает и до самого дальнего слейва метр почти и работает как часы. Осциллографом смотрели, что на линии творится? Есть вообще обмен?
Go to the top of the page
 
+Quote Post
1921
сообщение Feb 2 2011, 11:16
Сообщение #3


Участник
*

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



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



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 15:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016