Доброго всем времени суток. С недавнего времени подвернулся проектик который собираю на AtMega 128,в данном проекте нужно запустить TWI интерфейс, для считывания показаний времени со счетчика DS1307. И все бы хорошо и много веток нашлось на данном форме, НО ни в одном из случаев контроллер не может ничего счтитать. При попытке разгобраться в чем проблема выяснилось, что при попытке записать данные в регистр-TWDR данные, в регистре TWCR устанавливается флаг TWWC - ошибочная запись. из даташита выяснилось что: После успешной передачи ПОДЧИН_АДР + ЗАПИСЬ должен быть передан пакет данных. Его передача инициируется записью байта данных в TWDR. Доступ на запись к TWDR разрешен только тогда, когда флаг TWINT равен 1. В противном случае доступ блокируется и устанавливается флаг ошибочной записи TWWC в регистре TWCR. После обновления TWDR необходимо сбросить бит TWINT (путем записи в него лог. 1) для продолжения сеанса связи.(стр 215 оригинального даташита на Atmega128-engl) я в свою очередь после этого попытался вручную установить сначала один бит TWINи записать данные: TWCR|=(1<<TWINT); TWDR = adr; twcr=TWCR; Lcd.WriteInt(twcr);- но на дисплее получил число 44 что означает? что бит TWWC установился снова. далее попробовал полностью в регистр TWCR записать все единицы
TWCR|=((1<<TWINT)|(1<<TWEA)|(1<<TWSTA)|(1<<TWSTO)|(1<<TWWC)|(1<<TWIE)); и так TWCR=255; но на мое удивление при записи и последующем считывании снова получил, что бит TWINT установлен в 0. итак суть вопроса: как правильно сделать запись, чтоб данные в регистр TWDR попали и при этом бит TWWC не установился? PS да и бит TWEN в регистре TWCR естественно включено и состояние регистра TWBR=255 и значение предделителей TWPS0 и TWPS1 в единицы.(самая медленная скорость, так как за неимением осциллографа пользуемся дедушким методом отладки-светодиоды вешаем на линии и пытаемся понять хоть что уходит с МК для начала).
Сообщение отредактировал Nekromant - Mar 18 2011, 19:38
|