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

NACK in TWI_SR

Здравствуйте господа, прочитал несколько "хороших" отзывов о модуле twi в sam7, но так и не нашёл ответа на следующее:

Как отловить прерывание по NACK?

 

Но про бит TXRDY сказано что он устанавливается, если данные перенесены из TWI_THR в internal shifter or if a NACK error is detected !!! и TXRDY бит устанавливается одновременно с TXCOMP и NACK – это что?! , значит что по `NACK` формируется STOP?

 

В Errata сказано !!!!!!!, что если регистр TWI_SR читать перед установкой TXCOMP, то:

the NACK bit is not set ! Решение проблемы описано: user должен ожидать прерывания от TXCOMP, и не должен читать TWI_SR, пока “transmission is not completed”. Но тогда получается, что я не могу реагировать на TXRDY,

т.е. - как тогда ловить TXRDY, если нельзя читать TWI_SR до TXCOMP

( TXCOMP устанавливается когда : “..both holding and shifter registers are empty and STOP condition has been sent..”).

 

Единственный выход – попробовать проверять NACK по TXRDY , интересно, что в стартовом коде вообще не проверяется NACK бит, и программа работает не по прерываниям, да и в форуме я ни у кого не увидел проверку NACK. Как кто делал посоветуйте

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


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

значит что по `NACK` формируется STOP?
Да.

 

Посмотрите вот этот документик:

TWI___Two_Wire_Interface.ppt

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


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

спасибо, документ очень помог, если это atmel -овский док., почему я его раньше ни где не видел, хорошо бы иметь такой док на каждый аппаратный узел.

остался только один вопрос...

по обслуживанию NACK при посылке bed address, понятно т.е. устанавливается TXRDY одновременно с NACK, и автоматом посылается STOP,

а как тогда быть с no ask во время передачи блока данных? - произойдёт тоже самое что и при передпче адреса? т.е. STOP будет послан не зависимо от того был он разрешён в TWI_CR или нет, так?

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


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

остался только один вопрос...

по обслуживанию NACK при посылке bed address, понятно т.е. устанавливается TXRDY одновременно с NACK, и автоматом посылается STOP,

а как тогда быть с no ask во время передачи блока данных? - произойдёт тоже самое что и при передпче адреса? т.е. STOP будет послан не зависимо от того был он разрешён в TWI_CR или нет, так?

Да, после NACK стоп будет послан всегда.

спасибо, документ очень помог, если это atmel -овский док., почему я его раньше ни где не видел, хорошо бы иметь такой док на каждый аппаратный узел.
Они скрывают правду от народа :crying:

 

Ловите ссылку:

Описание модулей SAM

 

Сам несколько дней эту инфу искал, когда с TWI разбирался.

 

P.S. Если кому будет не лень, перекиньте файлы в закрома...

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


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

а TXRDY и RXRDY не сбрасываются при чтении TWI_SR ?

 

если сбрасываются, тогда у меня наверное автоматом не сформируется STOP после принятия последнего быйта,

и тогда нужно будет либо самому формировать стопы, либо, чтоб не читать TWI_SR:

при приёме ждать ПРЕДпоследнего: читать его, разр. стоп, вырубать прерывание по RXRDY и ждать TXCOMP.

а при передаче так же ждать ПРЕДпоследнего: записывать последний, разреш. стоп, вырубать TXRDY и ждать TXCOMP.

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


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

при приёме ждать ПРЕДпоследнего: читать его, разр. стоп, вырубать прерывание по RXRDY и ждать TXCOMP.

а при передаче так же ждать ПРЕДпоследнего: записывать последний, разреш. стоп, вырубать TXRDY и ждать TXCOMP.

Именно так и нужно.

И еще, в каждый момент разрешайте только 1 прерывание.

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


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

Ещё вопросик, можно ли сформировать restart, без предварительного stop?

И интересно как ведёт себя TXCOMP: при посылке start он сбрасывается, до тех пор пока не будет выдан stop, а рестарт скорее всего, не влияет на TXCOMP , да?

Как то странно, после настройки TWI, если все прерывания запрещены, биты TXRDY и TXCOMP взведены, а после окончания передачи все биты TWI_SR сброшены..

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

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


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

Ещё вопросик, можно ли сформировать restart, без предварительного stop?

И интересно как ведёт себя TXCOMP: при посылке start он сбрасывается, до тех пор пока не будет выдан stop, а рестарт скорее всего, не влияет на TXCOMP , да?

про рестарт точно не скажу, но думаю, учитывая все проблеммы с TWI,

рестарт не очень работоспособен...

Как то странно, после настройки TWI, если все прерывания запрещены, биты TXRDY и TXCOMP взведены, а после окончания передачи все биты TWI_SR сброшены..

Все правильно, TXRDY и TXCOMP взводятся в момент настройки TWI,

поэтому прерывания должны быть в этот момент запрещены.

Более того, лучше всего разрешать прерывания TXRDY и RXRDY только после начала

передачи/приема.

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


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

Вопрос с TWI был решен, извиняюсь за стиль.

С микросхемой часов PCF__ TWI работает, благодаря документации находящейся по ссылке "Описание модулей SAM".

В последних версиях at91 с I2C не должно быть проблем.

 

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


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

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

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

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

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

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

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

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

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

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