Перейти к содержимому

Sda scl что это

  • автор:

I²C — Inter-Integrated Circuit, краткое руководсто

I²C (и-квадрат-це, ай-ту-си, ай-сквэрд-си), Inter-Integrated Circuit — последовательная шина обмена данными между интегральными схемами. Изобретена и в начале 80-х компанией Philips Semiconductor (теперь NXP), передача данных осуществляется по двум проводам в обе стороны. Ведущий и ведомый могут выполнять как роль приёмника, так и передатчика. Для возможности соединения более двух устройств используются адресация. Опрашивать адреса шины может только ведущий. Адрес последовательно выводится на линию SDA сразу после сигнала Start. В этой статье речь пойдёт только о 7-ми битной адресации, так же не будет затронута тема нескольких ведущих. На каждом устройстве, поддерживающем I²C обычно обозначены два вывода: SDA и SCL. SDA (serial data) — означает последовательные данные, SCL (serial clock) — последовательное тактирование. Эти выводы являются выводами открытого коллектора или открытого стока, это означает что ведущий и ведомый могут только притягивать электрический потенциал к земле, поэтому на каждой линии должны быть подтягивающие резисторы. Сопротивление резисторов рассчитывается в зависимости от паразитной ёмкости линии.

Подключение:

Шина поддерживает подключение до 112 устройств (при 7-ми битной адресации) по двум проводам (плюс GND и Vcc), может иметь несколько ведущих и ведомых. При использовании нескольких ведущих, каждый из них должен поддерживать этот режим и уметь определять состояние занятой шины.

I²C на Arduino

Arduino UNO R3/Piranha UNO

На Arduino UNO R3/Piranha UNO шина I2C находится на выводах A4, A5. Также в эти выводы продублированы на колодке с цифровыми выводами рядом с кнопкой Reset.

Piranha ULTRA

На Piranha ULTRA шина I²C не занимает аналоговые выводы A4, A5 и находится на цифровой колодке рядом с кнопкой Reset, выводы обозначены SDA и SCL

Arduino MEGA R3

На Arduino MEGA R3 шина I²C находится на цифровой колодке на крайних выводах, близких к разъёму USB и на выводах 20, 21. Выводы объединены.

Примеры для Arduino

Работа с шиной с использованием встроенной библиотеки Wire Arduino IDE на примере Trema-модуля LED Матрицы 8×8 — i2c

#include // Подключаем библиотеку Wire для работы с шиной I2C. const int ADDRESS = 0x09; // Определяем адрес ведомого const int REG_DATA = 0x10; // Определяем адрес регистра REG_DATA. const int REG_ROW_1 = 0x11; // Определяем адрес регистра ROW_1. byte IMAGE[8] = ; // void setup() < // Wire.setClock(100000L); // Устанавливаем скорость передачи данных по шине I2C. Wire.begin(); // Инициируем работу c шиной I2C в качестве мастера. delay(500); // Wire.beginTransmission(ADDRESS); // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся. Wire.write(REG_ROW_1); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра ROW_1. Wire.write(IMAGE, 8 ); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это 8 байт массива IMAGE. Wire.endTransmission(); // Выполняем инициированную ранее передачу данных. >// // void loop()< // // >

В этом примере на матрицу выводится изображение стрелки. Стоит заметить, ко всем нашим модулям написаны библиотеки с высокоуровневым интерфейсом и вовсе не обязательно работать с матрицей на низком уровне. Подробнее о работе с библиотекой матрицы можно узнать по этой ссылке.

I²C на Raspberry Pi

На Raspberry Pi I²C выводы это 3-й и 5-й выводы колодки, GPIO2 и GPIO3 по номенклатуре BCM и выводы 8, 9 по номенклатуре WiringPi.

Примеры для Raspberry

Работа с шиной с использованием модуля smbus для Python на примере Trema-модуля Матрицы 8×8 — i2c. Для работы с шиной её необходимо включить в настройках Raspberry при помощи утилиты raspi-config . Ссылка на подробное описание как это сделать.

