Подключение дисплея lcd 1602 к arduino по i2c / iic

Когда ведущие устройства не могут уживаться вместе

Часть того, что делает I2C настолько универсальной, – это поддержка нескольких ведущих устройств. Но, как показывает предыдущий раздел, ведущие устройства не всегда хорошо работают вместе. Логика I2C устройства должна быть в состоянии определить, свободна ли шина; если шину занял другой мастер, то устройство до запуска своей собственной транзакции ждет, пока не завершится текущая транзакция. Но что происходит, когда два (или более) мастера пытаются инициировать транзакцию одновременно? I2C обеспечивает эффективное и удивительно простое решение этой неприятной, если бы она случилась, проблемы. Этот процесс называется «арбитраж», и он полагается на гибкость схемы шины I2C с открытым стоком: если один мастер пытается привести сигнал к логической единице, а другой мастер пытаются привести сигнал к логическому нулю, то «выиграет» мастер с логическим нулем, и, кроме того, «проигравший» может обнаружить, что фактическое состояние на выходе отличается от состояния, которое он хотел установить:

Арбитраж на шине I2C

Эта схема показывает основу арбитража I2C; процесс происходит следующим образом:

  1. Оба мастера генерируют стартовые биты и осуществляют свои передачи.
  2. Если мастера выбирают на линии одни и те же логические уровни, ничего не происходит.
  3. Как только мастера пытаются установить на линии разные логические уровни, мастер, установивший на линии логический ноль, объявляется победителем; а проигравший обнаруживает несоответствие логических уровней и отказывается от своей передачи.

Потратьте минутку, чтобы оценить простоту и эффективность этого механизма:

  • Победитель продолжает свою передачу без перерыва – нет поврежденных данных, нет конфликта устройств, нет необходимости в перезапуске транзакции.
  • Теоретически проигравший мог контролировать адрес ведомого устройства в ходе процесса арбитража и фактически принимать правильные данные, если так оказалось, что он и является этим ведомым устройством.
  • Если конкурирующие мастера запрашивают данные от одного и того же ведомого устройства, процесс арбитража не требует необязательного прерывания транзакции – не будет обнаружено ошибки, и ведомое устройство выведет свои данные на шину, чтобы их могли получить несколько мастеров.

Чтение показаний датчика влажности и температуры DHT22

Работа по считыванию показаний датчиков DHT22 и хранение их в массиве памяти также ложится на микроконтроллер PIC. Низкая цена, доступность и относительная надежность DHT22 сделали его использование повсеместным. Однако последовательный протокол, который используется этим чипом, требует очень точной временно́й работы. Эти требования к синхронизации могут стать проблемой для систем, использующих относительно медленный ввод/вывод, и для систем (например, микросхем систем на кристалле, SoC), чьи многочисленные высокоприоритетные функции могут сделать требуемые выделения времени неудобными. В этом отношении имеет смысл «разгрузить» работу на отдельную микросхему.

Связь с датчиком осуществляется через специальный «однопроводный» последовательный протокол, который не следует путать с однопроводным протоколом от Dallas/Maxim semiconductor – они совершенно разные. В данной связи задействованы три соединения (Vcc, GND и данные). Вывод данных – это место, где происходят все манипуляции, и тщательное прочтение технического описания даст более подробную информацию.

Вкратце, следующие шаги описывают взаимодействие со стороны PIC микроконтроллера, необходимое для считывания датчика, а прилагаемая программа MPASM была подробно прокомментирована для облегчения прослеживания действий программы:

  1. Установить линию данных в режим выхода, установить на ней низкий уровень и ждать 18 микросекунд.
  2. Установить на линии данных высокий уровень на 30 микросекунд.
  3. Установить линию данных в режим входа и мониторить её состояние. DHT22 должен установить на ней низкий уровень на 80 микросекунд, а затем высокий уровень на 80 микросекунд.
  4. Шаги 1-3 являются преамбулой к потоку данных. Затем DHT22 установит на линии данных низкий уровень на 50 микросекунд, что сигнализирует о старте бита данных.
  5. Теперь всё становится немного сложнее. После времени стартового бита DHT22 установит на линии данных высокий уровень либо на ~27 микросекунд, либо на 70 микросекунд. Первый сигнал соответствует биту данных ‘0’, а второй сигнал – биту данных ‘1’.
  6. После передачи бита данных (шаг 5 выше) DHT22 перейдет к следующему 50-микросекундному стартовому биту, за которым следует следующий бит данных (либо ‘0’, либо ‘1’, как описано в шаге 5), и эта последовательность повторяется для 40 битов, составляющих 5 байтов данных датчика (влажность целая часть, влажность часть после десятичной запятой, температура целая часть, температура часть после запятой и контрольная сумма).

Вы можете видеть, что протокол требует точной синхронизации, и что время считывания датчика является переменным значением в том смысле, что оно зависит от количества битов ‘0’ и ‘1’ в чтении. Одна из стратегий состоит в том, чтобы измерить каждый из интервалов и затем решить, соответствует ли бит данных интервалу ‘0’ или ‘1’. Я выбрал другую стратегию, описанную ниже, которая менее требовательна и очень надежна.

Стратегия распознавания битов ‘0’ и ‘1’ в последовательном потоке

После преамбулы мы ждем окончания времени стартового бита, затем ждем около 43 микросекунд, после чего считываем состояние линии данных. Если на линии данных уровень низкий, то бит был равен ‘0’, и мы находимся во времени передачи следующего стартового бита. В этом случае мы записывает бит как ‘0’ и ждем окончания времени стартового бита перед чтением следующего бита данных. Если на линии данных уровень высокий, то бит был равен ‘1’, и мы всё еще находимся во времени передачи бита данных. В этом случае, мы записываем бит как ‘1’ и ждем начала времени следующего стартового бита, затем ждем окончания времени стартового бита перед чтением следующего бита данных.

Когда PIC микроконтроллер закончит считывание запрошенного датчика DHT22, данные будут доступны для чтения через интерфейс I2C. В этом случае будет считан как , что указывает на успешное завершение последней команды.

10-bit I2C Addressing

10-bit addressing can be used together with 7-bit addressing since a special 7-bit address (1111 0XX) is used to signal 10-bit I2C address. When a master wants to address a slave device using 10-bit addressing, it generates a start condition, then it sends 5 bits signaling 10-bit addressing (1111 0), followed by the first two bits of the I2C address and then the standard read/write bit.

If the master will write data to the slave device it must send the remaining 8 bits of slave address as the second byte.

If the master will read data from the slave device it must send the complete 10-bit address (two bytes) as for writing, then a repeated start is sent followed by the first address byte with read/write bit set to high to signal reading. After this procedure the data can be read from the slave device.

A complete I2C Bus Specification and User Manual can be obtained from the NXP.

Резисторы

Путь протекания тока в шине I2C

Минимальное сопротивление подтягивающего резистора определяют два требования. Во-первых, подтягивающий резистор должен ограничивать ток до уровня, который не превышает максимальный ток стока выходного транзистора. Во-вторых, резистор должен предотвращать чрезмерное потребление тока, когда сигналы SDA и SCL находятся в низком логическом состоянии. На практике потребление тока является доминирующим фактором, поскольку обычно нет необходимости использовать сопротивление, которое достаточно мало, чтобы подвергнуть выходной транзистор опасности.

В качестве примера предположим, что у нас есть шина с напряжением 3,3 В, и мы хотим ограничить ток до 3 мА.

\}{3\text{}}=1.1 кОм\]

Если предположить, что сигналы на тактовой и сигнальной линиях имеют коэффициент заполнения 50%, потребляемая мощность будет равна:

\)^2}{1100}\approx 10\text\]

Подтягивающие резисторы с низкими номиналами обеспечивают более быстрые переходы и «более прямоугольный» сигнал, но также приводят к более высокой рассеиваемой мощности

Расчет максимального значения подтягивающих резисторов

Чтобы обеспечить надлежащую работу, разработчик должен убедиться в том, что выполнены временны́е требования I2C устройства

На приведенном выше графике показаны сегменты переходов I2C, которые соответствуют времени нарастания, времени спада, времени, проведенному в состоянии низкого логического уровня, и времени, проведенному в состоянии высокого логического уровня. Соответствующие значения для этих временных параметров обычно указаны в техническом описании устройства. График не в масштабе.

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

Время нарастания до высокого логического уровня слишком велико, и напряжение не доходит порогового уровня высокого логического состояния. Следовательно, устройства на этой шине не смогут общаться.

Вычисление максимального значения подтягивающего резистора требует знания требований к времени нарастания. Затем используются экспоненциальные функции для моделирования кривой и нахождения времени, необходимого для достижения порогового напряжения высокого логического состояния после прохождения порогового напряжения низкого логического состояния.

Определение времени нарастания

Кривая нарастания задается показанной ниже экспоненциальной функцией. Чтобы определиться со временем нарастания, вычтите время, необходимое для достижения порога высокого логического уровня из времени, необходимого для достижения порога низкого логического уровня. Формула показывает, как значения на вертикальной оси (напряжение) зависят от значений на горизонтальной оси (время). Перед определением разницы во времени необходимо выразить из этой формулы время.

\

\

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

\

\

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

Выразим Rподтяг. и получим:

\

Это окончательная формула, используемая в расчетах для максимального сопротивления подтягивающего резистора; tнарастания, Vлог.низ. и Vлог.выс. приведены в техническом описании, а Cшины оценивается на основе характеристик вашей схемы. Выбрав произвольные значения tнарастания = 150 нс, Vлог.низ. = 0,5 В и Vлог.выс. = 1,2 В, и предположив, что емкость шины составляет 150 пФ, мы получим следующее:

\}{\ln \left ( \frac{3.3 -0.5}{3.3 -1.2 }\right ) \cdot150\cdot 10^{-12}}\approx 3500\]

7-bit I2C Addressing

A slave address may contain a fixed and a programmable part. Some slave devices have few bits of the I2C address dependent on the level of address pins. This way it is possible to have on the same I2C bus more than one I2C device with the same fixed part of I2C address.

The allocation of I2C addresses is administered by the I2C bus committee which takes care for the allocations. Two groups of 8 I2C addresses are reserved for future uses and one address is used for 10-bit I2C addressing.

The general call address is used to address all devices on the slave bus. If any slave device doesn’t need to respond to such call or general call is not supported by the slave device, the call must be ignored. If the device supports general call and wants to receive the data it must acknowledge the address and read the data as a slave receiver.

Start Byte

If microcontroller has I2C hardware and the microcontroller acts as a slave then the software needs to do nothing to check the bus state. The I2C hardware will detect Start condition, receive the I2C address and interrupt the software if necessary. However, if the I2C interface is implemented by the software, the microcontroller has to sample SDA line at least twice per clock pulse in order to detect changes. To simplify detection of I2C commands on the bus in such cases, a special I2C address called Start byte is used. Such start byte (0000 0001) is followed by an acknowledge pulse (for interface compatibility reasons). This combination holds the SDA line low for 7 clock pulses and allows simple detection of active I2C bus with lower sampling frequency.

Характеристики I2S

Следующая диаграмма изображает три конфигурации, поддерживаемые I2S.

Рисунок 1 – Конфигурации, поддерживаемые интерфейсо I2S. Схема взята из спецификации I2S, впервые опубликованной Philips Semiconductors в 1986 году и обновленной в 1996 году.

Данные передаются по линии SD, состояние линии WS соответствует аудиоканалу (правый или левый), который передается в данный момент, а линия синхронизации SCK передает тактовый сигнал. Как видно из диаграммы, сигналы WS и SCK могут генерироваться передатчиком, приемником или сторонним контроллером.

Ниже перечислены характерные особенности трех сигналов интерфейса I2S.

Последовательные данные (SD)

  • При передаче цифровых значений в первую очередь передается старший бит слова (MSb).
  • У передатчика и приемника длина слова не должна быть согласована; передатчик отправляет то, что у него есть, а приемник берет то, что может использовать.
  • Выдача новых битов данных на передатчике может синхронизироваться либо по фронту, либо спаду тактового сигнала. Однако выборка их приемником должна быть синхронизирована по фронту, поэтому более простым подходом здесь является вариант, показанный на диаграмме ниже, то есть мы передаем данные по спаду тактового сигнала, и а их выборку приемником синхронизируем по фронту тактового сигнала.
  • Протокол не описывает неиспользуемые периоды времени между словами; за младшим битом (LSb) одного слова сразу же следует старший бит (MSb) следующего слова.

Выбор слова (WS)

  • Низкий логический уровень на WS указывает, что передаваемое в настоящее время слово является частью потока данных для левого аудиоканала; высокий логический уровень на WS указывает на передачу звука правого канала.
  • Чтобы облегчить обработку данных как на стороне передатчика, так и на стороне приемника, сигнал WS изменяет свое логическое состояние на один период тактового сигнала раньше завершения передачи слова данных:

Рисунок 2 – Диаграмма передачи данных по интерфейсу I2S. Схема взята из спецификации I2S.

Сколько байт?

Каждая транзакция начинается одинаково: стартовый бит, адрес, чтение/запись, ACK/NACK. После этого любое количество байт данных может быть отправлено от мастера к ведомому устройству или от ведомого к мастеру, причем после каждого байта следует ACK или NACK. NACK может быть полезен как способ сказать: «прекрати отправку данных!»

Например, мастер может захотеть получать непрерывный поток данных от ведомого устройства (например, датчик температуры); за каждым байтом следует ACK, и если мастеру необходимо обратить внимание на что-то еще, он может послать ведомому устройству NACK и начать новую транзакцию, когда будет снова готов

Многобайтовая транзакция

1Описание интерфейса I2C

Последовательный протокол обмена данными IIC (также называемый I2C – Inter-Integrated Circuits, межмикросхемное соединение) использует для передачи данных две двунаправленные линии связи, которые называются шина последовательных данных SDA (Serial Data) и шина тактирования SCL (Serial Clock). Также имеются две линии для питания. Шины SDA и SCL подтягиваются к шине питания через резисторы.

В сети есть хотя бы одно ведущее устройство (Master), которое инициализирует передачу данных и генерирует сигналы синхронизации. В сети также есть ведомые устройства (Slave), которые передают данные по запросу ведущего. У каждого ведомого устройства есть уникальный адрес, по которому ведущий и обращается к нему. Адрес устройства указывается в паспорте (datasheet). К одной шине I2C может быть подключено до 127 устройств, в том числе несколько ведущих. К шине можно подключать устройства в процессе работы, т.е. она поддерживает «горячее подключение».

Описание интерфейса I2C

Давайте рассмотрим временную диаграмму обмена по протоколу I2C. Есть несколько различающихся вариантов, рассмотрим один из распространённых. Воспользуемся логическим анализатором, подключённым к шинам SCL и SDA.

Мастер инициирует обмен. Для этого он начинает генерировать тактовые импульсы и посылает их по линии SCL пачкой из 9-ти штук. Одновременно на линии данных SDA он выставляет адрес устройства, с которым необходимо установить связь, которые тактируются первыми 7-ми тактовыми импульсами (отсюда ограничение на диапазон адресов: 27 = 128 минус нулевой адрес). Следующий бит посылки – это код операции (чтение или запись) и ещё один бит – бит подтверждения (ACK), что ведомое устройство приняло запрос. Если бит подтверждения не пришёл, на этом обмен заканчивается. Или мастер продолжает посылать повторные запросы.

Это проиллюстрировано на рисунке ниже. Задача такая: подключиться к ведомому устройству с адресом 0x27 и передать ему строку «SOLTAU.RU». В первом случае, для примера, отключим ведомое устройство от шины. Видно, что мастер пытается установить связь с устройством с адресом 0x27, но не получает подтверждения (NAK). Обмен заканчивается.

Попытка мастера установить соединение с ведомым по I2C

Теперь подключим к шине I2C ведомое устройство и повторим операцию. Ситуация изменилась. На первый пакет с адресом пришло подтверждение (ACK) от ведомого. Обмен продолжился. Информация передаётся также 9-битовыми посылками, но теперь 8 битов занимают данные и 1 бит – бит подтверждения получения ведомым каждого байта данных. Если в какой-то момент связь оборвётся и бит подтверждения не придёт, мастер прекратит передачу.

Временная диаграмма обмена по протоколу I2C

Получение данных датчика на Arduino UNO

Доступ к ячейкам памяти для запроса и чтения данных датчика через интерфейс I2C осуществляется обычным способом. Читатели, которые программировали Arduino для работы с I2C, узнают этапы,а добавленный скетч будет хорошо прокомментирован для облегчения отслеживания работы программы.

Во-первых, для использования библиотеки I2C вам необходим оператор:

Затем вам необходим I2C адрес PIC микроконтроллера. Он программно установлен в коде MPASM для PIC микроконтроллера в строке:

Этот адрес должен быть сдвинут вправо на один бит, чтобы сформировать адрес, который будет использоваться Arduino. Те, кто знаком с 7-разрядной адресацией I2C, узнают этот часто неудобный шаг. Смещение 0x32 вправо даст нам 0x19, и это будет адрес I2C, который используется Arduinio. Конечно, вы можете установить этот адрес в коде MPASM в любое доступное значение для адреса I2C, которое у вас есть.

Чтобы начать обмен, используйте:

Ниже в качестве примера приведены шаги для выдачи команды считывания датчика #2 (значение переменной было установлено в ):

Задержка в последней строке ждет, пока завершится чтение датчика, и, возможно, она длиннее, чем необходимо, но лучше быть осторожным. Вы можете попробовать уменьшить задержку, если это необходимо для вашего приложения.

На этом этапе данные от датчика DHT22 #2 должны быть в -. Чтобы запросить данные, используем следующее:

Сначала прочитаем байт статуса в .

Проверим, равен ли байт статуса (теперь в ) , что указывает на успешность выполнения команды. Затем получим 5 байтов данных DHT (из -) с помощью следующего кода:

После того, как мы поместили эти данные в программный массив -, мы преобразуем данные во влажность (RH) и температуру и, наконец, проверим совпадает ли контрольная сумма:

Два других датчика DHT22 считываются таким же образом, используя соответствующие коды команд.

Приведенный ниже код скетча примера для Arduino просто считывает все три датчика каждые 5 секунд и отображает данные в мониторе последовательного порта.

Вывод на экран в результате работы тестового скетча Arduino

Выглядит, как попытка обсудить что-то важное в комнате, полной людей…

Чтобы оценить ловкие технические приемы, которые делают I2C настолько эффективной, вам нужно подумать о трудностях достижения надежной, но универсальной связи между несколькими независимыми компонентами. Ситуация достаточно проста, если у вас есть одна микросхема, которая всегда является ведущей (master), и одна микросхема, которая всегда является ведомой (slave). Но что, если у вас есть несколько ведомых? Что если ведомые не знают, кто ведущий? Что, если у вас есть несколько ведущих? Что произойдет, если ведущий запросит данные у ведомого устройства, которое по какой-то причине перестало функционировать? Или что, если ведомый перестал функционировать в середине передачи? Что делать, если ведущий утверждает, что шина осуществляет передачу, а затем он выйдет из строя, прежде чем освободить шину?

Возможные проблемы на шине

Дело в том, что в системе связи такого типа есть много вещей, которые могут пойти не так. Вы должны помнить об этом, когда будете изучать I2C, потому что в противном случае этот протокол будет казаться невыносимо сложным и перегруженным. Дело в том, что эта дополнительная сложность – это то, что позволяет I2C обеспечивать гибкую, расширяемую, надежную и низкоуровневую последовательную связь.

Карта памяти

Мы будем говорить о 32-байтном массиве памяти как о значениях от до . служит местом, куда мастер (Arduino) выдавать команду, и где ведомый (PIC) будет сообщать о состоянии, которое будет считываться мастером. В этом отношении PIC вернет одно из трех значений, описанных в таблице ниже. Эти значению указывают включенное состояние, успешность выполнения допустимой команды и получение недопустимой или неизвестной команды.

Значения состояния
Статус – значение устанавливается микроконтроллером PIC для сообщения о состоянии
0x00 Устройство включено. Кроме того, данное значение устанавливается при программном сбросе микроконтроллера.
0x01 Последняя команда была выполнена успешно.
0xF1 Была запрошена недопустимая (неизвестная) команда.

Arduino будет записывать в значение одной из четырех возможных команд, описанных ниже. Они указывают PIC микроконтроллеру о необходимости либо прочитать показания одного из датчиков DHT, либо перезагрузиться.

Значения команд
Команда – значение устанавливается платой Arduino для выдачи команды
0x02 Прочитать показания датчика DHT #1
0x03 Прочитать показания датчика DHT #2
0x04 Прочитать показания датчика DHT #3
0x10 Выполнить программную перезагрузку PIC микроконтроллера

Когда команда о считывании показаний датчика была получена, путем записи в значения , или , и PIC микроконтроллер вернул статус об успешном выполнении, путем записи в значения , данные будут доступны для Arduino путем считывания массива памяти.

DHT22 возвращает 5 байтов, чтобы показать влажность (относительную влажность воздуха или RH) и температуру (в градусах Цельсия) следующим образом: RH целая часть, RH часть после десятичной запятой, температура целая часть, температура часть после десятичной запятой и контрольная сумма, которая представляет собой сумму всех четырех байтов AND 255. Эти 5 байтов будут записаны в разные ячейки в памяти PIC микроконтроллера после команд чтения датчиков. Ячейки – не используются, и свободная память в них доступна для пользовательского использования.

