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

TWI (Он же I2C) Паузы между транзакциями

Приветствую!

Реализовал связь двух AVR по TWI master-slave.

Циклическая запись и чтение.

Если после завершения записи сразу же начать считывание, и наоборот, но всё зависает. Если же сделать паузы в 2мс, то работает нормально. Так и должно быть, или имеет место косяк в программе?

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


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

Приветствую!

Реализовал связь двух AVR по TWI master-slave.

Циклическая запись и чтение.

Если после завершения записи сразу же начать считывание, и наоборот, но всё зависает. Если же сделать паузы в 2мс, то работает нормально. Так и должно быть, или имеет место косяк в программе?

 

Похоже на косяк в программе.

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

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

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


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

Разъясните, пожалуйста, про Repeated Start.

Правильно ли я понял, что если нужно передавать только отдельные пакеты, то транзакция должна завершаться Stop. В документации сказано, что передача Stop не вызывает прерывания.

Если же нужно постоянно передавать что-то без пауз между транзакциями, то транзакция должна завершаться не Stop, а Repeated Start, который будет сразу же началом следующей транзакции. Если же транзакция завершилась командой Stop и сразу же начать новую транзакцию командой Start, произойдёт сбой, так как команда Stop не успеет отработать. Потому у меня и не работало, пока не вставил паузы между Stop и Start.

Я прав?

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


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

(1) Разъясните, пожалуйста, про Repeated Start. . . .

(2) . . . Потому у меня и не работало, пока не вставил паузы между Stop и Start.

(1) Любой пакет, передаваемый master, должен начинаться Start(S) и заканчиваться Stop(P). Между ними моежт присутствовать RS.

Сам по себе пакет никаких прерываний не вызывает, только при требуемой настройке.

Обычно RS используется при передаче сложных команд, когда в первой фазе надо передать адрес слейва+RW, и 1-2...N

байт команды (режим Write), а затем считать (Read) ответ слейва. Этот режим аналогичен тому, что вместо RS использовать отдельные

Start(S) и Stop(P).

(2) Приемопередатчик I2C / TWI нельзя "дергать" пока он не закончил работу с шиной. Если Вы, в момент передачи или приема

дергаете его следующей командой из программы, то "все пропало". Поэтому возможно, и помогла пауза.

Курите описание узла I2C, - флаги состояния-статуса, настраивайте работу в режиме прерываний.

 

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


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

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

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

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

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

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

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

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

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

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