Сбросить соединение I2C с arduino в качестве ведомого

В настоящее время я использую последовательную связь I2C с arduino в качестве ведомого устройства и raspberry pi в качестве ведущего. Я отправляю данные датчиков с arduino на raspberry pi. Мне нужно сбросить соединение I2C, как только показания датчика перейдут пороговое значение. Я попытался установить TWCR =0, но при этом на raspberry pi возникает ошибка 121 удаленного ввода-вывода, когда я это делаю. Я также читал, что один из способов-установить TWCR =0, но для этого мне нужно снова выполнить Wire.begin (), Wire.onRequest () и Wire.onReceive (). Не могли бы вы, пожалуйста, рассказать мне, как запустить их снова, так как они включены в функцию настройки. Означает ли это, что мне нужно снова перезапустить программу Arduino? Или я могу поместить их в void loop()? Спасибо за помощь.

, 👍1

Обсуждение

Зачем вам нужно сбросить соединение I2C? И вы можете использовать все функции библиотеки везде, где захотите, @chrisl

Привет, Крисл, я хочу сбросить соединение, потому что я не хочу, чтобы Arduino отправлял какие-либо дополнительные значения мастеру, как только показания датчика пересекают пороговое значение. Есть ли лучший способ его реализовать?, @Prashant


1 ответ


2

У вас неправильное представление о том, как работает I2C. В отличие от последовательного (UART) I2C является строго ведущим и ведомым интерфейсом. Подчиненный ничего не может делать без хозяина, так как только хозяин управляет часами. Таким образом, вам не нужно сбрасывать интерфейс I2C, чтобы остановить передачу от ведомого устройства к ведущему.

Когда ведущий запрашивает данные у ведомого устройства, происходит следующее: сначала ведущий отправляет адрес целевого ведомого устройства, включая бит направления, установленный для "считывания с ведомого устройства". Ведомое устройство с этим адресом реагирует подтверждением (ACK) и начинает передавать один байт. Этот байт получает подтверждение от мастера. Когда ведущий решает, что он получил достаточно данных, он не подтверждает (NACK), что позволяет ведомому устройству прекратить передачу. Затем мастер отправляет условие ОСТАНОВКИ, чтобы остановить передачу I2C.

Я не знаю, как вы реализовали связь I2C на Pi. Обычно, когда вы инициируете транзакцию чтения от ведущего устройства, вы предоставляете количество байтов, которые вы хотите запросить у ведомого устройства. Модуль/библиотека I2C затем запросит данные у ведомого устройства, пока не получит все запрошенные байты.

Таким образом, вам не нужно сбрасывать соединение I2C на Arduino. Мастер полностью контролирует общение. Когда вы завершаете передачу на ведущем устройстве, ведомое устройство не может отправлять дополнительные данные.

Установка TWCR на ноль в середине транзакции приведет к нарушению протокола связи I2C. Таким образом, вы получаете ошибку на Pi, которая указывает на ошибку в протоколе связи I2C. Просто используйте правильную реализацию протокола I2C, чтобы правильно завершить передачу.

,