# Импортируем модуль Python import smbus # Создаём объект для работы с шиной # 0: "/dev/i2c-0", 1: "/dev/i2c-1" bus = smbus.SMBus(1) # Адрес ведомого на шине ADDRESS = 0x09; # Регистр первого ряда светодиодов матрицы REG_ROW_1 = 0x11; # Список с изображением стрелки в двоичной записи IMAGE = [ 0b00000000, 0b00011000, 0b00111100, 0b01111110, 0b00011000, 0b00011000, 0b00011000, 0b00000000, ] # Команда вывода данных на шину. bus.write_i2c_block_data(ADDRESS, REG_ROW_1, IMAGE)

Так же как и в примере с Arduino, в этом примере на матрицу выводится изображение стрелки. Стоит заметить, к Trema-модулю LED Матрица 8×8 — i2c написана библиотека с высокоуровневым интерфейсом и вовсе не обязательно работать с матрицей на низком уровне. Подробнее о работе с библиотекой матрицы можно узнать по этой ссылке

Подробнее о шине I²C:

Резисторы, ёмкость и длина линий шины

В официальном описании от NXP ничего не сказано о максимальной длине шины, но не стоит этим злоупотреблять. Шина была придумана для обмена информации между интегральными схемами в пределах одной платы одного устройства. В расчёт бралась только паразитная ёмкость линии, которая сказывается на скорости нарастания фронта волны. От этой ёмкости зависит номинал подтягивающих резисторов. Можно подобрать резисторы так, чтобы фронт волны нарастал согласно спецификации и при 100-метровой длине проводов, но это не избавляет от помех, которые влечёт за собой несимметричная электрическая реализация. Опять же, при слишком маленьком сопротивлении качество сигнала улучшается, но при этом растёт ток который необходимо пропускать устройствам через выводы для притяжки линий.

При использовании шины на модулях не существует принятого стандарта установки подтягивающих резисторов на ведущем или ведомом. У Arduino подтягивающие резисторы отсутствуют и для работы с шиной нужен хотя бы один модуль с ними. У Raspberry Pi на плате установлены подтягивающие резисторы номиналом 1,7 килоОм и для неё нет необходимости в подтяжке на модулях.

Сигналы и специальные биты шины

В состоянии покоя линии шины находятся на верхнем потенциале (обычно 3,3 В или 5 В, но могут быть и другие напряжения). Бездействие устройства, по умолчанию, воспринимается как логическая 1. Для простоты понимания можно рассмотреть аналогию: Вообразим верхний потенциал как уровень воды, а нижний как дно. Представьте, что Вы на рыбалке — попловок в состоянии покоя остаётся на поверхности, когда клюёт — идёт ко дну. Так же и в здесь, при обмене данными линии прижимаются в нулевому потециалу. Далее рассмотрим поочереди сингалы и специальные биты.

Устанавливаемые только ведущим

  • Start — сигнал начала обмена данными. Линия тактирования SCL отпущена (логическая 1), ведущий пижимает линию данных SDA (переход из логической 1 в логический 0). После этого обмен данными происходит побайтово. Первый байт — семь бит адреса ведомого и бит направления (запись или чтение). Последующие байты — данные. после этого сигнала шина считается занятой.

Краткое обозначание сигнала S — заглавная буква S латинского алфавита.

SDA (данные) S, биты: 1 2 3 4 5 6 7 R/W̅ ___________________ _____ _____ _____ _____ _____ _____ _____ _____ ___ \____/_____X_____X_____X_____X_____X_____X_____X_____\_______/ SCL (такт.) | ______________________ __ __ __ __ __ __ __ __ __ ____ | \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ | Start: переход SDA из 1 в 0, линия SCL отпущена 
  • Бит Read — Если ведущий желает получить данные, он устанавливает логическую 1 сразу после адреса, информируя ведомого о том, что данные будут считываться (управление линией данных передаётся ведомому).

Краткое обозначание R — заглавная буква R латинского алфавита.

