Доброго всем времени суток.
С недавнего времени подвернулся проектик который собираю на 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 в единицы.(самая медленная скорость, так как за неимением осциллографа пользуемся дедушким методом отладки-светодиоды вешаем на линии и пытаемся понять хоть что уходит с МК для начала).