Как настроить i2c-связь на arduino
Содержание
Введение в спецификацию
Для современных приложений 8-битного управления, в которых используются микроконтроллеры, предусматривается возможность установки некоторых конструкторских критериев:
- полная система в преимущественном большинстве случае включает в себя один микроконтроллер и прочие периферийные устройства, в том числе память и всевозможные порты ввода/вывода;
- общая стоимость объединения различных устройств внутри одной системы должна быть предельно минимизирована;
- система, на которую возлагаются функции управления, не предусматривает необходимость в обеспечении высокоскоростной передачи информации;
- общая эффективность непосредственно зависит от выбранного оборудования, а также от природы соединяющей шины.
Для разработки системы, полностью соответствующей перечисленным критериям, нужно использовать шину, в которой будет использоваться последовательный интерфейс I2C. Несмотря на то что в последовательной шине нет пропускной способности параллельных, ей требуется меньшее количество соединений, а также меньше контактов микросхем. При этом не стоит забывать о том, что шина включает в себя не только соединяющие провода, но еще и различные процедуры и форматы, необходимые для обеспечения связи внутри системы.
Устройства, для связи которых используется программная эмуляция интерфейса I2C или соответствующая шина, должны иметь определенный протокол, который позволяет упредить различные возможности столкновений, потери или же блокирования информации. У быстрых устройств должна быть возможность связаться с медленными, и при этом система не должна зависеть от подключенного к ней оборудования, так как в противном случае все улучшения и модификации не смогут быть использованы. Также нужно разрабатывать процедуру, с помощью которой реально установить, какое конкретно устройство на данный момент обеспечивает управление шиной и в какой момент времени. Помимо этого, если различные устройства, имеющие разные тактовые частоты, подключены к одной шине, нужно определиться с источником ее синхронизации. Всем этим критериям соответствует I2C интерфейс для AVR и любые другие из этого перечня.
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.
5Управление устройством по шине IIC
Рассмотрим диаграммы информационного обмена с цифровым потенциометром AD5171, представленные в техническом описании:
Рассмотрим диаграммы чтения и записи цифрового потенциометра AD5171
Нас тут интересует диаграмма записи данных в регистр RDAC. Этот регистр используется для управления сопротивлением потенциометра.
Откроем из примеров библиотеки «Wire» скетч: Файл Образцы Wire digital_potentiometer. Загрузим его в память Arduino.
#include <Wire.h> // подключаем библиотеку "Wire" byte val = 0; // значение для передачи потенциометру void setup() { Wire.begin(); // подключаемся к шине I2C как мастер } void loop() { Wire.beginTransmission(44); // начинаем обмен с устройством с I2C адресом "44" (0x2C) Wire.write(byte(0x00)); // посылаем инструкцию записи в регистр RDAC Wire.write(val); // задаём положение 64-позиционного потенциометра Wire.endTransmission(); // завершаем I2C передачу val++; // инкрементируем val на 1 if (val == 63) { // по достижении максимума потенциометра val = 0; // сбрасываем val } delay(500); }
После включения вы видите, как яркость светодиода циклически нарастает, а потом гаснет. При этом мы управляем потенциометром с помощью Arduino по шине I2C.
По ссылкам внизу статьи, в разделе похожих материалов (по тегу), можно найти дополнительные примеры взаимодействия с различными устройствами по интерфейсу IIC, в том числе примеры чтения и записи.
1Описание функционала работы с I2C библиотеки libMPSSE.dll
Устройство FTDI (устройство производства фирмы Future Technology Devices International – FTDI) в режиме I2C может быть только ведущим. Для работы с последовательным интерфейсом IIC в библиотеке libMPSSE.dll имеются методы, перечисленные в следующей таблице:
Название функции | Описание |
---|---|
I2C_GetNumChannels() | Возвращает число I2C каналов, подключённых к компьютеру |
I2C_GetChannelInfo() | Возвращает информацию о заданном канале |
I2C_OpenChannel() | Открывает канал в режиме I2C |
I2C_InitChannel() | Инициализирует канал заданными настройками |
I2C_CloseChannel() | Закрывает канал |
I2C_DeviceRead() | Запрашивает у ведомого устройства заданное число байтов |
I2C_DeviceWrite() | Отправляет в ведомое устройство заданное число байтов |
GPIO
Преимущества для технологов
Стоит отметить, что не только конструкторы, но и технологи достаточно часто в последнее время начали использовать специализированный I2C интерфейс. Описание на русском указывает довольно широкий диапазон достоинств, которые обеспечиваются этой категории специалистов:
- Стандартная двухпроводная последовательная шина с таким интерфейсом позволяет минимизировать соединения между микросхемами, то есть в них присутствует меньше контактов и требуется меньшее количество дорожек, благодаря чему печатные платы становятся не такими дорогими и имеют гораздо меньшие габариты.
- Полностью интегрированный I2C интерфейс LCD1602 или какой-то другой вариант полностью устраняет необходимость в использовании дешифраторов адреса, а также другой внешней мелкой логике.
- Предусматривается возможность использования одновременно нескольких ведущих на такой шине, благодаря чему существенно ускоряется тестирование и последующая настройка оборудования, так как шина может быть подключена к компьютеру сборочной линии.
- Доступность совместимых с этим интерфейсом микросхем в VSO, SO и специализированном DIL-корпусе позволяет существенно снизить требования к размеру устройства.
Это только краткий список преимуществ, которыми отличается I2C интерфейс LCD1602 и другие. Кроме того, совместимые микросхемы позволяют значительно увеличить гибкость используемой системы, обеспечивая предельно простое конструирование различных вариантов оборудования, а также относительно легкую модернизацию для дальнейшей поддержки разработки на современном уровне. Таким образом, можно разработать целое семейство различного оборудования, используя в качестве основы определенную базовую модель.
Дальнейшая модернизация оборудования и расширение его функций могут осуществляться посредством стандартного подключения к шине соответствующей микросхемы, использующей 2C интерфейс Arduino или какой-нибудь другой из доступного перечня. Если требуется обеспечение большей ПЗУ, то в таком случае достаточно будет только выбрать другой микроконтроллер, имеющий увеличенный объем ПЗУ. Так как обновленные микросхемы при необходимости способны полностью заместить старые, можно запросто добавлять новые свойства в оборудование или повышать его общую производительность посредством обычного отсоединения уже устаревших микросхем и дальнейшей замены их на более новое оборудование.
Introduction to I2C Communication
I2C combines the best features of SPI and UARTs. With I2C, you can connect multiple slaves to a single master (like SPI) and you can have multiple masters controlling single, or multiple slaves. This is really useful when you want to have more than one microcontroller logging data to a single memory card or displaying text to a single LCD.
Like UART communication, I2C only uses two wires to transmit data between devices:
SDA (Serial Data) – The line for the master and slave to send and receive data.
SCL (Serial Clock) – The line that carries the clock signal.
I2C is a serial communication protocol, so data is transferred bit by bit along a single wire (the SDA line).
Like SPI, I2C is synchronous, so the output of bits is synchronized to the sampling of bits by a clock signal shared between the master and the slave. The clock signal is always controlled by the master.
Преимущества для конструкторов
Интерфейс I2C, а также все совместимые микросхемы позволяют существенно ускорить процедуру разработки, от функциональной схемы до ее конечного прототипа. При этом стоит отметить, что за счет возможности подключения таких микросхем непосредственно к шине без использования всевозможных дополнительных цепей обеспечивается простор для дальнейшей модернизации и модификации системы прототипа посредством отключения и подключения от шины различных устройств.
Есть масса преимуществ, которые выделяют интерфейс I2C. Описание, в частности, позволяет увидеть следующие достоинства для конструкторов:
- Блоки на функциональной схеме всецело соответствуют микросхемам, и при этом обеспечивается достаточно быстрый переход от функциональных к принципиальным.
- Нет никакой необходимости заниматься разработкой шинных интерфейсов, потому что шина уже изначально интегрирована в специальные микросхемы.
- Интегрированные протоколы передачи информации и адресация устройств предоставляют системе возможность быть полностью программно определяемой.
- Одинаковые типы микросхем при необходимости можно использовать в абсолютно разных приложениях.
- Общее время разработки существенно снижается за счет того, что конструкторы довольно быстро могут ознакомиться с наиболее часто используемыми функциональными блоками, а также всевозможными микросхемами.
- При желании можно добавлять или убирать из системы микросхемы, и при этом не оказывать особого влияния на прочее оборудование, подключенное к одной шине.
- Общее время разработки программного обеспечения можно значительно снизить за счет того, что здесь допускается применение библиотеки повторно применяемых программных модулей.
Помимо всего прочего, стоит отметить предельно простую процедуру диагностики возникших сбоев и дальнейшую отладку, которой отличается интерфейс I2C. Описание говорит о том, что при необходимости можно безо всякого труда моментально отслеживать даже незначительные отклонения в работе такого оборудования и, соответственно, принимать соответствующие меры. Также стоит отметить, что конструкторы получают специальные решения, которые, в частности, являются довольно привлекательными для различного портативного оборудования и систем, предусматривающих батарейное питание, используя I2C интерфейс. Описание на русском также указывает на то, что его применение позволяет обеспечить следующие немаловажные достоинства:
- Достаточно высокую степень устойчивости к любым возникающим помехам.
- Предельно низкое потребление энергии.
- Широчайший диапазон питающего напряжения.
- Широкий температурный диапазон.
5 ответов
14
Для быстрого режима и подтягивания резистора емкость должна быть меньше 200 пФ, в соответствии с этим Документом NXP Спецификация I2C-шины и руководство пользователя .
С текущими источниками вы можете перейти на 400pF, но не с резисторами.
Если ваш провод составляет 20pF /30 см, и у вас есть еще 50pF от паразитной и входной емкости, вы ограничены длиной кабеля 2,25 м. Различные предположения приведут к разным числам.
13
Длины безумного звучания, такие как 10,25 и 100 м, вполне возможны, и я часто использую этот метод (с UART не I2C, но метод стоит), когда мне нужно быстро собрать вещи. Однако это не самый лучший способ.
Ключ должен знать порог входного напряжения. Убедитесь, что падение напряжения в проводке заземления значительно ниже этого, или передатчик с высоким потенциалом заземления не сможет достаточно сильно натянуть напряжение. Отсутствие толерантности к смещениям земли IMHO является самой большой причиной использования RS485 или может трансиверы (I2C over CAN упоминается в нескольких примечаниях к применению).
В идеале, все устройства будут иметь свою собственную бородавку и батарею, и никакая энергия не будет передаваться через провод заземления между устройствами.
Но, давайте возьмем CAT5, например. CAT5 не может быть выше 52pf /m, или это не CAT5.
100 м кабеля 52pf имеют емкость 5200pf или 5.2nf.
5.2n раз 20kohms (pullup) дает постоянную времени около 104 микросекунд. Это ограничивает скорость примерно до 10 кГц или около того.
Используя подтягивания 2.2kohm, вы, вероятно, можете добраться до 100 кГц.
Я слышал, что устройства должны иметь резистор на SDL и SCK из-за большой емкостной нагрузки, которой они управляют, примерно 180 или 200 Ом.
Но, честно говоря, I2C — это вовсе не путь на большие расстояния. CAN-трансиверы или RS485, используемые с обычным UART, — это надежное решение с очень хорошей защитой от отказа, сопротивлением ESD, скоростью, расстоянием и т. Д., При стоимости доллара или чипе, смещения земли не имеют значения почти так же, как и вы свободно переносить электроэнергию вместе с данными.
Единственным недостатком является то, что трансивер может доставлять 70 мс и 1 или 2ma только прослушивание, поэтому I2C или прямой TTL UART могут быть полезны в экстремальных ситуациях с низким энергопотреблением, но подумайте, сколько времени вы фактически тратите на отправку.
6
Я работаю в компании, создающей USB-датчики. Большинство из них основаны на чипах датчиков I2C, эти устройства могут быть разделены на две части, поэтому вы можете установить процессорную часть в одном месте, а сенсорную часть — в другую. Мы провели довольно много тестов на подключении I2C между процессором устройства и датчиками I2C. На частоте 100 кГц, с хорошим протоколом восстановления ошибок, 25 м можно легко получить с помощью основных проводов. Мы даже смогли достичь 100 м один раз с помощью кабеля CAT5.
4
Что-то вроде P82B96 от NXP можно использовать для изменения уровней напряжения на шине, что позволяет значительно увеличить расстояния.
Существуют и другие чипы с аналогичной функциональностью.
3
IIC — это синхронный протокол и, как таковой, он может запускаться произвольно медленно, чтобы соответствовать системным требованиям относительно расстояния и шума.