Д_М 0 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба Приветствую! Реализовал связь двух AVR по TWI master-slave. Циклическая запись и чтение. Если после завершения записи сразу же начать считывание, и наоборот, но всё зависает. Если же сделать паузы в 2мс, то работает нормально. Так и должно быть, или имеет место косяк в программе? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 26 июля, 2017 Опубликовано 26 июля, 2017 (изменено) · Жалоба Приветствую! Реализовал связь двух AVR по TWI master-slave. Циклическая запись и чтение. Если после завершения записи сразу же начать считывание, и наоборот, но всё зависает. Если же сделать паузы в 2мс, то работает нормально. Так и должно быть, или имеет место косяк в программе? Похоже на косяк в программе. Нужно оперировать не временной задержкой, а флагом прерывания и кодом состояния. Изменено 26 июля, 2017 пользователем aiwa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Д_М 0 25 октября, 2017 Опубликовано 25 октября, 2017 · Жалоба Разъясните, пожалуйста, про Repeated Start. Правильно ли я понял, что если нужно передавать только отдельные пакеты, то транзакция должна завершаться Stop. В документации сказано, что передача Stop не вызывает прерывания. Если же нужно постоянно передавать что-то без пауз между транзакциями, то транзакция должна завершаться не Stop, а Repeated Start, который будет сразу же началом следующей транзакции. Если же транзакция завершилась командой Stop и сразу же начать новую транзакцию командой Start, произойдёт сбой, так как команда Stop не успеет отработать. Потому у меня и не работало, пока не вставил паузы между Stop и Start. Я прав? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 26 октября, 2017 Опубликовано 26 октября, 2017 · Жалоба (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, - флаги состояния-статуса, настраивайте работу в режиме прерываний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться