Зачем использовать UART для связи между Arduino и модулем Wi-Fi ESP?

Я изучал различные протоколы связи, используемые между Arduino и другими компонентами/датчиками, а именно SPI, UART и I2C. Я хочу добавить Wi-Fi в свой проект Arduino UNO с использованием ESP8266 (на данный момент и, возможно, позже перейти на ESP32, так как он более мощный).

Но мне интересно, почему на всех схемах, которые я видел в своих онлайн-исследованиях, Arduino всегда подключается к модулю ESP8266 через UART? Почему бы не использовать SPI или I2C? Почему UART (очевидно) считается лучшим для связи ESP с Arduino по сравнению с двумя другими протоколами связи?

Заранее спасибо за помощь.

Обычные модули ESP8266 имеют только последовательный интерфейс.
Что вы подразумеваете под «общим»? Я думаю, что все модули ESP8266 имеют одни и те же основные функции, если я не ошибаюсь? На самом деле, я только что нашел руководство, в котором использовалась связь I2C между Arduino и ESP8266, так что это делает все еще более запутанным! medium.com/@krukmat/arduino-esp8266-через-i2c-49b78e697b7a
Согласно любой документации, которую я смог найти, ESP-01, используемый в этой ссылке, имеет только контакты UART. Я не понимаю, что там описано. Я предполагаю, что контакты GPIO со стороны ESP немного стучат. Таким образом, перебор битов по своей сути является худшим решением, чем использование выделенного аппаратного периферийного устройства.
Ну, во-первых, из этих трех UART является единственным, где интерфейс является полнодуплексным, И данные, идущие в одном направлении, могут начинаться и останавливаться независимо от данных на другой линии, что полезно, если ESP хочет отправить данные в MCU по собственному желанию. Основным преимуществом I2C является адресация и мультимастер, которые здесь не нужны.
FWIW, github.com/esp8266/Arduino/pull/5226 ESP8266 can never be a compliant I2C slave; there is no hardware support, and a bit-by-bit software solution isn't going to be fast enough for the standard I2C speed of 100kHz because 1) the interrupt won't arrive fast thought and 2) the GPIO bus clock is slower than 100kHz. That's why this solution can handle 14kHz max, which is useless since most other devices run at 100kHz. Try ESP32, it has I2C hardware.

Ответы (1)

UART предлагает двустороннюю связь всего с двумя проводами.

I2C — это односторонняя связь по 2 проводам. Это можно сделать двумя способами, внедрив собственный механизм уведомления, в котором ведомое устройство отправляет сигнал всякий раз, когда у него есть данные для отправки с использованием соединения GPIO. Для этого требуется еще один контакт и, следовательно, 3 провода для двусторонней связи по сравнению с двумя в UART. Другой альтернативой является опрос, как указано в комментариях ниже. Лично я предпочитаю поток, управляемый прерыванием, а не опрос. Однако, если у вас все в порядке с опросом, 2 провода действительно могут справиться с этой задачей.

SPI требует как минимум 4 провода. (Может быть, 3 провода в случае одного ведомого, как прокомментировал Эллиот)

Учитывая ограниченное количество контактов, доступных на модулях esp, я думаю, сообщество могло бы выбрать использование UART в качестве основного механизма передачи данных. Плюс UART проще в реализации, чем другие аналоги. (Эта строка может быть основана на мнении, поэтому, пожалуйста, извините меня, если вы склонны не соглашаться)

Модули esp можно использовать как самостоятельные микроконтроллеры для общих проектов. Вы можете использовать расширители портов, если требуется больше GPIO. Я использовал подобную архитектуру в одном из своих проектов. Я использовал esp-arduino для разработки прошивки внутри самой IDE arduino.

I2C - это всего два провода (SCL и SDA), но UART гораздо проще реализовать, как вы сказали.
Для одного подчиненного устройства вы можете использовать SPI с тремя проводами.
@select - я отредактировал свой ответ, чтобы объяснить требование к 3 проводам. Взгляни, пожалуйста.
@Elliot - обновил мой ответ. спасибо, что указали на это.
Даже если обычный I2C потребует опроса, стоит иметь в виду, что многие простые прошивки в любом случае могут обрабатывать входящие данные только в определенный момент выполнения их цикла. Учитывая, что ESP8266 имеет немного больше оперативной памяти, чем ATmega, на самом деле есть веский аргумент в пользу буферизации данных ESP до тех пор, пока ATmega не будет готова запросить их. Конечно, та же самая разница в ресурсах может указывать на запуск всего приложения на ESP.
Кроме того, вы должны иметь возможность просто прочитать регистр I2C, чтобы определить, есть ли данные как часть цикла опроса. Это устранит необходимость в третьей строке только для того, чтобы указать, что данные готовы.