- Что такое протокол связи I2C?
- Как работает связь I2C?
- Где использовать связь I2C?
- I2C в MSP430: управление цифровым потенциометром AD5171
MSP430 - это мощная платформа, предоставляемая Texas Instruments для встраиваемых проектов, ее универсальный характер позволил найти пути во многие приложения, и эта фаза все еще продолжается. Если вы следовали нашим руководствам по MSP430, то вы бы заметили, что мы уже рассмотрели широкий спектр руководств по этому микроконтроллеру, начиная с самых основ. С этого момента мы рассмотрели основы и можем перейти к более интересным вещам, таким как коммуникационный портал.
В огромной системе встроенных приложений ни один микроконтроллер не может выполнять все действия самостоятельно. На определенном этапе он должен связаться с другими устройствами для обмена информацией, существует множество различных типов протоколов связи для обмена этой информацией, но наиболее часто используемые из них - это USART, IIC, SPI и CAN. У каждого протокола связи есть свои преимущества и недостатки. Давайте сосредоточимся на части I2C, так как это то, что мы собираемся изучить в этом руководстве.
Что такое протокол связи I2C?
Термин IIC расшифровывается как « Inter Integrated Circuits ». Обычно он обозначается как I2C, или я в квадрате C, или даже как протокол 2-проводного интерфейса (TWI) в некоторых местах, но все это означает то же самое. I2C - это протокол синхронной связи, означающий, что оба устройства, которые обмениваются информацией, должны использовать общий тактовый сигнал. У него есть только два провода для обмена информацией, один из которых используется для сигнала петли, а другой - для отправки и приема данных.
Как работает связь I2C?
Связь I2C была впервые представлена Филлипсом. Как было сказано ранее, у него два провода, эти два провода будут подключены к двум устройствам. Здесь одно устройство называется ведущим, а другое - ведомым. Связь должна и всегда будет происходить между двумя ведущим и ведомым. Преимущество связи I2C в том, что к ведущему можно подключить более одного ведомого устройства.
Полная связь осуществляется через эти два провода, а именно последовательные часы (SCL) и последовательные данные (SDA).
Последовательные часы (SCL): разделяет тактовый сигнал, генерируемый ведущим устройством, с ведомым устройством
Последовательные данные (SDA): отправляет данные между ведущим и ведомым.
В любой момент времени только мастер может инициировать обмен данными. Поскольку на шине более одного ведомого устройства, ведущее устройство должно обращаться к каждому ведомому устройству, используя разные адреса. При обращении только ведомое устройство с этим конкретным адресом ответит с информацией, в то время как остальные продолжат выход. Таким образом, мы можем использовать одну и ту же шину для связи с несколькими устройствами.
На уровнях напряжения I2C не предопределены. Связь I2C является гибкой, это означает, что устройство, которое питается от 5 В, может использовать 5 В для I2C, а устройства 3,3 В могут использовать 3 В для связи I2C. Но что, если двум устройствам, которые работают от разных напряжений, необходимо обмениваться данными с помощью I2C? Шина I2C 5V не может быть связана с 3.3V устройства. В этом случае используются переключатели напряжения для согласования уровней напряжения между двумя шинами I2C.
Есть некоторый набор условий, которые определяют транзакцию. Инициализация передачи начинается с заднего фронта SDA, который определяется как состояние «START» на диаграмме ниже, когда ведущий оставляет SCL высоким, а SDA устанавливает низкий.
Как показано на приведенной ниже диаграмме, Задний фронт SDA - это аппаратный триггер для условия START. После этого все устройства на одной шине переходят в режим прослушивания.
Таким же образом нарастающий фронт SDA останавливает передачу, что показано как состояние «STOP» на диаграмме выше, когда ведущее устройство оставляет SCL на высоком уровне, а также отпускает SDA для перехода в HIGH. Таким образом, нарастающий фронт SDA останавливает передачу.
Бит R / W указывает направление передачи следующих байтов, если он HIGH, значит, ведомый будет передавать, а если он низкий, значит, что мастер будет передавать.
Каждый бит передается в каждом тактовом цикле, поэтому для передачи байта требуется 8 тактовых циклов. После каждого отправленного или полученного байта удерживается девятый тактовый цикл для ACK / NACK (подтвержден / не подтвержден). Этот бит ACK генерируется ведомым или ведущим устройством в зависимости от ситуации. Для бита ACK, SDA устанавливается на низкий уровень ведущим или ведомым устройством в 9- м тактовом цикле. Таким образом, он считается ACK, в противном случае - NACK.
Где использовать связь I2C?
Связь I2C используется только для связи на короткие расстояния. Он определенно надежен до некоторой степени, так как он имеет синхронизированный тактовый импульс, что делает его умным. Этот протокол в основном используется для связи с датчиком или другими устройствами, которые должны отправлять информацию мастеру. Это очень удобно, когда микроконтроллер должен взаимодействовать со многими другими подчиненными модулями, используя как минимум только провода. Если вы ищете связь на большие расстояния, вам следует попробовать RS232, а если вы ищете более надежную связь, вам следует попробовать протокол SPI.
I2C в MSP430: управление цифровым потенциометром AD5171
Energia IDE - одно из самых простых программ для программирования MSP430. Это то же самое, что и Arduino IDE. Вы можете узнать больше о начале работы с MSP430 с помощью Energia IDE здесь.
Итак, чтобы использовать I2C в Energia IDE, нам нужно просто включить файл заголовка wire.h. Объявление вывода (SDA и SCL) находится внутри библиотеки проводов, поэтому нам не нужно объявлять в функции настройки .
Примеры примеров можно найти в меню «Примеры» среды IDE. Один из примеров поясняется ниже:
В этом примере показано, как управлять цифровым потенциометром AD5171 компании Analog Devices, который обменивается данными через синхронный последовательный протокол I2C. Используя библиотеку проводов I2C от MSP, цифровой горшок пройдет через 64 уровня сопротивления, погаснув светодиод.
Во-первых, мы включим библиотеку, отвечающую за связь i2c, т.е. библиотеку проводов.
#включают
В функции настройки мы инициируем библиотеку проводов функцией .begin () .
пустая настройка () { Wire.begin (); }
Затем инициализируйте переменную val для хранения значений потенциометра.
байт val = 0;
В функции цикла мы начнем передачу на ведомое устройство i2c (в данном случае цифровой потенциометр IC), указав адрес устройства, который указан в техническом описании IC.
void loop () { Wire.beginTransmission (44); // передаем на устройство №44 (0x2c)
Затем поместите байты в очередь, то есть данные, которые вы хотите отправить в IC для передачи с помощью функции write () .
Wire.write (байт (0x00)); // отправляет байт инструкции Wire.write (val); // отправляет байт значения потенциометра
Затем передайте их, вызвав endTransmission () .
Wire.endTransmission (); // прекращаем передачу val ++; // увеличить значение if (val == 64) {// если достигнута 64-я позиция (макс.) val = 0; // начать с наименьшего значения } delay (500); }