SDA (данные) S, биты: 1 2 2 4 5 6 7 R ___________________ _____ _____ _____ _____ _____ _____ _____ _____ ___ \____/_____X_____X_____X_____X_____X_____X_____/ | \_______/ SCL (такт.) | ______________________ __ __ __ __ __ __ __ __ __ ____ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/| \__/ \__/ | Read: после 7-бит адреса линия SDA отпущена 
  • Бит Write — Если ведущий желает записать данные, он устанавливает логический 0 сразу после адреса для информирования ведомого о том что данные будут записываться (управление линией данных остаётся у ведущего).

Краткое обозначение — заглавная буква W латинского алфавита с чертой сверху.

SDA (данные) S, биты: 1 2 3 4 5 6 7 W̅ ___________________ _____ _____ _____ _____ _____ _____ _____ ___ \____/_____X_____X_____X_____X_____X_____X_____\_____________/ SCL (такт.) | ______________________ __ __ __ __ __ __ __ __ __ ____ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/| \__/ \__/ | Write: после 7-бит адреса линия SDA прижата 
  • Stop — сигнал окончания обмена данными. Ведущий прекращат тактирование, линия тактирования SCL отпущена (логическая 1), линия данных SDA переведена ведущим из логического 0 в логическую 1. После этого сигнала шина считается свободной.

Краткое обозначение P — заглавная буква P латинского алфавита.

SDA (данные) A . байт.данных. A P _ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ ___ _X_____X_____X_____\____/_____X_____X_____X_____X_____X_____X_____X_____\_______/ SCL (такт.) | __ __ __ __ __ __ __ __ __ __ __ __ __ ____ _/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/| | Stop: переход SDA из 0 в 1, линия SCL отпущена 
  • Restart — сигнал продолжения обмена данными (используется взамен сигналу Stop с последующим Start для продолжения опрашивания шины ). Используется в основном при наличии нескольких ведущих на шине, чтобы управление не перешло другому ведущему после сигнала Stop. Линия тактирования SCL отпущена ведущим, линия данных SDA переведена ведущим из логической 1 в логический 0.

Обозначается Sr — заглавная буква S и строчная буква r латинского алфавита.

SDA (данные) A . биты данных. A Sr _ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ __ _X_____X_____X_____\____/_____X_____X_____X_____X_____X_____X_____X_____\_____/ \__ SCL (такт.) | __ __ __ __ __ __ __ __ __ __ __ __ __ ____ _/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ | | Restart: переход SDA из 1 в 0, линия SCL отпущена 

Устанавливаемые ведущим и ведомым

Данные биты может устанавливат как ведущий, так и ведомый. В такой ситуации устанавливающее устройство или модуль (ведущий или ведомый) называют передатчиком, а считывающее устройство — приёмником.

  • Бит ACK — (сокращ. англ. acknowledged — подтверждено) каждый девятый импульс тактирования передатчик (ведущий или ведомый) отпускает линию данных. Если линия была прижата приёмником (логический 0) — принятые данные верны, передача может быть продолжена или закончена.

Обозначается A — заглавная буква A латинского алфавита

SDA (данные) A . биты данных. A _ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ __ _X_____X_____X_____\____/_____X_____X_____X_____X_____X_____X_____X_____\_____/ \__ SCL (такт.) | | __ __ __ __ __ __ __ __ __ __ __ __ __ ____ _/ \__/ \__/ \__/ |\__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/| \__/ | | ACK: девятый импульс тактирования --------------------------^ линия SDA прижата ведомым (логический 0) 
  • Бит NACK — (сокращ. англ. not acknowledged — не подтверждено) каждый девятый импульс тактирования передатчик (ведущий или ведомый) отпускает линию данных. Если линия была отпущена принимающим или принимающего нет на шине (логическая 1) — принятые данные неверны, произошла ошибка, передача не может быть продолжена. Обозначается A̅ — заглавная буква A латинского алфавита с чертой сверху.
SDA (данные) S . биты данных или адреса. A̅ S ___________________ _____ _____ _____ _____ _____ _____ _____ _____ ____ _ \____/_____X_____X_____X_____X_____X_____X_____X_____/ | \____/ SCL (такт.) | ______________________ __ __ __ __ __ __ __ __ __ ____ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/| \__/ | NACK: девятый импульс тактирования линия SDA отпущена принимающим (логическая 1) 

