I2C связь в Arduino

i2c

В Arduino I2C у нас есть следующие строки кода:

wire. beginTransmission(slave addrress)
wire.write(the byte want to send)
wire. endTransmission()

Как мы знаем в I2C, ведущий должен проверить наличие подчиненного адреса и убедиться в этом, получив ack от ведомого устройства. Кто из трех перечисленных функций выполняет эту работу? Это проволока. Начать передачу? на их сайте только что упомянуто, что он инициализирует связь с подчиненным устройством. Я хочу знать, что происходит во время выполнения wire. beginTransmission с точки зрения I2C.

Также wire.endTransmission() освобождает буферные данные, созданные с помощью wire. пиши. Так кто же проверяет присутствие раба? Первая функция или 3-я?

, 👍1


1 ответ


Лучший ответ:

4

Вся фактическая связь I2C выполняется в Wire.endTransmission(). До этого на линиях I2C ничего не делается.

Wire.beginTransaction() только инициализирует буфер библиотек и сохраняет подчиненный адрес во внутренней переменной. Wire.write() помещает данные во внутренний буфер.

Wire.endTransmission() затем может следовать протоколу I2C. Он генерирует условие запуска на шине, отправляет байт адреса, проверяет подтверждение ведомых байтов на адресном байте, затем отправляет байты данных, за каждым из которых следует подтверждение ведомых байтов. Наконец, он генерирует условие остановки.

,

это значит, предположим, я забыл написать wire. beginTransmission, значит ли это, что я не могу выполнить wire.endTransmission? Потому что, похоже, последнее зависит от первого? То есть проволока. Конечная передача не является независимой функцией., @Sayan

Wire.beginTransmission() запускает библиотеку для главной транзакции записи. Поэтому он нужен вам перед вызовом функции Wire.endTransmission (). Что заставляет вас думать, что любая из этих функций независима? Они работают для одного и того же аппаратного интерфейса. Вы должны называть их так, как предполагает библиотека., @chrisl