Карта хранения информации данных датчиков
Распределение места в Array – значения устанавливаются микроконтроллером PIC для чтения платой Arduino
Датчик DHT #1: RH целая часть, RH часть после десятичной запятой, температура целая часть, температура часть после десятичной запятой и контрольная сумма
Датчик DHT #2: RH целая часть, RH часть после десятичной запятой, температура целая часть, температура часть после десятичной запятой и контрольная сумма
Датчик DHT #3: RH целая часть, RH часть после десятичной запятой, температура целая часть, температура часть после десятичной запятой и контрольная сумма
Доступно для использования

И последняя команда, , вызывает программную перезагрузку микроконтроллера PIC12F1840. Обычно в использовании данной команды нет необходимости, но она может быть полезна в случае неожиданных ситуаций.

Разница между SPI, I2C и UART тремя протоколами последовательной шины:

Первый, разница, конечно же, в названии:

SPI (последовательный периферийный интерфейс: последовательный периферийный интерфейс);

     I2C(INTER IC BUS)

UART (универсальный асинхронный приемный передатчик: универсальный асинхронный приемный передатчик)

Во-вторых, разница заключается в линии электрического сигнала:

     Шина SPI состоит из трех сигнальных линийСостав: последовательные часы (SCLK), последовательный вывод данных (SDO), последовательный ввод данных (SDI). Шина SPI может соединять несколько устройств SPI друг с другом. Устройство SPI, которое обеспечивает последовательные часы SPI, является ведущим или ведущим SPI, а другие устройства являются ведомыми или ведомыми (ведомыми) SPI. Полнодуплексная связь может быть реализована между ведущими и ведомыми устройствами.При наличии нескольких ведомых устройств может быть добавлена ​​строка выбора ведомого устройства.

Если вы используете универсальный порт ввода-вывода для имитации шины SPI, у вас должен быть выходной порт (SDO), входной порт (SDI), а другой порт зависит от типа реализованного устройства.Если вы хотите реализовать устройство ведущее-ведомое, вам понадобится порт ввода и вывода. , Если реализовано только ведущее устройство, порта вывода достаточно; если реализовано только ведомое устройство, требуется только порт ввода.

Шина I2C — это стандарт двустороннего, двухпроводного (SCL, SDA), последовательного интерфейса и интерфейса с несколькими ведущими устройствами.Он имеет механизм арбитража шины и очень подходит для передачи данных между устройствами на короткие расстояния и нечасто. В его системе протокола адрес устройства-получателя всегда переносится при передаче данных, поэтому может быть реализована сеть устройств.

Если порт ввода-вывода общего назначения используется для имитации шины I2C и достижения двунаправленной передачи, требуется порт ввода-вывода (SDA), а также порт вывода (SCL). (Примечание: данные I2C относительно плохо изучены, описание здесь может быть очень неполным)

     Шина UART — это асинхронный последовательный портСледовательно, он, как правило, намного сложнее, чем структура первых двух синхронных последовательных портов. Он обычно состоит из генератора скорости передачи (генерируемая скорость передачи в 16 раз больше скорости передачи), приемника UART и передатчика UART.На оборудовании есть два провода: один для отправки, а другой для приема.

Очевидно, что если универсальный порт ввода-вывода используется для моделирования шины UART, требуются один входной порт и один выходной порт.

В-четвертых, посмотрите на мнение быдла!

Wudanyu: Количество линий I2C меньше. Я думаю, что он более мощный, чем UART и SPI, но технически более проблематичный, потому что I2C требует поддержки двунаправленного ввода-вывода иИспользуйте подтягивающий резистор, Я думаю, что способность к помехам слабая, обычно используется для связи между чипами на одной плате и меньше используется для междугородной связи. Реализация SPI проще. UART требует фиксированной скорости передачи данных, что означает, что интервал между двумя битами данных должен быть одинаковым. SPI не имеет значения, потому что это синхронизированный протокол.

Quickmouse: скорость I2C немного ниже, чем у SPI, и протокол немного сложнее, чем SPI, но соединение меньше, чем у стандартного SPI.

Заключение

В данной статье рассмотрены важные детали I2C, которые влияют на разработку программного или низкоуровнего аппаратного обеспечения. Если ваш микроконтроллер включает аппаратные модули I2C или SMBus, то некоторые детали реализации будут обрабатываться автоматически. Хотя это и удобно, но не оправдывает безграмотность потому, что вам всё равно нужно знать хотя бы немного (и, возможно, немного больше) о том, как на самом деле работает I2C. Кроме того, если вы когда-нибудь окажетесь на необитаемом острове без аппаратных модулей I2C, представленная здесь информация поможет вам на пути к разработке чисто программных I2C функций (с так называемой побитовой обработкой).