Обмен данными

При обмене данными тактированием занимается только ведущий, а ведомый может удерживать линию тактирования только если не успевает за ведущим, так называемое растягивание тактирования (clock-stretching). Не все модули поддерживают удержание. Установка бита на линии данных может происходит в момент, когда линия тактирования прижата, а считывания, когда линия отпущена (подтянута к Vcc), но в большинстве случаев это происходит по фронту волны на линии тактирования.

SDA (данные) ___________________ _____ _____ _____ _____ _____ _____ _____ _____ ___ \____/_____X_____X_____X_____X_____X_____X_____X_____\_______/ SCL (тактирование) | | ______________________ | __ __ __ __ __ __ __ __ __ ____ \__/ |\__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ | | | | | Считывание Установка 

Рассмотрим пример простого обмена данными:

Запись в регистры ведомого. Данные взяты из примеров, приведённых выше.

S | 0x09 | W̅ | A | 0x11 | A | 0x00 | A |0x18|A|0x3C|A|0x7E|A|0x18|A|0x18|A|0x00|A| P | | | | | | | | | | Адрес | Подтв. | Подтв. | . | | | | | | Старт Запись Регистр Данные Стоп

После сигнала Start и указания адреса ведущий записывает адрес регистра с которого будет производиться дальнейшая запись. Стоит заметить, что у ведомого есть внутренний счётчик и каждый последующий байт после подтверждения будет записан в следующий регистр. Таким образом байт со значением 0x00 будет записан в регистр 0x11, байт со значением 0x18 будет записан в регистр 0x12, байт со значением 0x3C будет записан в регистр 0x13 и т. д. В этом примере биты ACK устанавливает ведомый.

Вот так сигналы этого примера выглядят на осциллографе:

  • Канал 1 — тактирование (SCL)
  • Канал 3 — данные (SDA)
  • Линия B1 — декодирование данных осциллографом

Чтение из регистров ведомого. Предположим, мы хотим прочитать байт из регистра 0x13.

 S | 0x09 | W̅ | A | 0x13 | Sr | 0x09 | R | A | 0x3C | A | P | | | | | | | | | | | | | Адрес | Подтв. | Рестарт | Чтение | Данные | Стоп | | | | | | Старт Запись Регистр Адрес Подтв. Подтв. ведущим

После сигнала Start и указания адреса ведущий записывает адрес регистра, который необходимо прочитать. Далее следует сигнал Restart (или Stop, затем Start). Ведущий снова выводит адрес ведомого, но уже с битом Read (чтения). Ведомый устанавливает бит ACK и во время следующих 8-ти импульсов тактирования выводит данные на линию SDA. На девятом импульсе уже ведущий устанавливает бит ACK (или NACK, если данные не удалось прочитать) и завершает обмен сигналом Stop.

Скорость

Первоначальный стандарт I²C был реализован на скорости 100 кГц. С тех пор появились и другие реализации шины, но большинство устройств работают на этой скорости. Так же известны случаи когда скорость шины специально снижена, чтобы увеличить расстояние передачи и уменьшить чувствительность к помехам. Не все модули могут работать на сниженной скорости.

Ссылки

  • Официальное описание шины на сайте NXP (на английском)
  • Модули I²C в магазине iarduino.ru
  • Урок — узнаём адреса на шине I²C
  • Урок — соединяем две Arduino по шине I²C
  • Wiki — Raspberry Pi включаем I²C, SPI

Шина управления I2C

I 2 C – двухпроводной интерфейс, разработанный корпорацией Philips. В первоначальном техническом требовании к интерфейсу максимальная скорость передачи данных составляла 100 Кбит/с. Однако со временем появились стандарты на более скоростные режимы работы I 2 C. К одной шине I 2 C могут быть подключены устройства с различными скоростями доступа, так как скорость передачи данных определяется тактовым сигналом. Протокол передачи данных разработан таким образом, чтобы гарантировать надежный прием передаваемых данных. При передаче данных одно устройство является «Master», которое инициирует передачу данных и формирует сигналы синхронизации. Другое устройство «Slave» — начинает передачу только по команде, пришедшей от «Master». В микроконтроллерах PIC16CXXX аппаратно реализован режим «Slave» устройства в модуле SSP. Режим «Master» реализуется программно. Основные термины, используемые при описании работы с шиной I 2 C: Передатчик – устройство, передающее данные по шине Приемник – устройство, получающее данные с шины «Master» — устройство, которое инициирует передачу и формирует тактовый сигнал «Slave» — устройство, к которому обращается «Master» Multi-«Master» — режим работы шины I 2 C с более чем одним «Master» Арбитраж – процедура, гарантирующая, что только один «Master» управляет шиной Синхронизация – процедура синхронизации тактового сигнала от двух или более устройств Выходные каскады формирователей сигналов синхронизации (SCL) и данных (SDA) должны быть выполнены по схемам с открытым коллектором (стоком) для объединения нескольких выходов и через внешний резистор подключены к плюсу питания для того, чтобы на шине был уровень «1», когда ни одно устройство не формирует сигнал «0». Максимальная емкостная нагрузка ограничена емкостью 400 пФ. Инициализация и завершение передачи данных В то время, когда передача данных на шине отсутствует, сигналы SCL и SDA имеют высокий уровень за счет внешнего резистора. Сигналы START и STOP формируются «Master» для определения начала и окончания передачи данных соответственно. Сигнал START формируется переходом сигнала SDA из высокого уровня в низкий при высоком уровне сигнала SCL. Сигнал STOP определяется как переход SDA из низкого уровня в высокий при высоком уровне SCL. Таким образом, при передаче данных сигнал SDA может изменяться только при низком уровне сигнала SCL. comp67-1.jpgАдресация устройств на шине I 2 C Для адресации устройств используется два формата адреса: Простой 7-разрядный формат с битом чтения/записи R/W; comp67-2.jpgи 10-разрядный формат – в первом байте передается два старших бита адреса и бит записи/чтения, во втором байте передается младшая часть адреса. comp67-3.jpgПодтверждение приема При передаче данных после каждого переданного байта приемник должен подтвердить получение байта сигналом ACK. Если «Slave» не подтверждает получение байта адреса или данных, «Master» должен прервать передачу, сформировав сигнал STOP. При передаче данных от «Slave» к «Master», «Master» формирует сигналы подтверждения приема данных ACK. Если «Master» не подтвердит приема байта, «Slave» прекращает передачу данных, «отпуская» линию SDA. После этого «Master» может сформировать сигнал STOP. Для задержки передачи данных «Slave» может установить логический нуль, указывая «Master» о необходимости ожидания. После «отпускания» линии SCL передача данных продолжается. comp67-4.jpg comp67-5.jpgПередача данных от «Master» к «Slave» comp67-6.jpgЧтение данных из «Slave» comp67-7.jpgИспользование сигнала повторного START для обращения к «Slave» comp67-8.jpgРежим Multi-«Master» Протокол передачи данных I 2 C позволяет иметь более одного «Master» на шине. Для разрешения конфликтов на шине при инициализации передачи используются функции арбитража и синхронизации. Арбитраж Арбитраж выполняется на линии SDA при высоком уровне линии SCL. Устройство, которое формирует на линии SDA высокий уровень когда другое передает низкий, теряет право брать «Master» и должно перейти в режим «Slave». «Master», потерявший инициативу на шине, может формировать тактовые импульсы до конца байта, в котором потерял свойства ведущего. comp67-9.jpgСинхронизация Синхронизация на шине происходит после выполнения арбитража по отношению к сигналу SCL. При переходе сигнала SCL с высокого уровня в низкий, все заинтересованные устройства начинают отсчитывать длительность низкого уровня. Затем устройства начинают переводить уровень SCL из низкого в высокий согласно требуемой скорости передачи данных. После перехода уровня из низкого в высокое состояние, заинтересованные устройства отсчитывают длительность высокого уровня. Первое устройство, которое переведет сигнал SCL в низкий уровень, определяет параметры тактового сигнала. comp67-10.jpg

