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

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

Приветствую!
Реализовал связь двух AVR по TWI master-slave.
Циклическая запись и чтение.
Если после завершения записи сразу же начать считывание, и наоборот, но всё зависает. Если же сделать паузы в 2мс, то работает нормально. Так и должно быть, или имеет место косяк в программе?

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Д_М @ Jul 26 2017, 20:20) <{POST_SNAPBACK}>
Приветствую!
Реализовал связь двух AVR по TWI master-slave.
Циклическая запись и чтение.
Если после завершения записи сразу же начать считывание, и наоборот, но всё зависает. Если же сделать паузы в 2мс, то работает нормально. Так и должно быть, или имеет место косяк в программе?


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

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


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

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Д_М @ Oct 25 2017, 13:00) <{POST_SNAPBACK}>
(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, - флаги состояния-статуса, настраивайте работу в режиме прерываний.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация