Аппаратный i2c. Шина управления I2C. Использование механизма синхронизации как процедуры управления связью

С номиналами от 10 Ом до 1 МОм);

  • 2 резистора по 4,7 кОм (из того же набора);
  • соединительные провода (например, вот хороший набор);
  • компьютер с Arduino IDE.
  • 1 Описание интерфейса I2C

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

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

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

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

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


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

    2 Реализация I2C в Arduino

    Arduino использует для работы по интерфейсу I2C два порта. Например, в Arduino UNO и Arduino Nano аналоговый порт A4 соответствует SDA, аналоговый порт A5 соответствует SCL.


    Для других моделей плат соответствие выводов такое:

    3 Библиотека "Wire" для работы с IIC

    Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire . Она имеет следующие функции:

    Функция Назначение
    begin(address) инициализация библиотеки и подключение к шине I2C; если не указан адрес, то присоединённое устройство считается ведущим; используется 7-битная адресация;
    requestFrom() используется ведущим устройством для запроса определённого количества байтов от ведомого;
    beginTransmission(address) начало передачи данных к ведомому устройству по определённому адресу;
    endTransmission() прекращение передачи данных ведомому;
    write() запись данных от ведомого в ответ на запрос;
    available() возвращает количество байт информации, доступных для приёма от ведомого;
    read() чтение байта, переданного от ведомого ведущему или от ведущего ведомому;
    onReceive() указывает на функцию, которая должна быть вызвана, когда ведомое устройство получит передачу от ведущего;
    onRequest() указывает на функцию, которая должна быть вызвана, когда ведущее устройство получит передачу от ведомого.

    4 Подключение I2C устройства к Arduino

    Давайте посмотрим, как работать с шиной I2C с помощью Arduino.

    Сначала соберём схему, как на рисунке. Будем управлять яркостью светодиода, используя цифровой 64-позиционный потенциометр AD5171 (см. техническое описание), который подключается к шине I2C. Адрес, по которому мы будем обращаться к потенциометру - 0x2c (44 в десятичной системе).


    5 Управление устройством по шине IIC

    Рассмотрим диаграммы информационного обмена с цифровым потенциометром AD5171, представленные в техническом описании:


    Нас тут интересует диаграмма записи данных в регистр RDAC . Этот регистр используется для управления сопротивлением потенциометра.

    Откроем из примеров библиотеки "Wire" скетч: Файл Образцы Wire digital_potentiometer . Загрузим его в память Arduino.

    #include // подключаем библиотеку "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.

    Интерфейс I2C

    Основные технические характеристики

    Интерфейс I2 C (Inter IС Bus - шина соединения микросхем) - синхронная последовательная шина, обеспечивающая двустороннюю передачу данных между подключенными устройствами по двум сигнальным линиям.

    Шина ориентирована на 8-битные передачи.

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

    Уровни сигналов - совместимые с логикой ТТЛ, КМОП, n-МОП, как с традиционным питанием +5 В так и с низковольтным (+3,3 В и ниже).

    Скорость передачи данных до 3,4 Мбит/с. Поддержка подключения нескольких устройств.

    Поддержка «горячего» подключения/ отключения и технологии РnР.

    Интерфейс мультиплексный – во время обмена данными один «мастер» и один или несколько «подчиненных» устройств.

    Основные термины, используемые при описании работы с шиной I2 C:

    Передатчик – устройство, передающее данные по шине Приемник – устройство, получающее данные с шины

    «Master» - устройство, которое инициирует передачу и формирует тактовый сигнал «Slave» - устройство, к которому обращается «Master»

    Multi-«Master» - режим работы шины I2 C с более чем одним «Master» Арбитраж – процедура, гарантирующая, что только один «Master» управляет

    шиной Синхронизация – процедура синхронизации тактового сигнала от двух или более

    устройств

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

    В I2 C определены три режима передачи: стандартный - Standard Mode (S)

    Со скоростью 0-100 Кбит/с, быстрый - Fast Mode (F) - со скоростью 0-400 Кбит/с, и высокоскоростной - High speed (Hs) - со скоростью до 3,4 Мбит/с.

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

    Интерфейс I2 C использует две сигнальные линии: данных SDA (Serial Data) и синхронизации SCL (Serial Clock). В обменах участвуют два устройства - ведущее (master) и ведомое (slave). Ведущее и ведомое устройства могут выступать в роли и передатчика, и приемника данных. Протокол допускает наличие на шине нескольких ведущих устройств и имеет простой механизм арбитража (разрешения коллизий).

    Протокол обмена для обычных устройств F/S иллюстрирует рис. Х.1. Обе сигнальные линии имеют нагрузочные резисторы, «подтягивающие» их уровень к напряжению питания. На устройстве к каждой линии подключен приемник и передатчик типа «открытый коллектор» («открытый сток»), у ведомого устройства передатчик на линии SCL не обязателен. Все одноименные передатчики соединяются по схеме «Монтажное И»: уровень в линии будет высоким, если все передатчики пассивны, и низким, если хоть у одного передатчика выходной транзистор открыт. В покое (Idle, исходное состояние шины) все передатчики пассивны. Синхронизацию задает ведущее устройство, но ведомое, если оно не имеет достаточного быстродействия, может замедлять обмен данными.

    Начало любой передачи - условие Start - инициируется ведущим устройством, убедившимся в том, что шина свободна (высокий уровень сигналов SCL и SDA).

    Условие Start (на диаграммах обозначается как S) - перевод сигнала SDA из высокого в низкий при высоком уровне SCL.

    Завершается операция переводом сигнала SDA из низкого уровня в высокий при высоком уровне SCL - условие Stop (обозначается как Р), также вводящееся ведущим устройством.

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

    Приемник во время девятого такта формирует бит подтверждения Ack, по которому передатчик убеждается, что передача прошла успешно. После передачи бита подтверждения ведомое устройство может задержать следующую посылку, удерживая линию SCL на низком уровне. Ведомое устройство в режимах F/S может замедлить передачу по шине и на уровне приема каждого бита, удерживая SCL на низком уровне после его спада, сформированного передатчиком. Поэтому ведущее устройство должно генерировать сигнал SCL, анализируя состояние этой линии: сняв этот сигнал, новый импульс (открытие ключа передатчика) оно имеет право вводить, лишь убедившись, что сигнал SCL вернулся в пассивное состояние (высокий уровень). В противном случае синхронизация будет потеряна. Сигнал SCL может быть растянут и другим устройством, пытающимся захватить шину в это же время. Тактовый сигнал SCL не обязательно будет равномерным: время его нахождения на низком уровне будет определяться максимальным временем, в котором его захочет удержать самое медленное из устройств, участвующих в данном обмене (даже и конфликтующих).

    Адресация в шине I2C

    Каждое устройство, подключённое к шине, может быть программно адресовано по уникальному адресу.

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

    В обычном режиме используется 7-битная адресация.

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

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

    записывать информацию в выбранного ведомого. "Единица" означает, что ведущий будет считывать информацию из ведомого.

    После того, как адрес послан, каждое устройство в системе сравнивает первые семь бит после сигнала СТАРТ со своим адресом. При совпадении устройство полагает себя выбранным как ведомый-приёмник или как ведомый-передатчик, в зависимости от бита направления.

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

    ИМС памяти, или драйверов LED-индикаторов), поэтому при помощи программируемой части адреса становится возможным подключить к шине максимально возможное количество таких устройств. Количество программируемых бит в адресе зависит от количества свободных выводов микросхемы. Иногда используется один вывод с аналоговой установкой программируемого диапазона адресов, как это, к примеру, реализовано в ИМС SAA1064. При этом в зависимости от потенциала на этом адресном выводе ИМС, возможно смещение адресного пространства драйвера так, чтобы однотипные ИМС не конфликтовали между собой на общей шине.

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

    От «Master» к «Slave»

    Адрес «Slave»

    От «Slave» к «Master»

    Передача

    Передаваемыеданные

    а) Передача от «Master» к «Slave»

    (n байтов + АСК)

    «Start» - условие

    «Stop» - условие

    Адрес «Slave»

    Бит подтверждения (ACK)

    Принимаемые данные

    б) Чтение из «Slave»

    (n байтов + АСК)

    Отсутствие подтверждения

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

    SDA - линия данных
    SCL - линия сихронизации
    Обратите внимание, что к линиям SDA и SCL можно подключить несколько ведомых устройств. SDA и SCL являются двунаправленными линиями и подключаются к источнику питания через оттягивающий резистор. В большинстве случаев ведущим устройством выступает микроконтроллер, а ведомыми могут быть часы реального времени и датчики температуры, например, DS1307 и DS1624 от www.maxim-ic.com.

    Сигналы START и STOP

    Данные могут передаваться только после создания стартого условия. Переход линии SDA из ВЫСОКОГО состояния в НИЗКОЕ, в то время как SCL находится в ВЫСОКОМ состоянии, означает START. После каждой передачи данных выполняется условие остановки. Переход линии SDA из НИЗКОГО состояния в ВЫСОКОЕ при SCL в ВЫСОКОМ состоянии означает STOP.


    Длина данных, передаваемых по линии SDA, всегда равна 8 битам (включая команды чтения и записи). Каждый байт должен оканчиваться битом подтверждения. Старший бит MSB передается первым. Если происходит команда записи, то R/W бит = 0, и если чтения - R/W бит = 1. Подтверждение при передаче данных обязательно. Приемник должен удерживать линию данных в течение подверждения в стабильно Низком состоянии. Приёмник, которому были адресованы данные, обязан генерировать подтверждение после каждого принятого байта, исключая те случаи, когда посылка начинается с адреса CBUS. В том случае, когда ведомый-приёмник не может подтвердить свой адрес, линия данных должна быть оставлена в ВЫСОКОМ состоянии. После этого ведущий может выдать сигнал СТОП для прерывания пересылки данных. Ведущий может в любое время остановить передачу данных.
    Допустим, у нас есть ведомое устройство с адресом 1101000, и ведущий хочет, чтобы он выступал в роле приемника.


    На рисунке можно увидеть, что ведомый всегда порождает условия старта и посылает ведущему R/W бит, равный 0. После этого ведущий может начать передачу данных или остановить ее условием СТОП.


    На рисунке показано все то же самое, только R/W бит равен 1. Ведомый может начать передачу данных после потверждения от ведущего, он также может прекратить прием данных, создав условие СТОП.
    Пример.
    Этот пример показывает, как настроить чтение с датчика температуры DS1624.
    Схема подключения DS1624.


    Код программы представлен ниже.

    $regfile = "m88def. dat" ;Define the chip you use
    $crystal = 8000000 ;Define speed
    $baud = 19200 ;Define UART BAUD rate
    ;Declare RAM for temperature storage
    Dim I2ctemp As Byte ;Storage for the temperature
    ;Configure pins we want to use for the I²C bus
    Config Scl = Portd. 1 ;Is serial clock SCL
    Config Sda = Portd. 3 ;Is serial data SDA
    ;Declare constants – I2C chip addresses
    Const Ds1624wr = &B10010000 ;DS1624 Sensor write
    Const Ds1624rd = &B10010001 ;DS1624 Sensor read
    ;This section initializes the DS1624
    I2cstart ;Sends start condition
    I2cwbyte Ds1624wr ;Sends the address
    ;byte with r/w 0
    ;Access the CONFIG register (&HAC address byte)
    I2cwbyte &HAC
    ;Set continuous conversion (&H00 command byte)
    I2cwbyte &H00
    I2cstop ;Sends stop condition
    Waitms 25 ;We have to wait some time after a stop
    I2cstart
    I2cwbyte Ds1624wr
    ;Start conversion (&HEE command byte)
    I2cwbyte &HEE
    I2cstop
    Waitms 25
    ;End of initialization
    Print ;Print empty line
    Do
    ;Get the current temperature
    I2cstart
    I2cwbyte Ds1624wr
    I2cwbyte &HAA ;Read temperature (&HAA command byte)
    I2cstart
    I2cwbyte Ds1624rd ;The chip will give register contents
    ;Temperature is stored as 12, 5 but the , 5 first
    I2crbyte I2ctemp
    ;So you"ll have to read twice… first the , 5
    I2crbyte I2ctemp , Nack
    ;And then the 12… we don"t store the , 5
    I2cstop
    ;That"s why we read twice.
    ;We give NACK if the last byte is read
    ;Finally we print
    Print "Temperature: " ; Str(i2ctemp) ; " degrees" ; Chr(13);
    Waitms 25
    Loop
    End

    Отметим, что используемые команды в этом примере можно найти в документации к DS1624.
    Программа написана в среде Bascom AVR IDE, в которой можно разрабатывать программы для микроконтроллеров на языке высокого уровня Бейсик (Basic). Bascom AVR имеет встроенный компилятор, который преобразует программы, написанные на языке Basic, в шестнадцатеричный код, который, в свою очередь, можно запрограммировать (прошить) в микроконтроллер.
    Краткий обзор команд.
    Config Sda = Portx. x
    Настраивает контактный порт для использования в качестве последовательной передачи данных SDA.
    Config Scl = Portx. x
    Настраивает контактный порт для использования в качестве линии SCL.
    I2cstart
    Отправляет условие СТАРТ.
    I2cstop
    Отправляет условие СТОП.
    I2cwbyte
    Записывает один байт в I2C.
    I2crbyte
    Считывает один байт из I2C.
    I2csend
    Записывает количество байт, I2C.
    I2creceive
    Читает количество байтов от I2C.

    Практика
    Ниже показано, как реализовать I2C. В схеме использeтся контроллер Mega88 как мастер.

    С номиналами от 10 Ом до 1 МОм);

  • 2 резистора по 4,7 кОм (из того же набора);
  • соединительные провода (например, вот хороший набор);
  • компьютер с Arduino IDE.
  • 1 Описание интерфейса I2C

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

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

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

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

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


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

    2 Реализация I2C в Arduino

    Arduino использует для работы по интерфейсу I2C два порта. Например, в Arduino UNO и Arduino Nano аналоговый порт A4 соответствует SDA, аналоговый порт A5 соответствует SCL.


    Для других моделей плат соответствие выводов такое:

    3 Библиотека "Wire" для работы с IIC

    Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire . Она имеет следующие функции:

    Функция Назначение
    begin(address) инициализация библиотеки и подключение к шине I2C; если не указан адрес, то присоединённое устройство считается ведущим; используется 7-битная адресация;
    requestFrom() используется ведущим устройством для запроса определённого количества байтов от ведомого;
    beginTransmission(address) начало передачи данных к ведомому устройству по определённому адресу;
    endTransmission() прекращение передачи данных ведомому;
    write() запись данных от ведомого в ответ на запрос;
    available() возвращает количество байт информации, доступных для приёма от ведомого;
    read() чтение байта, переданного от ведомого ведущему или от ведущего ведомому;
    onReceive() указывает на функцию, которая должна быть вызвана, когда ведомое устройство получит передачу от ведущего;
    onRequest() указывает на функцию, которая должна быть вызвана, когда ведущее устройство получит передачу от ведомого.

    4 Подключение I2C устройства к Arduino

    Давайте посмотрим, как работать с шиной I2C с помощью Arduino.

    Сначала соберём схему, как на рисунке. Будем управлять яркостью светодиода, используя цифровой 64-позиционный потенциометр AD5171 (см. техническое описание), который подключается к шине I2C. Адрес, по которому мы будем обращаться к потенциометру - 0x2c (44 в десятичной системе).


    5 Управление устройством по шине IIC

    Рассмотрим диаграммы информационного обмена с цифровым потенциометром AD5171, представленные в техническом описании:


    Нас тут интересует диаграмма записи данных в регистр RDAC . Этот регистр используется для управления сопротивлением потенциометра.

    Откроем из примеров библиотеки "Wire" скетч: Файл Образцы Wire digital_potentiometer . Загрузим его в память Arduino.

    #include // подключаем библиотеку "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.

    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.

    Адресация устройств на шине I 2 C

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

    Простой 7-разрядный формат с битом чтения/записи R/W;

    и 10-разрядный формат – в первом байте передается два старших бита адреса и бит записи/чтения, во втором байте передается младшая часть адреса.

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

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

    Если «Slave» не подтверждает получение байта адреса или данных, «Master» должен прервать передачу, сформировав сигнал STOP.

    При передаче данных от «Slave» к «Master», «Master» формирует сигналы подтверждения приема данных ACK. Если «Master» не подтвердит приема байта, «Slave» прекращает передачу данных, «отпуская» линию SDA. После этого «Master» может сформировать сигнал STOP.

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

    Передача данных от «Master» к «Slave»

    Чтение данных из «Slave»

    Использование сигнала повторного START для обращения к «Slave»

    Режим Multi-«Master»

    Протокол передачи данных I 2 C позволяет иметь более одного «Master» на шине. Для разрешения конфликтов на шине при инициализации передачи используются функции арбитража и синхронизации.

    Арбитраж

    Арбитраж выполняется на линии SDA при высоком уровне линии SCL. Устройство, которое формирует на линии SDA высокий уровень когда другое передает низкий, теряет право брать «Master» и должно перейти в режим «Slave». «Master», потерявший инициативу на шине, может формировать тактовые импульсы до конца байта, в котором потерял свойства ведущего.

    Синхронизация

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