|
|
  |
Помогите разобраться как сформировать NACK в I2C |
|
|
|
Oct 13 2007, 18:21
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 3-02-06
Пользователь №: 13 965

|
Помогите. У меня MSP430F169 у него есть модуль I2C. Но пока не могу понять... Написано, что I2C генерирует АСК после каждого полученного байта, а у меня устройство(DS1337), которое перестаёт передавать мне, когда получит NACK. Причем, иногда работает и так, но очень часто вешает всё напрочь;( Опускает SDA и всё... Приходится снимать питание с часиков! Вот... Может у кого-нить есть какие-нибудь идеи?
|
|
|
|
|
Oct 13 2007, 19:32
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 3-02-06
Пользователь №: 13 965

|
Понятно... Мне уже приходила в голову такая идея  Хотелось по человечески, а получется надо как всегда... Спасибо за ответ.
|
|
|
|
|
Oct 15 2007, 06:25
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 3-02-06
Пользователь №: 13 965

|
Цитата(Сергей Борщ @ Oct 14 2007, 20:06)  Это нормальное поведение любого устройства - по NACK прекращать передачу. Более того, это единственный способ для мастера закончить прием. Поэтому принимая последний байт вы должны сформировать NACK. Может невыполнение этого условия и вводит всю вашу систему в ступор? Может быть... Вот только я никак не пойму, как через стандартный модуль MSP430F169 I2C послать NACK! Сейчас вроде запустил, но если верить документации на DS1337 - как оно сейчас работает без NACK оно вообще не должно работать
|
|
|
|
|
Oct 15 2007, 10:26
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(rezident @ Oct 15 2007, 12:15)  А генерации STOP-условия разве недостаточно для завершения приема? Для генерации STOP линия данных должна быть в 1. Точнее, слейв не должен ее тянуть в ноль. Если не сформировать NACK, то к моменту формирования STOP слейв выставляет на шину первый бит следующего байта, который вполне может быть и нулем. И сформировать STOP будет невозможно. P.S. С аппаратным I2C в MSP не работал.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 16 2007, 19:50
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 3-02-06
Пользователь №: 13 965

|
Цитата(rezident @ Oct 15 2007, 15:22)  Я тоже с этим модулем не работал. Просто чисто логически сделал вывод, что если задать ему STOP-условие, то модуль сам сформирует и NACK и STOP-условие. Знаете, очень похоже что Вы оказались правы! Именно так я и реализовал, что ,как я замечал в предыдущем посте, мне кажется немного расходится с документацией! В дукументации написано что после адреса регистра надо сказать шине рестарт, но так у меня она не заработала  Я честно генерю стоп, а после этого снова старт - и вот так она заработала  Странно!!! Но тьфу-тьфу... пока работает!:) Что вообщем не может не радовать! Всем кто откликнулся на призыв о помощи, большое спасибо!:) Вот только возникла другая проблемка!:( Часики у меня на батарейки, а вот микропроцессор нет! В итоге, если пропадает питание во время передачи по I2C, часики блокируют шину(Опускают SDA) и не отпускают её  Как только снимаю батарейку, они сбрасываются и разблокируют шину! Вот как с этим бороться я не знаю! Только схему наверное придется править!:( Может кто знает, что можнор сделать в данном случае?
|
|
|
|
|
Oct 17 2007, 14:22
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 3-02-06
Пользователь №: 13 965

|
Цитата(rezident @ Oct 17 2007, 00:11)  В рекомендациях по инициализации шины I2C пишут, что после подачи питания неплохо бы "поклокать" шину. Т.е. не создавая START- или STOP-условий просто генерировать сигнал SCL, чтобы таким вот как RTC зависшим устройствам давать возможность "прочухаться". Количество тактов SCL не менее 10 желательно. Ага... Вот как... Попробую сегодня!;) А идея не плоха.... Вообщем-то логично!;) Спасибо! Попробую отпишу!;)
|
|
|
|
|
Oct 17 2007, 19:13
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 3-02-06
Пользователь №: 13 965

|
Вот блин "невезуха" %) Не удалось привести шину в такое состояние  Но инициализацию написал и оставил, чисто на всякий случай!:) Большое спасибо rezident'у за помощь, а особенно за последнее предложение, вообщем всё гениальное просто!:)
|
|
|
|
|
Oct 19 2007, 21:12
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 3-02-06
Пользователь №: 13 965

|
Предложение было очень правильное! Спасибо! Разглючил!) Всё оки!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|