Теги:

none Опубликована: 2005 г. 0 0

Вознаградить Я собрал 0 0

Оценить статью

  • Техническая грамотность

Оценить Сбросить

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (0) | Я собрал ( 0 ) | Подписаться

Для добавления Вашей сборки необходима регистрация

Статью еще никто не комментировал. Вы можете стать первым.

USB-реле (2 канала)

USB-реле (2 канала)

Программатор Pickit3 Макетная плата для пайки (10 шт)

1999-2024 Сайт-ПАЯЛЬНИК ‘cxem.net’
При использовании материалов сайта, обязательна
ссылка на сайт ПАЯЛЬНИК и первоисточник

Интерфейс I2C в Arduino

Как расширить функциональность разрабатываемой системы на основе микроконтроллера? Да, этот вопрос интересует многих схемотехников, работающими над прототипами электронных устройств. Удивительно, но добавить к системе новые блоки, не изменяя схемы, позволит шина, разработанная инженерами Philips более 30 лет назад.

Благодаря интерфейсу I2C можно превратить микроконтроллер в простой конструктор, к которому можно подключить несколько сотен микросхем. Сразу стоит отметить, что их количество ограничивается емкостью шины в 400 пФ, но это один из немногих недостатков I2C.

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

Именно эта шина устанавливается для связи с внешним миром дисплеев, камер, сотовых телефонов. Количество периферических устройств, подключаемых к устройствам с помощью I2C, вообще не поддается учету. В чем же преимущества интерфейса?

Основные достоинства и недостатки I2C

I2C – последовательная асимметричная шина для связи между интегральными схемами внутри электронных приборов. Использует две двунаправленные линии связи (SDA и SCL).

Шина представляет собой два проводника, а для управления интерфейсом достаточно одного микроконтроллера. Удивительно, но подобная простота позволяет производить отключение микросхем в процессе работы. Специальный встроенный фильтр способен справляться с всплесками, гарантируя сохранность обрабатываемой информации.

Среди недостатков I2C, кроме ограниченной емкости, сложность программирования и трудность с определением неисправности в ситуации с состоянием низкого уровня.

Изначально скорость шины была всего 100 кбит, а подключить к ней было можно всего 120 устройств. В 90-х годах стандарты изменились и скорость передачи данных увеличилась в 4 раза и появилась возможность подключения до 1000 микросхем.

Однако большинство производителей интерфейса зациклились на 400 кбит с подключением 120 устройств.

Принцип подключения и работы

Интерфейс I2C в Arduino

Проводники шины подсоединены к плюсу резисторами 1-10к, один из проводников является шиной данных, другой – тактирование. Работает такая схема просто: на линии есть одно ведущее устройство (микроконтроллер) и несколько периферийных устройств. Так как линии запитаны на плюсе, то подключенному слейву (ведомому элементу) достаточно прижать провод к земле и передать тем самым 0.

Когда периферическое устройство отпускает провод, по проводнику передается 1. Все элементарно, но если при совместной работе один из слейвов выдал 0, то остальным подключенным к шине устройствам придется подождать. Осуществляет тактирование и передачу микроконтроллер, предварительно уточнив, свободна ли линия. Для этого передается 1 на SCL и SDA, после чего создается старт-условие – прижимается линия SDA при значении SCL равном 1.

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

При этом нужно помнить, что считывание данных осуществляется при SCL =1, а передача идет вперед старшим битом.

Первые 7 бит – адрес устройства, 8 – команда записать (0) или читать (1).

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

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

Режим работы multi-master

I2C - режим работы multi-master

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

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

Интерфейс I2C (IIC)

AmperMarket.kz

I2C (также известная как InterIC, IIC, I 2 C) — разработанная компанией Philips последовательная шина для низкоскоростной (до 100 кбит/с в стандартном режиме и 400 кбит/с в «быстром» режиме) передачи 8-битных данных между микроконтроллерами (или процессорами) и периферийными компонентами, такими как различные датчики, драйверы, ОЗУ, АЦП и тому подобное.

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

