***А после уловия "СТОП" флаг TWINT случайно не проверяете? Если проверяете, то шина вполне может зависнуть. По крайней мере мне так кажется, потому, что в application note от atmel полсе "СТОП" ни "чего нет".***
Флаг TWINT и проверял и не проверял,поровну.
Программа экспрессом идет дальше,но реакции на ногах нет. То есть в первый раз все ОК.По второму кругу ничего. Прога не виснет, получаеться сторожевого таймера тоже не поставить. Единственный вариант проверять TWSR на отсутствие АСК и врубать сторожевого таймера на сброс. Но тогда вопрос ,сохраняються ли значения регистров и оперативки при таком сбросе? Чтобы программа могла успешно продолжать передачу а не циклиться на одном и том же. Да и такие маневры программы меня не очень радуют. Кроме того не все устройства поддерживают АСК а остальные бывает при окончании связи выставляют NACK. Даже не знаю что здесь делать
Второй вариант держать постоянно шину занятой,но тогда два мастера на шину не поцепить.
***Если можно, то покажите, пожалуйста исходник. И еще... Вы сами писали функции работы с TWI?***
Пишу на графическом асме,его здесь не нарисовать,хотя код в пол мизинца,опишу.
Здесь без использования прерывания по TWI
#H02->TWBR // Устанавливаем SCL 100000Гц #H02->TWSR // #HA4->TWCR // Включение и старт TWI <TWINT=0> // Ждем пока TWINT=0 если TWINT= 1 идем дальше #H40->TWDR // Записываем адресс устройства (40 HEX) в TWDR #H84->TWCR // Отправляем адресс устройства <TWINT=0> // Ждем пока TWINT=0 если TWINT= 1 идем дальше #HFF->TWDR // Записываем данные для передачи (FF HEX) в TWDR #H84->TWCR // Отправляем данные <TWINT=0> // Ждем пока TWINT=0 если TWINT= 1 идем дальше #H94->TWCR // Стоп
Все,если прога по второму кругу идет ,в ответ тишина.
|