Перейти к содержанию
    

Уважаемые!

Кто реализовывал работу интерфейса I2C на ATmega128 помогите советом. Никак не могу понять в чем у меня ошибка. Суть проблемы:

Не инициализируется аппаратный TWI. Возвращает коды состояния отличные от указанной в документации. Иногда появляются коды с арбитражем. Пробовал всевозможные установки порта D. Наверно здесь есть какая-нибудь особенность. Подскажите пожалуйста кто знает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код инициализации:

LDI R16,0x1C ; Коэфф.деления TWBR при f=7,3728 МГц

STS TWBR,R16 ;

LDI R16,0b00000100 ; Разрешить работу интерфейса

 

Прерывания не используются, работаем по опросу флага TWINT.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Контроль корректности выполнения операций сейчас не используется. Устал с ним воевать.

Имеется ввиду проверка состояния бита Т.

 

P.S. Извините, что так тормозно отвечаю. Инет на работе глючит по-страшному.

code.zip

Изменено пользователем IgorKossak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в код сильно не вникал, выкладываю свои рабочие подпрограммы (данная версия для M48, но это не принципиально):

 

 

Внешние подтяжки обязательно.

twi.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

beginer, Dopler, предлагаю Вам в двухдневный срок втиснуть Ваши длинные тексты в прикрепляемые к сообщениям файлы.

Иначе через два дня буду наказывать предупреждениями за нарушение правил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Dopler

Спасибо, завтра поковыряем Ваши подпрограммы.

 

IgorKossak

Не хочу быть злостным правонарушителем, но никак не найду кнопку "Правка", чтобы отредактировать своё сообщение. Ещё не подскажите, почему я не вижу половины сообщений в данной теме, когда захожу на форум на работе? Может это из-за использования прокси-сервера? Дома захожу без прокси - всё отлично.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IgorKossak

Не хочу быть злостным правонарушителем, но никак не найду кнопку "Правка", чтобы отредактировать своё сообщение.

Ладно, сам поправлю.

Ещё не подскажите, почему я не вижу половины сообщений в данной теме, когда захожу на форум на работе? Может это из-за использования прокси-сервера? Дома захожу без прокси - всё отлично.

Возможно куки некорректно принимаются. У меня на работе с прокси всё нормально.

И ещё можете с Вашим сисадмином пообщаться об этом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Dopler

Попробовали Ваши подпрограммы. В результате инициализация проходит, старт и стоп - работают. При передаче адреса данных и приёме данных код регистра TWSR равен 0x84. Пробовали с двумя различными микросхемами (чтобы исключить вероятнсть неисправности ведомой микросхемы) - AD7745 и 24C16 (микросхема памяти). При просмотре состояния линий после передачи линия SCL оказывается в низком уровне. С подтягивающими резисторами всё в норме (используем по 5 кОм). Никак не пойму где же всё-таки ошибка. Особо интересует, откуда берётся код 0x84?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При просмотре состояния линий после передачи линия SCL оказывается в низком уровне. С подтягивающими резисторами всё в норме (используем по 5 кОм). Никак не пойму где же всё-таки ошибка.

Низкий уровень на мой взгляд выдает ведомое устройство.

Как это может случиться - при чтении последний байт данных должен быть "NACKed",

если же послыется ACK - ведомое устройство считает что передача не закончена и может проигнорировать STOP.

 

На асме обслуживание Twi - "сизифов труд".. у вас же ж все-таки не t13 где ужимать надо все что можно. Почему выбрали asm?

 

Если интересует я бы мог поделиться примером TWI драйвера на Cи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Низкий уровень на мой взгляд выдает ведомое устройство.

Как это может случиться - при чтении последний байт данных должен быть "NACKed",

Не, не путайте человека - ведомое может "придерживать" SCL чтобы притормаживать обмен, но не держать его постоянно в нуле, к тому же память 24хх на такое не способна. Это вы с SDA спутали. А кстати вопрос - не попутал ли автор SCL и SDA? И еще - проверить кто тянет можно если включить небольшой (100-200 ом) резистор в разрыв этой линии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это вы с SDA спутали.

Да, конечно, я говорил про SDA. Прошу прощения не углядел SCL в описании проблемы.

 

Если автор наблюдает проблему с SCL, то это imho все равно следствие того, что SDA в нуле:

 

SCL - затормозится при попытке выдачи STOP состояния (SDA ведь 0), т.е. аппаратная часть не может сформировать ни START, ни STOP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей Борщ

А кстати вопрос - не попутал ли автор SCL и SDA?

Вообще, честно говоря, я программированием микроконтроллеров не занимаюсь. Моя роль в данном проекте - всего лишь написать программу для ПК, которая бы общалась с микроконтроллером посредством интерфейса RS-232. А программированием контроллера занимается другой человек. Однако все вопросы, что я здесь задаю - с его слов. Он хороший специалист, отлично разбирается в схемотехнике. Я не думаю, что он мог бы перепутать линии SCL и SDA. К тому же мы вместе проверяли - в нуле после передачи постоянно остается только SCL, а SDA - в высоком уровне.

 

defunct

т.е. аппаратная часть не может сформировать ни START, ни STOP.

Не знаю, вроде бы старт и стоп как раз формируются. С остальным - проблемы. Хотя тут есть ещё кое-что. Сегодня звонили в саппорт фирмы, в которой покупали плату AS-megaM (плата на основе того самого ATmega128 с распаянной на плате периферией, типа COM-порта, кнопками и т. п.). Так вот в саппорте сказали что по описанию похоже, что проблема в убитом блоке контроллера, отвечающем за реализацию TWI. Похоже что столкнулись с бракованным контроллером. В общем теперь думаем брать ещё контроллер (на этот раз без платы), выпаивать из платы старый, и сажать на неё новый.

В пользу теории о бракованном контроллере говорит также то, что на ATmega8 при реализации связи с микросхемой 24C16 наши программы заработали (только порт D сменили на С). В общем в понедельник ещё попробуем поработать с этим контроллером (обещал подойти ещё один специалист), если не выйдет, то будем пробовать новый.

Если кому интересно, могу попозже здесь написать как же всё-таки разрешилась данная ситуация.

Изменено пользователем beginer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если кому интересно, могу попозже здесь написать как же всё-таки разрешилась данная ситуация.
Конечно интересно. Это правило хорошего тона на любом форуме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...