Для передачи информации используется всего две линии:

Каждое устройство определяется как ведущее или ведомое, а также обладает уникальным (в пределах шины) адресом. Максимальное допустимое количество элементов, подсоединённых к одной шине, ограничивается максимальной емкостью шины — 400 пФ.

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

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

Принцип работы

Начало и завершение обмена данными

Обмен данными, как уже было сказано, инициируется ведущим устройством. Оно генерирует тактирующие сигналы на линии SCL, которые имеют определенную периодичность, но могут быть задержаны приемником, если он еще не готов принят следующий байт данных.
В исходном состоянии обе линии SDA и SCL находятся в высоком состоянии.
Процедура обмена данными начинается с формирования ведущим устройством состояния СТАРТ: переход состояния линии SDA с высокого на низкое при высоком состоянии на линии SCL.
Процедура обмена данными заканчивается, когда ведущий формирует состояние СТОП: переход состояния линии SDA с низкого на высокое при высоком состоянии на линии SCL.

I2C. Состояния СТАРТ и СТОП

Обмен данными

Данные передаются изменением уровня сигнала на линии SDA в определенной последовательности. Обмен данными происходит байтами, каждый из которых состоит из 8-ми бит. За один сеанс может быть передано неограниченное количество байт.
После формирования состояния СТАРТ и до появления состояния СТОП изменять уровень на линии SDA можно только при низком состоянии на тактирующей линии SCL. Бит информации «читается» приёмником только когда на линии SCL установлен высокий уровень сигнала, поэтому в этот момент на линии SDA сигнал должен быть неизменным и стабильным. Принятые данные считаются действительными, только если соблюдается это правило.

I2C. Обмен данными

Подтверждение приема данных

Для корректной передачи данных, приемник должен подтверждать прием каждого байта от передатчика. Для этого в спецификации протокола обмена по шине I2C вводится специальный бит подтверждения, выставляемый приёмником на шину SDA после приема каждого 8-го бита данных. Передача каждых 8-ми бит данных считается успешной, если приемник отправляет бит подтверждения с низкий уровень сигнала по линии SDA. Импульс синхронизации для подтверждающего бита генерируется ведущим устройством сразу после переданных 8-ми бит данных.

I2C. Бит подтверждения

Адресация

Логично, что перед обменом данными ведущее устройство должно определить с каким ведомым устройством планируется работа в этом сеансе. Т.е. ведущий должен адресовать необходимого ведомого, «позвать его по имени». Для этого ведущее устройство, сразу после установки состояния СТАРТ, отправляет по шине специальный байт информации, первые 7 бит которого содержат адрес ведомого (в обычном режиме), а 8-й бит (бит направления) — информацию о направлении передачи.
Как уже отмечалось выше, каждое устройство в шине I2C должно иметь уникальный адрес, но также в системе предусмотрен адрес «общего вызова» для обращения ко всем ведомым сразу. Адрес ведомого может состоять из фиксированной и программируемой частей. После отправки адресного байта по шине, каждое устройство в системе сравнивает первые семь бит после сигнала СТАРТ со своим адресом. Если адреса совпали, устройство считает себя выбранным как ведомый-приёмник или как ведомый-передатчик, в зависимости от состояния бита направления:

  • низкий уровень («0») означает, что ведущий будет отправлять информацию ведомому
  • высокий («1») означает, что ведущий будет получать информацию от ведомого.

Из спецификации шины следует, что допускаются не только простые форматы обмена, но и комбинированные, когда в промежутке от состояния СТАРТ до состояния СТОП ведущий и ведомый могут выступать и как приемник и как передатчик данных. Комбинированные форматы могут быть использованы, например, для управления последовательной памятью.

Типичный сеанс обмена данными по шине I2C проиллюстрирован на следующем изображении:

I2C. Сеанс обмена данными
I2C. Направления обмена сигналами

Как узнать I2C адрес устройства?

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *