I2C интерфейс: описание на русском. Передача данных

I2C интерфейс: описание на русском. Передача данных

20.07.2023

С номиналами от 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.

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

    • Некоторый “умный” узел управления, обычно однокристалльная микроЭВМ.
    • Узлы общего назначения, такие как буферы ЖКИ, порты ввода/вывода, ОЗУ, ЭСПЗУ или преобразователи данных.
    • Специфические узлы, такие как схемы цифровой настройки и обработки сигнала для радио- и видео- систем, или генераторы тонального набора для телефонии.

    Для того, чтобы использовать эти общие решения к выгоде конструкторов и производителей (технологов), а также для увеличения эффективности аппаратуры и упрощения схемотехнических решений, Philips разработала простую двунаправленную двухпроводную шину для эффективного “межмикросхемного” (inter-IC) управления. Шина так и называется - InterIC, или IIC (I 2 C) шина. В настоящее время ассортимент продукции Philips включает более 150 КМОП и биполярных I 2 C-совместимых устройств, функционально предназначенных работы во всех трех вышеперечисленных категориях электронного оборудования. Все I 2 C-совместимые устройства имеют встроенный интерфейс, который позволяет им связываться друг с другом по шине I 2 C. Это конструкторское решение разрешает множество проблем сопряжения различных устройств, которые обычно возникают при разработке цифровых систем.

    Вот некоторые достоинства шины I 2 C:

    • Требуется только две линии - линия данных (SDA) и линия синхронизации (SCL) Каждое устройство, подключённое к шине, может быть программно адресовано по уникальному адресу. В каждый момент времени существует простое отношение ведущий/ведомый: ведущие могут работать как ведущий-передатчик и ведущий-приёмник.
    • Шина позволяет иметь несколько ведущих, предоставляя средства для определения коллизий и арбитраж для предотвращения повреждения данных в ситуации, когда два или более ведущих одновременно начинают передачу данных В стандартном режиме обеспечивается передача последовательных 8-битных данных со скоростью до 100 кбит/с, и до 400 кбит/с в “быстром” режиме.
    • Встроенный в микросхемы фильтр подавляет всплески, обеспечивая целостность данных.
    • Максимальное допустимое количество микросхем, подсоединённых к одной шине, ограничивается максимальной емкостью шины 400 пФ.

    Рис. 1 показывает два примера применения шины I 2 C.

    1.1 Преимущества для конструктора

    I 2 C-совместимые микросхемы позволяют ускорить процесс разработки от функциональной схемы до прототипа. Более того, поскольку такие микросхемы подключаются непосредственно к шине без каких-либо дополнительных цепей, появляется возможность модификации и модернизации системы прототипа путем подключения и отключения устройств от шины.

    Вот некоторые достоинства I 2 C-совместимых микросхем, которые касаются конструкторов:

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

    Помимо этих преимуществ, КМОП I2C-совместимые микросхемы предоставляют для конструкторов специальные решения, которые в частности привлекательны для портативного оборудования и систем с батарейным питанием:

    • Крайне низкое потребление.
    • Высокая стойкость к помехам.
    • Широкий диапазон питающего напряжения.
    • Широкий рабочий температурный диапазон.

    Рисунок 1. Два примера применения I 2 C
    (a)Высокоинтегрированный телевизор
    (b) базовая станция радиотелефона стандарта DECT

    1. Микроконтроллер
    2. ФАПЧ синтезатор
    3. Флеш-память
    4. Декодер цвета
    5. Стереодекодер звука
    6. Улучшение сигнала картинки
    7. HI-FI аудиопроцессор
    8. Видеопроцессор
    9. Одночиповый текст
    10. Экранный дисплей
    11. Генератор DTMF
    12. Интерфейс телефонной линии
    13. Кодек АДИКМ
    14. Пакетный контроллер
    15. Микроконтроллер

    SDA - линия данных, SCL - линия синхронизации

    1.2 Преимущества для технолога (производителя)

    I 2 C-совместимые микросхемы не только помогают конструкторам, но и дают широкий диапазон преимуществ для технологов, потому что:

    • Простая двухпроводная последовательная шина I 2 C минимизирует соединения между микросхемами; микросхемы имеют меньше контактов и требуется меньше дорожек, результат - печатные платы становятся менее дорогими и меньше по размеру.
    • Полностью интегрированный I 2 C-протокол устраняет нужду в дешифраторах адреса и другой внешней мелкой логике.
    • Возможность нескольких “ведущих” на I 2 C-шине позволяет ускорить тестирование и настройку оборудования при помощи подключения шины к компьютеру сборочной линии.
    • Доступность I 2 C-совместимых микросхем в SO и VSO корпусах, а также в DIL корпусе снижает требования к размеру еще больше.

    Это лишь некоторые преимущества. Кроме того, I 2 C-совместимые микросхемы увеличивают гибкость системы, позволяя простое конструирование вариантов оборудования и легкую модернизацию для того, чтобы поддерживать разработки на современном уровне. Таким образом, целое семейство оборудования может быть разработано, основываясь на базовой модели. Модернизация оборудования или расширение его функций (например, дополнительная память, дистанционное управление и т.п.) может быть произведена путем простого подключения соответствующей микросхемы к шине. Если требуется бoльшая ПЗУ, то дело лишь в выборе микроконтроллера к большим объемом ПЗУ из нашего ряда. Поскольку новые микросхемы могут замещать старые, легко добавлять новые свойства в оборудование или увеличивать его производительность путем простого отсоединения устаревшей микросхемы и подключения к шине новой.

    1.3 ACCESS.bus

    Двухпроводная природа шины и возможность программной адресации делает шину I 2 C идеальной платформой для ACCESS.bus (Рис. 2). Это более дешевая альтернатива интерфейсу RS-232C для подключения периферии к компьютеру при помощи простого 4-контактного коннектора. (См. Раздел 19.0)

    Рисунок 2. ACCESS.bus - дешевая альтернатива интерфейсу RS-232C

    2.0 Введение в спецификацию шины I 2 C

    Для приложений 8-битного управления, использующих микроконтроллеры, могут быть установлены определенные конструкторские критерии:

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

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

    Устройства, связывающиеся по шине, должны обладать неким протоколом, который упреждает все возможности столкновений, потери данных и блокирования информации. Быстрые устройства должны быть в состоянии связаться с медленными устройствами. Система не должна быть зависима от устройств, подключенных к ней, иначе модификации и улучшения станут невозможными. Также должна быть разработана процедура, устанавливающая, какое устройство управляет шиной и когда. Кроме того, если различные устройства с разными тактовыми частотами подключены к шине, должен быть определен источник синхронизации шины. Всем этим критериям удовлетворяет шина I 2 C.

    3.0 Концепция шины I 2 C

    Шина I2C поддерживает любую технологию изготовления микросхем (НМОП, КМОП, биполярную). Две линии, данных (SDA) и синхронизации (SCL) служат для переноса информации. Каждое устройство распознается по уникальному адресу - будь то микроконтроллер, ЖКИ буфер, память или интерфейс клавиатуры - и может работать как передатчик или приёмник, в зависимости от назначения устройства. Обычно ЖКИ буфер - только приёмник, а память может как принимать, так и передавать данные. Кроме того, устройства могут быть классифицированы как ведущие и ведомые при передаче данных (см. Табл 1). Ведущий - это устройство, которое инициирует передачу данных и вырабатывает сигналы синхронизации. При этом любое адресуемое устройство считается ведомым по отношению к ведущему.

    Термин (англ) Термин (рус) Описание
    Transmitter Передатчик Устройство, посылающее данные в шину
    Receiver Приемник Устройство, принимающее с шины
    Master Ведущий Начинает пересылку данных, вырабатывает синхроимпульсы, заканчивает пересылку данных
    Slave Ведомый Устройство, адресуемое ведущим
    Multi-master - Несколько ведущих могут пытаться захватить шину одновременно, без нарушения передаваемой информации
    Arbitration Арбитраж Процедура, обеспечивающая Multi-master
    Synchronization Синхр. Процедура синхронизации двух устройств

    Рисунок 3. Пример конфигурации шины I 2 C с двумя микроконтроллерами

    1. Микроконтроллер А
    2. Массив
    3. ЖКИ драйвер
    4. Статическая ОЗУ или ППЗУ
    5. Микроконтроллер B

    Шина I 2 C допускает несколько ведущих. Это означает, что более чем одно устройство, способное управлять шиной, может быть подключено к ней. Поскольку в качестве ведущих обычно выступают микроконтроллеры, давайте рассмотрим пример пересылки данных между двумя микроконтроллерами, подключенными к шине (рис 3). Пример покажет взаимоотношения передатчик-приемник и ведущий-ведомый, существующие в шине I 2 C. Необходимо заметить, что эти отношения не постоянны, а зависят только от направления пересылки данных в данный момент времени. Пересылка данных будет происходить следующим образом:

    1. Пусть микроконтроллер А желает послать информацию в микроконтроллер В:
      • микроконтроллер А (ведущий-передатчик) посылает данные микроконтроллеру В (ведомый-приёмник)
    2. Пусть микроконтроллер А желает принять информацию от микроконтроллера В:
      • микроконтроллер А (ведущий) адресует микроконтроллер В (ведомый)
      • микроконтроллер А (ведущий-приемник) принимает данные от микроконтроллера В (ведомый-передатчик)
      • микроконтроллер А заканчивает пересылку

    В обоих случаях ведущий (микроконтроллер А) генерирует синхроимпульсы и заканчивает пересылку.

    Возможность подключения более одного микроконтроллера к шине означает, что более чем один ведущий может попытаться начать пересылку в один и тот же момент времени. Для устранения хаоса, который может возникнуть в данном случае, разработана процедура арбитража. Эта процедура основана на том, что все I 2 C-устройства подключаются к шине по правилу монтажного И. Подробнее об арбитраже см. Раздел 7.0.

    Генерация синхросигнала - это всегда обязанность ведущего; каждый ведущий генерирует свой собственный сигнал синхронизации при пересылке данных по шине. Сигнал синхронизации может быть изменен только если он “вытягивается” медленным ведомым устройством (путем удержания линии в низком состоянии), или другим ведущим, если происходит столкновение.

    4.0 Общие параметры

    Как SDA, так и SCL являются двунаправленными линиями, подсоединенными к положительному источнику питания через подтягивающий резистор (см. Рис 4). Когда шина свободна, обе линии находятся в ВЫСОКОМ положении. Выходные каскады устройств, подключенных к шине, должны иметь открытый сток или открытый коллектор для обеспечения функции монтажного И. Данные по шине I 2 C могут передаваться со скоростю до 100 кбит/с в стандартном режиме, и до 400 кбит/с в “быстром” режиме. Количество устройств, подключенных к шине, определяется единственным параметром - емкостью линии (до 400 пф).

    Рисунок 4. Подключение I 2 C-устройств к шине

    1. SDA (линия данных)
    2. SCL (линия синхронизации)
    3. Выход синхронизации
    4. Вход синхронизации
    5. Выход данных
    6. Вход данных
    7. Подтягивающие резисторы
    8. Напряжение питания

    5.0 Пересылка бита

    Вследствие различных технологий микросхем (КМОП, НМОП, биполярная), которые могут быть подключены к шине, уровни логического нуля (“НИЗКИЙ”) и логической еденицы (“ВЫСОКИЙ”) не фиксированы и зависят от соответствующего уровня Vdd (см. Раздел 15.0 для электрических параметров). Один синхроимпульс генерируется на каждый пересылаемый бит.

    5.1 Валидность данных

    Данные на линии SDA должны быть стабильными в течение ВЫСОКОГО периода синхроимпульса. ВЫСОКОЕ или НИЗКОЕ состояние линии данных должно меняться, только если линия синхронизации в состоянии НИЗКОЕ (см. Рис 5).

    Рисунок 5. Пересылка бита в шине I 2 C

    1. Линия данных находится в стабильном состоянии, данные определены
    2. Допускается изменение данных

    5.2 Сигналы START и STOP

    Специальные ситуации на шине отмечают сигналы START и STOP (см. Рис 6).

    Переход линии SDA из ВЫСОКОГО состояния в НИЗКОЕ, в то время как SCL находится в ВЫСОКОМ состоянии означает START.

    Переход линии SDA из НИЗКОГО состояния в ВЫСОКОЕ при SCL в ВЫСОКОМ состоянии означает STOP.

    Сигналы СТАРТ и СТОП всегда вырабатываются ведущим. Считается, что шина занята после сигнала СТАРТ. Шина считается освободившейся через определенное время после сигнала СТОП.

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

    Рисунок 6. Сигналы СТАРТ и СТОП

    1. Сигнал СТАРТ
    2. Сигнал СТОП

    6.1 Формат байта

    Каждый байт, передаваемый по линии SDA, должен состоять из 8 бит. Количество байт, передаваемых за один сеанс связи неограничено. Каждый байт должен оканчиваться битом подтверждения. Данные передаются, начиная с наиболее значащего бита (см. Рис. 7). Если приёмник не может принять еще один целый байт, пока он не выполнит какую-либо другую функцию (например, обслужит внутреннее прерывание), он может удерживать линию SCL в НИЗКОМ состоянии, переводя передатчик в состояние ожидания. Пересылка данных продолжается, когда приёмник будет готов к следующему байту и отпустит линию SCL.

    В некоторых случаях, необходимо использовать другой формат данных (например, CBUS). Посылка, которая передается с таким адресом, может быть закончена выдачей сигнала СТОП, даже если это происходит во время передачи байта. В этом случае подтверждение не генерируется (см. Раздел 9.1.3).

    Рисунок 7. Пересылка данных по шине I 2 C

    1. Сигнал СТАРТ
    2. Старший разряд байта
    3. Сигнал подтверждения от приёмника
    4. Прием байта завершен. Прерывание внутри приемника
    5. Синхролиния удерживается в низком состоянии, пока обслуживается прерывание
    6. Сигнал подтверждения от приемника
    7. Сигнал СТОП

    6.2 Подтверждение

    Подтверждение при передаче данных обязательно. Соответствующий испульс синхронизации генерируется ведущим. Передатчик отпускает (ВЫСОКОЕ) линию SDA в течение синхроимпульса подтверждения. Приёмник должен удерживать линию SDA в течение ВЫСОКОГО состояния синхроимпульса подтверждения в стабильно НИЗКОМ состоянии (рис. 8). Конечно, время установки и удержания также должны быть приняты во внимание (Электрические и временные параметры).

    Обычно, приёмник, который был адресован, обязан генерировать подтверждение после каждого принятого байта, исключая те случаи, когда посылка начинается с адреса CBUS (см. Совместимость с CBUS).

    В том случае, когда ведомый-приёмник не может подтвердить свой адрес (например, когда он выполняет в данный момент какие-либо функции реального времени), линия данных должна быть оставлена в ВЫСОКОМ состоянии. После этого ведущий может выдать сигнал СТОП для прерывания пересылки данных.

    Если ведомый-приёмник подтвердил свой адрес, но через некоторое время больше не может принимать данные, ведущий также должен прервать пересылку. Для этого ведомый не подтверждает следующий байт, оставляет линию данных в ВЫСОКОМ состоянии и ведущий генерирует сигнал СТОП.

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

    Рисунок 8. Подтверждение

    1. Данные, переданные передатчиком
    2. Данные, переданные приёмником
    3. SCL от ведущего
    4. Сигнал СТАРТ
    5. Синхроимпульс подтверждения

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

    При передаче посылок по шине I 2 C каждый ведущий генерирует свой синхросигнал на линии SCL. Данные действительны только во время ВЫСОКОГО состояния синхроимпульса.

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

    Это состояние линии SCL удерживается до тех пор, пока не будет достигнуто ВЫСОКОЕ состояние внутреннего синхросигнала одного из устройств (рис. 9). Однако, переход из НИЗКОГО состояния в ВЫСОКОЕ синхросигнала может не вызвать аналогичный переход на линии SCL, если синхросигнал другого устройства все еще находится в НИЗКОМ состоянии. Таким образом, линия SCL будет находиться в НИЗКОМ состоянии на протяжении самого длинного НИЗКОГО периода из двух синхросигналов. Устройства с более коротким НИЗКИМ периодом будут входить в состояние ожидания на время, пока не кончится длинный период.

    Когда у всех задействованных устройств кончится НИЗКИЙ период синхросигнала, линия SCL перейдет в ВЫСОКОЕ состояние. Все устройства начнут проходить ВЫСОКИЙ период своих синхросигналов. Первое устройство, у которого кончится этот период, снова установит линию SCL в НИЗКОЕ состояние.

    Таким образом, НИЗКИЙ период синхролинии SCL определяется наидлиннейшим периодом синхронизации из всех задействованных устройств, а ВЫСОКИЙ период определяется самым коротким периодом синхронизации устройств.

    Рисунок 9. Синхронизация во время арбитража

    1. Состояние ожидания
    2. Начало отсчета ВЫСОКОГО периода синхроимпульса

    7.2 Арбитраж

    Ведущий может начинать пересылку данных только если шина свободна. Два и более ведущих могут сгенерировать сигнал СТАРТ за время минимального удерживания (Thd;sta), что ведет к определенному сигналу СТАРТ на шине.

    Арбитраж происходит на шине SDA, в периоды, когда шина SCL находится в ВЫСОКОМ состоянии. Если один ведущий передает на линию данных НИЗКИЙ уровень, в то время как другой - ВЫСОКИЙ, то последний отключается от линии, так как состояние SDL (НИЗКОЕ) не соответствует ВЫСОКОМУ состоянию его внутренней линии данных.

    Арбитраж может продолжаться на протяжении нескольких бит. Так как сначала передается адрес, а потом данные (см. Разделы 7-битная адресация и 10-битная адресация), то арбитраж может продолжаться до окончания адреса, а если ведущие адресуют одно и то же устройство, то в арбитраже будут участвовать и данные. Вследствие такой схемы арбитража при столкновении данные не теряются.

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

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

    Рисунок 10 показывает процедуру арбитража двух ведущих. Конечно, большее количество ведущих может быть вовлечено в процесс. В момент, когда обнаруживается различие между уровнем внутренней линии данных и SDA, выход первого ведущего принимает ВЫСОКОЕ значение, не влияя таким образом на пересылку данных выигравшего ведущего.

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

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

    • повторным сигналом СТАРТ и битом данных
    • сигналом СТОП и битом данных
    • повторным сигналом СТАРТ и сигналом СТОП

    Рисунок 10. Арбитраж между двумя ведущими

    * передатчик 1 проигрывает арбитраж - его линия данных не совпадает с SDA

    7.3 Использование механизма синхронизации как процедуры управления связью

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

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

    На уровне битов, устройство такое как микроконтроллер без встроенных аппаратных цепей I2C или с ограниченными цепями может замедлить частоту синхроимпульсов путем продления их НИЗКОГО периода. Таким образом скорость передачи любого ведущего адаптируется к скорости медленного устройства.

    Рисунок 11. Посылка данных

    1. Сигнал СТАРТ
    2. Адрес
    3. Бит направления (R/W^)
    4. Подтверждение
    5. Данные
    6. Сигнал СТОП

    8.0 Форматы с 7-битным адресом

    Посылки данных происходят в формате, показанном на рис. 11. После сигнала СТАРТ посылается адрес ведомого. После 7 бит адреса следует бит направления данных (R/W^), “ноль” означает передачу (запись), а “единица” - прием (чтение). Пересылка данных всегда заканчивается сигналом СТОП, генерируемым ведущим. Однако, если ведущий желает оставаться на шине дальше, он должен выдать повторный сигнал СТАРТ и затем адрес следующего устройства. При таком формате посылки возможны различные комбинации чтения/записи.

    Возможные форматы:

    • Ведущий-передатчик передает ведомому-приёмнику. Направление пересылки данных не изменяется
    • Ведущий читает ведомого немедленно после пересылки первого байта (рис. 13). В момент первого подтверждения ведущий-передатчик становится ведущим-приёмником и ведомый-приёмник становится ведомым-передатчиком.
    • Подтверждение тем не менее генерируется ведомым. Сигнал СТОП генерируется ведущим
    • Комбинированный формат (рис. 14). При изменении направления пересылки данных повторяется сигнал СТАРТ и адрес ведомого, но бит направления данных инвертируется. Если ведущий-приёмник посылает повторный сигнал СТАРТ, он обязан предварительно послать сигнал неподтверждения.

    Рисунок 12. Ведущий-передатчик адресует ведомого-приемника 7-битным адресом. Направление пересылки не изменяется

    1. От ведущего к ведомому
    2. От ведомого к ведущему
    3. Адрес ведомого
    4. Бит направления
    5. Данные
    6. Пересылаемые данные (n байт + подтверждение)
    7. А - Подтверждение
    8. Неподтверждение
    9. Сигнал СТАРТ
    10. Сигнал СТОП

    Рисунок 13. Ведущий читает из ведомого непосредственно после первого байта

    Рисунок 14. Комбинированный формат

    1. Адрес ведомого
    2. Чтение или запись
    3. n байтов + подтверждения
    4. Сигнал повторного СТАРТА
    5. Направление пересылки может измениться в этой точке
    6. Направление пересылки данных и битов подтверждения зависит от битов направления

    ПРИМЕЧАНИЯ:

    1. Комбинированные форматы могут быть использованы, например, для управления последовательной памятью. Во время первого байта данных можно передавать адрес в памяти, который записывается во внутреннюю защелку. После повторения сигнала СТАРТа и адреса ведомого выдаются данные из памяти.
    2. Все решения об авто-инкременте или декременте адреса, к которому произошел предыдущий доступ, принимаются конструктором устройства
    3. Каждый байт завершается битом подтверждения, обозначенным А или А^ на рисунках
    4. I 2 C-совместимые устройства должны сбрасывать логику шины при получении сигнала СТАРТ или повторный СТАРТ и подготавливаться к приему адреса.

    9.0 7-битная адресация

    (см. 10-битная адресация).

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

    9.1 Назначение битов первого байта

    Первые семь битов первого байта образуют адрес ведомого (см. Рис 15). Восьмой, младший бит, определяет направление пересылки данных. “Ноль” означает, что ведущий будет записывать информацию в выбранного ведомого. “Единица” означает, что ведущий будет считывать информацию из ведомого.

    Рисунок 15. Первый байт после сигнала СТАРТ

    1. Старший разряд
    2. Младший разряд
    3. Адрес ведомого

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

    Адрес ведомого может состоять из фиксированной и программируемой частей. Вероятно, что в системе будет несколько таких одинаковых устройств, поэтому при помощи программируемой части адреса становится возможным подключить к шине максимально возможное количество таких устройств. Количество программируемых бит в адресе зависит от количества свободных выводов микросхемы. Например, если устройство имеет 4 фиксированных и 3 программируемых адресных битов, всего 8 одинаковых устройств может быть подключено к шине.

    Комитет I 2 C координирует выделение I 2 C адресов. Дальнейшая информация может быть получена у представителей Philips, указанных на обложке. Две группы по восемь адресов (0000ХХХ и 1111ХХХ) зарезервированы для целей, указанных в таблице 2. Комбинация бит 11110ХХ адреса зарезервирована для 10-битной адресации (см. Раздел 13.0).

    Примечания:

    1. Устройствам запрещается подтверждать прием байта СТАРТА
    2. Адрес CBUS зарезервирован для того, чтобы можно было использовать CBUS-совместимые и I 2 C-совместимые устройства в одной системе. I 2 C-совместимым устройствам запрещается реагировать на прием этого адреса.
    3. Адрес, зарезервированный для шин другого формата также предназначен для смешанного использования различных протоколов. Отвечать на прием этого адреса могут только устройства, умеющие работать с другим форматом.

    9.1.1. Адрес общего вызова

    Адрес общего вызова адресует все устройства на шине. Однако, если устройству не нужны какие-либо данные, которые могут быть переданы по общему вызову, оно может игнорировать обращение путем не выдачи подтверждения. Если устройству нужны данные общего вызова, оно генерирует подтверждение и становится ведомым-приёмником. Второй и последующий байты должны подтверждаться каждым ведомым-приёмником, способным обработать эти данные. Есть ведомый не может обработать один из байтов, он не генерирует подтверждение. Значение посылки общего вызова всегда определяется вторым байтом (рис. 16).

    Существуют два варианта:

    • когда бит направления второго байта равен нулю
    • когда бит направления второго байта равен единице

    Когда бит “0” второй байт обладает следующим значением:

    • 00000110. Сбросить устройство и записать программируемую часть адреса. При получении этой посылки все устройства сбрасываются и перечитывают программируемую часть их адресов. Перед выдачей команды необходимо убедиться, что устройства после подачи питания не удерживают линии шины в низком состоянии
    • 00000100. Записать программируемую часть адреса. Все устройства, имеющие возможность задания программируемой части адреса защелкивают текущее значение адреса при принятии этой команды. Устройства не сбрасываются
    • 00000000. Этот код недопустим для использования в качестве второго байта

    Последовательности процедуры программирования опубликованы в соответствующих ТУ.

    Остальные коды не установлены и устройства должны игнорировать их.

    Когда бит “1” двухбайтовая последовательность называется “аппаратный общий вызов”. Это означает, что последовательность передана аппаратным ведущим устройством (таким как сканер клавиатуры), которое не может быть запрограммировано на выдачу конкретного адреса ведомого. Поскольку аппаратный ведущий не знает, какому устройству передается посылка, он может только сгенерировать аппаратный общий вызов и свой собственный адрес - идентифицируя себя для системы (рис. 17).

    Семь битов, остающихся во втором байте, содержат адрес аппаратного ведущего. Этот адрес распознается умным устройством (микроконтроллером), которое потом будет получать информацию от аппаратного ведущего. Если последний также может работать как ведомый, его адрес совпадает с адресом ведущего.

    С другой стороны в некоторых системах аппаратный ведущий-передатчик устанавливается в режим ведомого-приёмника сразу после сброса. Таким способом, ведущий, конфигурирующий систему, может сообщить аппаратному ведущему (который находится в режиме ведомый-приемник), на какой адрес должны посылаться данные (рис. 18) После этой процедуры аппаратный ведущий остаётся в режиме ведущий-передатчик.

    Рисунок 16. Формат адреса общего вызова

    1. Первый байт
    2. Второй байт
    3. Младший разряд

    Рисунок 17. Пересылка данных из аппаратного ведущего-передатчика

    1. Адрес общего вызова
    2. Второй байт
    3. N байт + подтверждение

    Рисунок 18. Передача данных аппаратным ведущим, способным пересылать данные непосредственно ведомым устройствам
    (а) Конфигурирующий ведущий посылает адрес начала данных к аппаратному ведущему
    (b) Аппаратный ведущий посылает данные выбранному ведомому

    1. Адрес аппаратного ведущего
    2. Запись
    3. Адрес начала данных для аппаратного ведущего
    4. Адрес начала данных от аппаратного ведущего
    5. n байт + подтверждение

    9.1.2 Байт СТАРТА

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

    В этом случае посылка данных может начинаться со стартовой процедуры, которая много дольше, чем обычный сигнал СТАРТ (рис. 19). Процедура старта состоит из

    • Сигнала СТАРТ
    • Байта СТАРТА
    • Импульса подтверждения
    • Повторного сигнала СТАРТ

    Ведущий-передатчик после обычного сигнала СТАРТ передает байт СТАРТА (00000001). Микроконтроллер поэтому может отслеживать линию SDA с меньшей частотой, пока не обнаружит последовательность из семи нулей, по сути - НИЗКИЙ уровень на SDA на протяжении семи тактовых импульсов. После обнаружения этой последовательности микроконтроллер может переключится на более высокую частоту опроса шины, для того чтобы обнаружить повторный сигнал СТАРТ.

    Аппаратный приёмник I 2 C сбросится при приёме повторного сигнала СТАРТ и поэтому проигнорирует байт СТАРТА.

    После байта СТАРТА генерируется тактовый импульс для подтверждения. Он присутствует только для совместимости с форматом байта. Устройствам запрещается подтверждать прием байта СТАРТА.

    9.1.3 Совместимость с CBUS

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

    В смешанной шине I 2 C-совместимые устройства не должны отвечать на посылки формата CBUS. Для этого зарезервирован специальный адрес CBUS (0000001Х). После передачи адрес CBUS линия DLEN может быть сделана активной и посылается посылка формата CBUS (рис. 20). После сигнала СТОП все устройства опять готовы принимать данные.

    Ведущие-передатчики могут посылать данные в CBUS формате после посылки адреса CBUS. Передача заканчивается сигналом СТОП, распознаваемым всеми устройствами.

    ПРИМЕЧАНИЕ:
    Если конфигурация шины CBUS известна и расширение CBUS-совместимых устройств не предусматривается, конструктору разрешается устанавливать время удержания (??? DLEN?), руководствуясь конкретными требованиями используемых устройств.

    Рисунок 19. Процедура байта СТАРТА

    1. Байт СТАРТА
    2. Фальшивое подтверждение (ВЫСОКОЕ)
    3. Сигнал СТАРТ (S)
    4. Сигнал повторный СТАРТ (Sr)

    Рисунок 20. Формат данных при посылках с CBUS передатчиком/приемником

    1. Сигнал СТАРТ
    2. Адрес CBUS
    3. Бит направления передачи
    4. Синхроимпульс подтверждения
    5. n бит данных
    6. Сигнал СТОП

    10.0 Электрические параметры устройств I 2 C

    Электрические параметры ввода/вывода I2C-совместимых устройств и характеристики подключенных к ним линий шины приведены в таблицах 3 и 4 раздела 15.0

    I 2 C-устройства с фиксированными входными уровнями 1.5 В и 3 В могут иметь свои собственные питающие напряжения. Подтягивающие резисторы должны быть подключены к источнику 5 В ± 10% (рис. 21). I2C-устройства с входными уровнями, зависящими от напряжения питания должны иметь одну общую линию питания, к которой также должен быть подключен подтягивающий резистор (рис. 22).

    Когда устройства с фиксированным входным уровнем смешаны с устройствами с относительным входным уровнем, последние должны быть подключены к одной общей линии питания 5 В ±10% и должны иметь подтягивающие резисторы, подключенные к SDA и SCL контактам как показано на рис 23.

    Входные уровни определяются следующим образом:

    • шумовая граница НИЗКОГО уровня есть 0.1 от напряжения питания
    • шумовая граница ВЫСОКОГО уровня есть 0.2 от напряжения питания

    Как показано на рис. 24, последовательно включенные резисторы Rs (например, 300 Ом) могут быть использованы для защиты от высоковольтных выбросов напряжения на линиях шины.

    Рисунок 21. Подключение устройств с фиксированным входным уровнем к шине I 2 C

    Рисунок 22. Подключение устройств с широким диапазоном питания к шине I 2 C

    Рисунок 23. Подключение устройств с относительным (Vdd1) уровнем входного напряжения и фиксированным входным уровнем (Vdd2-4) к шине I 2 C

    Рисунок 24. Последовательные резисторы Rs для защиты от высоковольтных выбросов

    10.1 Максимальные и минимальные значения для резисторов Rp и Rs

    Для I 2 C-устройств в стандартном режиме величины резисторов зависят от следующих параметров:

    • Напряжение питания
    • Емкость шины
    • Количество подключенных устройств (входной ток + ток утечки)

    Величина питающего напряжения ограничивает минимальное значение Rp вследствие ограниченного минимального тока выходных каскадов (3 мА) при Volmax=0.4 В. Vdd как функция Rpmin показана на рис. 25.
    Желаемая шумовая граница 0.1Vdd для НИЗКОГО уровня ограничивает максимальное значение Rs. Rsmax как функция от Rp показано на рис. 25.

    Емкость шины состоит из общей емкости проводов, подключенных портов и контактов. Эта емкость ограничивает максимальное значение Rp вследствие ограничений на время установления (фронта). Рис. 27 показывает Rpmax как функцию от емкости шины.

    .

    Рисунок 28. Общий ток при напряжении ВЫСОКОГО уровня как функция максимального значения Rp при параметре - Vdd

    11.0 Дополнения к спецификации шины I 2 C

    Шина I 2 C со скоростью передачи данных 100 кбит/с и 7-битным адресом существует уже на протяжении более 10 лет в неизменном виде. Концепция принята повсеместно как стандарт для сотен типов микросхем, выпускаемых фирмой Philips и другими поставщиками. В настоящее время спецификация шины I 2 C дополнена следующими вещами:

    • Быстрый режим, позволяющий в четыре раза увеличить скорость передачи данных
    • 10-битная адресация, позволяющая использовать 1024 дополнительных адресов

    Существуют две причины, ради которых были сделаны эти дополнения:

    • Новые приложения нуждаются в пересылке больших объемов информации, следовательно требуется большая пропускная способность шины. Улучшенная технология производства микросхем позволила в четыре раза увеличить скорость передачи данных без изменения себестоимости изделия.
    • Большинство из 112 адресов, допустимых при 7-битной адресации, уже были использованы более чем один раз. Для предотвращения проблем с размещением адресов новых устройств, желательно иметь большее количество адресных комбинаций. Примерно десятикратное увеличение количества доступных адресов получено при использовании новой 10-битной адресации.

    Все новые устройства с I 2 C интерфейсом работают в быстром режиме. Предпочтительно, они должны уметь принимать и/или передавать данные на скорости 400 кбит/с. Как минимум они должны быть способны входить в синхронизацию в быстром режиме, с тем чтобы снизить скорость передачи (путем удлиннения НИЗКОГО периода SCL) до допустимой величины. Быстрые устройства должны быть совместимы снизу-вверх, что означает их способность работать со стандартными устройствами по медленной шине.

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

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

    Устройства с 7-битным и 10-битным адресами могут одновременно использоваться на одной шине, независимо от скорости передачи. Как существующие, так и будущие ведущие смогут генерировать и 7-битные, и 10-битные адреса.

    12.0 Быстрый режим

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

    • максимальная скорость передачи возросла до 400 кбит/с
    • Синхронизация SDA и SCL линий была изменена. Не требуется совместимости с CBUS-устройствами, так как они не могут работать на высоких скоростях
    • Входные цепи быстрых устройств должны иметь встроенное подавление выбросов и триггер Шмитта на обоих линиях
    • Выходной буфер быстрых устройств должен иметь каскад с управлением временем заднего фронта линий SDA и SCL
    • Если источник напряжения питания быстрых устройств выключается, линии должны переходить в третье состояние
    • Внешние подтягивающие устройства, подключенные к линиям шины должны быть изменены для обеспечения допустимого времени нарастания переднего фронта. Для нагрузок шины до 200 пФ это подтягивающее устройство может быть простым резистором, а для нагрузок от 200 пФ до 400 пФ это должен быть источник тока (3 мА максимум) или схема на переключаемых резисторах, показанная на рис. 37

    13.0 10-битная адресация

    10-битная адресация не меняет формат шины. Для этого используется зарезервированная адресная комбинация 1111ХХХ первых семи бит первого байта (см. Раздел 9.1 ). 10-битная адресация не влияет на существующую 7-битную адресацию. Устройства с 7-битной и 10-битной адресацией могут быть подключены к одной шине.

    Хотя имеются восемь возможных комбинаций последовательности 1111ХХХ, из них используются только четыре - 11110ХХ. Комбинации типа 11111ХХ зарезервированы для дальнейших улучшений шины.

    13.1 Назначение битов первых двух байтов

    10-битный адрес формируется из первых двух байтов. Первые семь бит первого байта являются комбинацией вида 11110ХХ, где два младших бита (ХХ) являются двумя старшими (9 и 8) битами 10-битного адреса; восьмой бит первого байта - бит направления. “Ноль” в этом бите означает, что ведущий собирается записывать информацию в ведомого, а “единица” - что ведущий будет считывать информацию из ведомого.

    Если бит направления равен “нулю”, то второй байт содержит оставшиеся 8 бит 10-битного адреса. Если бит направления равен “единице”, то следующий байт содержит данные, переданные с ведомого ведущему.

    13.2 10-битные форматы

    Возможны различные комбинации форматов 10-битных посылок:

    • Ведущий-передатчик передает информацию ведомому-приемнику (рис 29). Направление пересылки не меняется. Когда за сигалом СТАРТ появляется начало 10-битного адреса, каждый ведомый на шине сравнивает первые семь бит первого байта со своим собственным адресом и удостоверяется, что бит направления равен “нулю”. Допустимо, чтобы более одного устройства обнаружили совпадение и сгенерировали сигнал подтверждения (А1). Все ведомые с совпавшими адресами продолжают сравнивать последующие 8 бит адреса, и только одно устройство обнаруживает совпадение и генерирует подтверждение (А2). Это устройство остается выбранным, пока ведущий не пошлет сигнал СТОП или сигнал повторного СТАРТА с другим адресом.
    • Ведущий-приемник принимает данные от ведомого-передатчика. Направление передачи меняется после второго бита направления (рис. 30). Процедура идентична вышеописанной вплоть до момента второго подтверждения (А2). Далее передается сигнал повторного СТАРТА. Выбранный ведомый помнит, что был адресован ранее. Этот ведомый сравнивает первые семь бит адреса со своим адресом, а также удостоверяется, что бит направления равен “единице”. При совпадении ведомый полагает, что он адресован как передатчик и генерирует подтверждение (А3). Ведомый-передатчик остается адресованным до прихода сигнала СТОП или сигнала повторного СТАРТА с другим адресом. После сигнала повторного СТАРТА все другие устройства также сравнивают первые семь бит со своим адресом и проверяют бит направления. Однако, ни одно из них не адресуется, так как бит направления равен “единице” (для 10-битных устройств), или такого адреса не существует (для 7-битных устройств).
    • Комбинированный формат. Ведущий передает данные ведомому, а потом читает данные с этого же ведомого (рис 31). Один ведущий занимает шину на все время пересылки. Направление пересылки меняется после второго бита направления
    • Комбинированный формат. Ведущий передает данные одному ведомому, а потом передает данные другому ведомому (рис. 32). Один ведущий занимает шину на все время пересылки
    • Комбинированный формат. 10-Битная и 7-битная адресация применяются в одной посылке (рис. 33). После каждого сигнала СТАРТ или повторный СТАРТ передается 10-битный или 7-битный адрес. Рисунок 33 показывает, как ведущий передает данные ведомому с 7-битным адресом, а потом передает данные второму ведомому с 10-битным адресом. Один ведущий занимает шину на все время пересылки.

    Рисунок 32. Комбинированный формат. Ведущий передает данные двум ведомым, оба 10-битные

    1. Адрес ведомого (первые 7 бит)
    2. Запись
    3. Адрес ведомого (второй байт)
    4. Данные
    5. Сигнал повторный СТАРТ
    6. Сигнал СТОП

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

    Этот недостаток отсутствует у интерфейса I 2 C (Inter-Integrated Circuit) . Он был первоначально разработан фирмой Philips в конце 1970-х годов специально для того, чтобы обеспечивать такой способ подключения периферийных устройств к микропроцессорам, который не требовал бы использования традиционных шин адреса, данных и управления, а кроме того, позволял бы нескольким микропроцессорам работать с одними и теми же периферийными устройствами (multimastering ). Philips запатентовал название интерфейса и до 2007 у различных производителей этот микроконтроллер имел свое название. Например, в микроконтроллерах ATmega, на которых строится Arduino, этот интерфейс носит название 2-wire Serial Interface (двухпроводной последовательный интерфейс).

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

    Интерфейс I 2 C использует всего две линии — они именуются SCL (Serial Clock ) и SDA (Serial Data ). Первая предназначена для передачи синхроимпульсов (они формируются тем устройством, которое в настоящий момент передает данные), а вторая — для передачи самих данных и команд, управляющих этим процессом. Обе линии имеют открытый коллектор (как и во многих других случаях, когда необходимо, чтобы к одной линии мого подключаться несколько различных устройств), поэтому требуют подключения «подтягивающих» резисторов сопротивлением 1-10 кОм.

    Для примера на рисунке ниже показана структурная схема устройства управления стереосистемой.

    Устройство управления стереосистемой на основе интерфейса I 2 C

    В обмене информацией по шине I 2 C всегда принимают участие два устройства — ведущее (master , задатчик) и ведомое . Ведущее устройство вырабатывает синхроимпульсы, а принимать или передавать данные может как задатчик, так и ведомое устройство.

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

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

    Начало и конец передачи данных по интерфейсу I 2 C

    Затем начинается передача данных от ведущего устройства к ведомому (slave ) или наоборот, но в любом случае источником синхроимпульсов является задатчик. Данные фиксируются приемником по заднему фронту синхроимпульсов.

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

    В отличие от интерфейса RS-232 , передача данных производится начиная со старшего бита; при этом используются обычные логические уровни микросхем ТТЛ/КМОП. После передачи последнего (восьмого) бита каждого байта во время действия очередного синхроимпульса передатчик отключается от линии SDA , чтобы дать возможность приемнику подтвердить получение данных. Для этого приемник должен выставить на линии SDA сигнал низкого уровня. Перед посылкой очередного бита сигнал низкого уровня действует на обеих линиях. Временные диаграммы на рисунке ниже иллюстрируют процесс передачи одного байта данных по интерфейсу I 2 C .

    Передача данных по интерфейсу I 2 C

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

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

    Cуществуют три максимальные скорости передачи. В так называемом стандартном режиме это 100 Кбит/с (частота синхроимпульсов 100 кГц), в быстром режиме — 400 Кбит/с (частота синхроимпульсов 400 кГц), в высокоскоростном режиме - 3.4 Мбит/с и в ультравысокоскоростном режиме — до 5 Мбит/с. Правда, устройств, работающих на мегабитных скоростях еще нужно поискать. Помимо скоростных ограничений, есть и ограничения на максимальное количество подключенных к шине I 2 C устройств. В стандартном режиме можно адресовать 127 устройств (7-битный адрес), в быстром режиме до 1023 устройств (10-битный адрес). На рисунке ниже показаны минимальные временные задержки для обоих режимов (все значения указаны в микросекундах).

    Минимальные временные задержки для двух режимов передачи данных по интерфейсу I 2 C

    На рисунке ниже показан формат команд, используемых для управления процессом передачи данных по интерфейсу I 2 C .

    Формат управляющих команд интерфейcа I 2 C

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

    В некоторых случаях требуется чуть усложнять протокол обмена. Например, при чтении информации из памяти EEPROM (или записи данных в память) задатчик должен сначала установить стартовую последовательность, чтобы переслать адрес нужной ячейки памяти, а затем снова выполнить стартовую последовательность, чтобы теперь уже считать данные из памяти (или записать их).

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

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

    Реализация интерфейса I 2 C с помощью микроконтроллеров весьма проста. Однако, из-за программной его реализации трудно достичь высоких скоростей передачи. Даже максимальная скорость стандартного режима (100 Кбит/с) может оказаться недостижимой.

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

    Полную спецификацию и руководство пользователя для шины I2C можно скачать по ссылке:

    Category: Documents
    Date: 04.03.2015

    Преимущества интерфейса I 2 C

    • необходим всего один микроконтроллер для управления набором устройств;
    • используется всего два проводника для подключения многих устройств;
    • возможна одновременная работа нескольких ведущих (master ) устройств, подключенных к одной шине I 2 C ;
    • стандарт предусматривает «горячее» подключение и отключение устройств в процессе работы системы;
    • встроенный в микросхемы, реализующие интерфейс фильтр подавляет всплески, обеспечивая целостность данных.

    Недостатки интерфейса I 2 C

    • ограничение на ёмкость линии - 400 пФ;
    • несмотря на простоту протокола, программирование контроллера I 2 C затруднено из-за изобилия возможных нештатных ситуаций на шине. По этой причине большинство систем используют I²C c единственным ведущим (master ) устройством и распространённые драйверы поддерживают только монопольный режим обмена по I 2 C;
    • Трудность локализации неисправности, если одно из подключенных устройств ошибочно устанавливает на шине состояние низкого уровня.

    Интерфейс 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 является широко распространенным и популярным стандартом передачи данных между устройствами. Данный интерфейс поддерживают множество различных датчиков и микросхем, наиболее известные это микросхемы EEPROM памяти серии 24cXX. Для передачи данных используются всего две линии, которые представляют собой шину данных, причем на одну шину можно подключать несколько различных устройств. В этой статье я приведу описание интерфейса и реализацию на программном уровне.

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

    Способ подключения

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


    В случае использования микроконтроллера, для установки лог. 1 на линии, достаточно перенастроить порт микроконтроллера на вход, при этом резистор “подтянет” линию к высокому логическому уровню, подача высокого логического уровня с порта микроконтроллера на линию не допускается. Для установки лог. 0 на линии, порт перенастраивается на выход, в выходную защелку заранее записывается значение 0, при этом линия “прижимается” к низкому логическому уровню.

    Адресация

    В интерфейсе предусмотрена программная адресация устройств подключенных к шине, наиболее распространена длина адреса в 7 бит, теоретически это позволяет подключать на шину до 127 устройств, но часть адресов по спецификации зарезервированы и не могут использоваться разработчиками. Каждое устройство имеет свой уникальный адрес, который заложен производителем и указан в технической документации. Адрес устройства может быть фиксированным, или с возможностью аппаратной настройки, в этом случае устройство имеет дополнительные входы, в зависимости от уровня напряжения на входах (высокое или низкое), можно получить различные адреса. Обычно количество входов варьируется от 1-го до 3-х, которые задают значения определенных битов 7-битного адреса. Аппаратная настройка адреса предусмотрена для возможности подключения нескольких однотипных устройств на одну шину.

    Также интерфейс предусматривает более редкую 10-битную адресацию, под которую зарезервирован 7-битный адрес 11110XX (XX-зависят от значения адреса), в этом случае сначала предается зарезервированный адрес, в котором два последних бита представляют собой старшие биты 10-битного адреса, затем передаются младшие 8 бит адреса. При использовании данной адресации на шину можно подключать более 1000 устройств.

    Условия “Старт” и “Стоп”

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

    Аналогично, сеанс передачи данных завершается специальным условием “Стоп”, это переключение линии SDA с низкого логического уровня на высокий, при высоком уровне на линии SCL. Данные условия генерирует ведущий (микроконтроллер).

    Исходя из условий “Старт” и “Стоп”, во время передачи данных линия SDA может переключаться только при низком уровне на линии SCL, то есть установка новых данных на линии SDA возможна только после спада уровня на SCL. В течение импульса тактирования (высокий уровень на SCL), состояние линии SDA не должно меняться, в это время выполняется считывание данных на SDA.

    Формат передачи данных

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


    Сначала передается байт с 7-битным адресом ведомого, значение 8-го бита (R/W) определяет направление передачи данных, нулевое значение соответствует записи данных, то есть передача от ведущего к ведомому. Если бит направления равен 1, то выполняется чтение данных из ведомого.

    Ведомый сравнивает переданный адрес со своим и при совпадении откликается, устанавливая низкий уровень на линии SDA (бит подтверждения). Ведущий, получив подтверждение, начинает передавать байты с данными, или принимает их, в зависимости от направления передачи. На следующей картинке более подробно представлены различные варианты передачи данных по шине I2C:


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

    Запись одного байта состоит из следующей последовательности: условие “Старт” – адрес ведомого (бит R/W сброшен) – адрес внутреннего регистра ведомого – данные (1 байт) – условие “Стоп”. Запись нескольких байтов практически ничем не отличается, после отправки первого байта данных, передаются остальные байты, сеанс заканчивается условием “Стоп”. При этом данные записываются в регистры последовательно, начиная с заданного адреса, обычно ведомый выполняет автоматический инкремент адреса внутренних регистров.

    Для чтения одного байта данных, необходимо сначала передать адрес ведомого и адрес требуемого регистра, при этом бит направления должен быть сброшен на запись, после чего повторно передается условие “Старт”, затем снова адрес ведомого, в этот раз с установленным битом направления на чтение. Далее выполняется прием байта данных от ведомого, для окончания сеанса передачи ведущий не выдает подтверждения, то есть на линии SDA остается высокий уровень на время бита подтверждения, далее следует условие “Стоп”. Чтение нескольких байтов выглядит аналогично, ведущий выдает подтверждение после каждого принятого байта, за исключением последнего байта. Как и в случае записи, ведомый выполняет автоматический инкремент адреса, начиная с заданного.

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

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

    Скорость передачи данных

    По спецификации интерфейс поддерживает три скоростных режима передачи:

    1. Самый распространенный до 100 Кбит/сек, частота тактирования линии SCL до 100 кГц, длительность высокого и низкого уровней не менее 5 мкс.
    2. Скоростной режим до 400 Кбит/сек, частота тактирования до 400 кГц.
    3. Высокоскоростной режим до 3,4 Мбит/сек, частота тактирования до 3,4 МГц.

    Стандартный режим до 100 Кбит/сек поддерживают все устройства, возможность функционирования на больших скоростях необходимо уточнять в технической документации на устройство.

    Программная реализация интерфейса I2C

    Не у всех микроконтроллеров серии PIC16 имеется встроенный аппаратный модуль I2C, но интерфейс можно реализовать программно и использовать на любом микроконтроллере. Ниже представлен код реализующий функции ведущего применительно к микроконтроллеру PIC16F628A:

    #include LIST p=16F628A __CONFIG H"3F10" ;Конфигурация микроконтроллера errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге scetbit equ 0020h ;вспомогательный регистр счета кол-ва бит perem equ 0021h ;вспомогательный регистр приема/передачи байта adr_i2c equ 0022h ;регистр хранения адреса внутреннего регистра ведомого tmp_i2c equ 0023h ;регистр кол-ва передаваемых байт slave_adr equ 0024h ;регистр хранения адреса ведомого data_i2c equ 0025h ;начальный регистр хранения данных для передачи flag equ 007Fh ;регистр флагов #DEFINE sda PORTB,0 ;линия sda #DEFINE scl PORTB,1 ;линия scl #DEFINE sda_io TRISB,0 ;бит управления направлением линии sda #DEFINE scl_io TRISB,1 ;бит управления направлением линии scl ;flag,4 - флаг направления передачи (0 - чтение, 1 - запись) ;flag,5 - флаг окончания приема данных от ведомого;flag,6 - флаг ошибки передачи по интерфейсу I2C (отсутствие подтверждения от ведомого) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start movlw b"00000000" ;установка значений выходных защелок порта B movwf PORTB ; movlw b"00000111" ;выключение компараторов movwf CMCON ; bsf STATUS,RP0 ;выбрать 1-й банк movlw b"11111111" ;настройка линий ввода\вывода порта B movwf TRISB ;все линии на вход bcf STATUS,RP0 ;выбрать 0-й банк;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movlw b"01111110" ;запись адреса ведомого (0111111) в регистр slave_adr movwf slave_adr ; ;пример записи 2-х байт данных (числа 10 и 20) во внутренние регистры;устройства (ведомого) начиная с адреса 0x03, адрес ведомого 0111111 movlw 0x03 ;запись адреса внутреннего регистра ведомого в регистр adr_i2c movwf adr_i2c ;(для примера адрес внутреннего регистра ведомого равен 0x03) movlw .2 ;запись кол-ва передаваемых байт в регистр tmp_i2c movwf tmp_i2c ;(для примера передается 2 байта) movlw data_i2c ;установка начального регистра хранения данных для передачи movlw .10 ;запись числа 10 в первый регистр хранения movwf INDF ; , подготовка следующего регистра хранения movlw .20 ;запись числа 20 во второй регистр хранения movwf INDF ; call write_i2c ;вызов подпрограммы записи по интерфейсу I2C goto dalee_1 ;нет ошибки, переход на метку dalee_1 ................... ................... ;пример чтения 3-х байт данных из внутренних регистров устройства (ведомого) ;начиная с адреса 0x05, адрес ведомого был задан ранее 0111111 movlw 0x05 ;запись адреса внутреннего регистра ведомого в регистр adr_i2c movwf adr_i2c ;(для примера адрес внутреннего регистра ведомого равен 0x05) movlw .3 ;запись кол-ва принимаемых байт в регистр tmp_i2c movwf tmp_i2c ;(для примера принимается 3 байта) call read_i2c ;вызов подпрограммы чтения по интерфейсу I2C btfss flag,6 ;проверка ошибки передачи данных goto obrabotka ;нет ошибки, переход на метку obrabotka ................... ;обработка ошибки................... ; ................... ; obrabotka movlw data_i2c ;установка начального регистра хранения принятых данных movwf FSR ;с помощью косвенной аддресации movf INDF,W ;копирование первого принятого байта в аккумулятор................... ;обработка первого байта................... ; incf FSR,F ;инкремент регистра FSR movf INDF,W ;копирование второго принятого байта в аккумулятор................... ;обработка второго байта................... ; incf FSR,F ;инкремент регистра FSR movf INDF,W ;копирование третьего принятого байта в аккумулятор................... ;обработка третьего байта................... ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;подпрограмма чтения/записи по интерфейсу I2C write_i2c bsf flag,4 ;установка флага направления передачи (для записи) goto i2c_1 ;переход на метку i2c_1 read_i2c bcf flag,4 ;сброс флага направления передачи (для чтения) bcf flag,5 ;сброс флага окончания приема данных i2c_1 bcf flag,6 ;сброс флага ошибки I2C call starti2c ;вызов подпрограммы "Старт" bcf slave_adr,0 ;сброс бита R/W для операции записи goto err_i2c ;ошибка:переход на метку err_i2c movf adr_i2c,W ;адреса регистра ведомого I2C call peredi2c ;вызов подпрограммы передача байта btfsc flag,6 ;проверка флага ошибки movlw .0 ;проверка кол-ва передаваемых байт xorwf tmp_i2c,W ; btfss STATUS,Z ; goto i2c_3 ;кол-во передаваемых байт не равно 0: переход на метку i2c_3 call stopi2c ;кол-во передаваемых байт равно 0: вызов подпрограммы "Стоп" i2c_3 movlw data_i2c ;установка начального регистра хранения данных для передачи movwf FSR ;с помощью косвенной аддресации decf FSR,F ; btfss flag,4 ;проверка флага направления передачи goto rd_i2c ;флаг равен 0: переход на метку rd_i2c (чтение) i2c_2 incf FSR,F ;инкремент регистра FSR, подготовка следующего байта для передачи movf INDF,W ;копирование байта данных для передачи call peredi2c ;вызов подпрограммы передача байта btfsc flag,6 ;проверка флага ошибки goto err_i2c ;ошибка: переход на метку err_i2c decfsz tmp_i2c,F ;декремент счетчика кол-ва передаваемых байт goto i2c_2 ;счетчик не равен 0: переход на метку i2c_2 return ;выход из подпрограммы чтения/записи I2C ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; rd_i2c call starti2c ;вызов подпрограммы "Старт" (Повторный Старт) bsf slave_adr,0 ;установка бита R/W для операции чтения movf slave_adr,W ;копирование адреса ведомого call peredi2c ;вызов подпрограммы передача байта btfsc flag,6 ;проверка флага ошибки goto err_i2c ;ошибка: переход на метку err_i2c rd_i2c_2 decfsz tmp_i2c,F ;декремент счетчика кол-ва передаваемых байт goto rd_i2c_1 ;счетчик не равен 0: переход на метку rd_i2c_1 bsf flag,5 ;установка флага окончания приема данных от ведомого rd_i2c_1 incf FSR,F ;инкремент регистра FSR, подготовка следующего регистра для приема данных call priemi2c ;вызов подпрограммы приема байта movwf INDF ;сохранение принятого байта в регистр INDF btfss flag,5 ;проверка флага окончания приема данных от ведомого goto rd_i2c_2 ;флаг не равен 0: переход на метку rd_i2c_2 call stopi2c ;вызов подпрограммы "Стоп" return ;выход из подпрограммы чтения/записи I2C err_i2c call stopi2c ;вызов подпрограммы "Стоп" return ;выход из подпрограммы чтения/записи I2C ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; starti2c call scl_1 ;отпустить линию scl call sda_0 ;притянуть к 0 линию sda call pausi2c ;вызов подпрограммы паузы call scl_0 ;притянуть к 0 линию scl call pausi2c ;вызов подпрограммы паузы stopi2c call sda_0 ;притянуть к 0 линию sda call pausi2c ;вызов подпрограммы паузы call scl_1 ;отпустить линию scl stpi2c_1 call pausi2c ;вызов подпрограммы паузы btfss scl ;проверка линии SCL на занятость ведомого goto stpi2c_1 ;ведомый занят: переход на метку stpi2c_1 call sda_1 ;отпустить линию sda call pausi2c ;вызов подпрограммы паузы return ;возврат из подпрограммы sda_1 bsf STATUS,RP0 ;перенастройка линии sda на вход bsf sda_io ; bcf STATUS,RP0 ; return ;возврат из подпрограммы sda_0 bcf sda ;перенастройка линии sda на выход bsf STATUS,RP0 ; bcf sda_io ; bcf STATUS,RP0 ; return ;возврат из подпрограммы scl_1 bsf STATUS,RP0 ;перенастройка линии scl на вход bsf scl_io ; bcf STATUS,RP0 ; return ;возврат из подпрограммы scl_0 bcf scl ;перенастройка линии scl на выход bsf STATUS,RP0 ; bcf scl_io ; bcf STATUS,RP0 ; return ;возврат из подпрограммы;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма передачи байта по интерфейсу i2c peredi2c movwf perem ;сохранение передаваемых данных в регистр perem movlw .8 ;запись счетчика бит movwf scetbit ; prd_i2c_1 btfsc perem,7 ;опрос старшего бита передаваемого байта call sda_1 ;отпустить линию sda btfss perem,7 ;опрос старшего бита передаваемого байта call sda_0 ;притянуть к 0 линию sda call scl_1 ;отпустить линию scl prd_i2c_2 call pausi2c ;вызов подпрограммы паузы btfss scl ;проверка линии SCL на занятость ведомого goto prd_i2c_2 ;ведомый занят: переход на метку prd_i2c_2 call scl_0 ;притянуть к 0 линию scl call pausi2c ;вызов подпрограммы паузы rlf perem,F ;смещение содержимого регистра perem, подготовка бита для передачи decfsz scetbit,F ;декремент счетчика бит goto prd_i2c_1 ;счетчик не равен 0: переход на метку prd_i2c_1 call sda_1 ;отпустить линию sda call scl_1 ;отпустить линию scl prd_i2c_3 call pausi2c ;вызов подпрограммы паузы btfss scl ;проверка линии SCL на занятость ведомого goto prd_i2c_3 ;ведомый занят: переход на метку prd_i2c_3 movlw .20 ;запись счетчика времени (100 мкс) для приема подтверждения movwf scetbit ; prd_i2c_4 btfss sda ;опрос линии sda goto prd_i2c_5 ;низкий уровень на sda, подтверждение получено: переход на prd_i2c_5 decfsz scetbit,F ;высокий уровень на sda, декремент счетчика времени goto prd_i2c_4 ;счетчик не равен 0: переход на метку prd_i2c_4 bsf flag,6 ;счетчик равен 0, нет потверждения, устанавливаем флаг ошибки prd_i2c_5 call scl_0 ;притянуть к 0 линию scl call pausi2c ;вызов подпрограммы паузы return ;возврат из подпрограммы передачи байта;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;подпрограмма приема байта по интерфейсу i2c priemi2c movlw .8 ;запись счетчика бит movwf scetbit ; call sda_1 ;отпустить линию sda prm_i2c_1 rlf perem,F ;смещение содержимого регистра perem, подготовка для приема бита call scl_1 ;отпустить линию scl prm_i2c_2 call pausi2c ;вызов подпрограммы паузы btfss scl ;проверка линии SCL на занятость ведомого goto prm_i2c_2 ;ведомый занят: переход на метку prm_i2c_2 btfsc sda ;опрос линии sda bsf perem,0 ;установка 0-го бита регистра perem, принят бит=1 btfss sda ;опрос линии sda bcf perem,0 ;сброс 0-го бита регистра perem, принят бит=0 call scl_0 ;притянуть к 0 линию scl call pausi2c ;вызов подпрограммы паузы decfsz scetbit,F ;декремент счетчика бит goto prm_i2c_1 ;счетчик не равен 0: переход на метку prm_i2c_1 btfss flag,5 ;проверка флага окончания приема данных от ведомого call sda_0 ;флаг равен 0, прием не окончен, притянуть к 0 линию sda (подтверждение) call scl_1 ;отпустить линию scl prm_i2c_3 call pausi2c ;вызов подпрограммы паузы btfss scl ;проверка линии SCL на занятость ведомого goto prm_i2c_3 ;ведомый занят: переход на метку prm_i2c_3 call scl_0 ;притянуть к 0 линию scl call pausi2c ;вызов подпрограммы паузы movf perem,W ;копирование принятого байта от ведомого return ;возврат из подпрограммы;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма паузы 5 машинных тактов pausi2c nop ;пустая команда return ;возврат из подпрограммы паузы;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    #include

    CONFIG H"3F10" ;Конфигурация микроконтроллера

    errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге

    scetbit equ 0020h ;вспомогательный регистр счета кол-ва бит

    perem equ 0021h ;вспомогательный регистр приема/передачи байта

    adr_i2c equ 0022h ;регистр хранения адреса внутреннего регистра ведомого

    tmp_i2c equ 0023h ;регистр кол-ва передаваемых байт

    slave_adr equ 0024h ;регистр хранения адреса ведомого

    data_i2c equ 0025h ;начальный регистр хранения данных для передачи

    flag equ 007Fh ;регистр флагов

    #DEFINE sda PORTB,0 ;линия sda

    #DEFINE scl PORTB,1 ;линия scl

    #DEFINE sda_io TRISB,0 ;бит управления направлением линии sda

    #DEFINE scl_io TRISB,1 ;бит управления направлением линии scl

    ;flag,4 - флаг направления передачи (0 - чтение, 1 - запись)

    ;flag,5 - флаг окончания приема данных от ведомого

    ;flag,6 - флаг ошибки передачи по интерфейсу I2C (отсутствие подтверждения от ведомого)

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    org 0000h ;начать выполнение программы с адреса 0000h

    goto Start ;переход на метку Start

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;Основная программа

    Start movlw b"00000000" ;установка значений выходных защелок порта B

    movlw b"00000111" ;выключение компараторов

    bsf STATUS,RP0 ;выбрать 1-й банк

    movlw b"11111111" ;настройка линий ввода\вывода порта B

    movwf TRISB ;все линии на вход

    bcf STATUS,RP0 ;выбрать 0-й банк

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    movlw b"01111110" ;запись адреса ведомого (0111111) в регистр slave_adr

    movwf slave_adr ;

    ;пример записи 2-х байт данных (числа 10 и 20) во внутренние регистры

    ;устройства (ведомого) начиная с адреса 0x03, адрес ведомого 0111111

    movlw 0x03 ;запись адреса внутреннего регистра ведомого в регистр adr_i2c

    movwf adr_i2c ;(для примера адрес внутреннего регистра ведомого равен 0x03)

    movlw .2 ;запись кол-ва передаваемых байт в регистр tmp_i2c

    movwf tmp_i2c ;(для примера передается 2 байта)

    movlw data_i2c ;установка начального регистра хранения данных для передачи

    movwf FSR ;с помощью косвенной аддресации

    movlw .10 ;запись числа 10 в первый регистр хранения

    incf FSR,F ;инкремент регистра FSR, подготовка следующего регистра хранения

    movlw .20 ;запись числа 20 во второй регистр хранения

    call write_i2c ;вызов подпрограммы записи по интерфейсу I2C

    btfss flag,6 ;проверка ошибки передачи данных

    goto dalee_1 ;нет ошибки, переход на метку dalee_1

    ................... ;обработка ошибки

    ...................

    ...................

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;пример чтения 3-х байт данных из внутренних регистров устройства (ведомого)

    ;начиная с адреса 0x05, адрес ведомого был задан ранее 0111111

    movlw 0x05 ;запись адреса внутреннего регистра ведомого в регистр adr_i2c

    movwf adr_i2c ;(для примера адрес внутреннего регистра ведомого равен 0x05)

    movlw .3 ;запись кол-ва принимаемых байт в регистр tmp_i2c

    movwf tmp_i2c ;(для примера принимается 3 байта)

    call read_i2c ;вызов подпрограммы чтения по интерфейсу I2C

    btfss flag,6 ;проверка ошибки передачи данных

    goto obrabotka ;нет ошибки, переход на метку obrabotka

    ................... ;обработка ошибки

    ................... ;

    ................... ;

    obrabotka movlw data_i2c ;установка начального регистра хранения принятых данных

    movwf FSR ;с помощью косвенной аддресации

    movf INDF,W ;копирование первого принятого байта в аккумулятор

    ................... ;обработка первого байта

    ................... ;

    incf FSR,F ;инкремент регистра FSR

    movf INDF,W ;копирование второго принятого байта в аккумулятор

    ................... ;обработка второго байта

    ................... ;

    incf FSR,F ;инкремент регистра FSR

    movf INDF,W ;копирование третьего принятого байта в аккумулятор

    ................... ;обработка третьего байта

    ................... ;

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;подпрограмма чтения/записи по интерфейсу I2C

    write_i2c bsf flag,4 ;установка флага направления передачи (для записи)

    goto i2c_1 ;переход на метку i2c_1

    read_i2c bcf flag,4 ;сброс флага направления передачи (для чтения)

    bcf flag,5 ;сброс флага окончания приема данных

    i2c_1 bcf flag,6 ;сброс флага ошибки I2C

    call starti2c ;вызов подпрограммы "Старт"

    bcf slave_adr,0 ;сброс бита R/W для операции записи

    movf slave_adr,W ;копирование адреса ведомого

    call peredi2c ;вызов подпрограммы передача байта

    btfsc flag,6 ;проверка флага ошибки

    goto err_i2c ;ошибка:переход на метку err_i2c

    movf adr_i2c,W ;адреса регистра ведомого I2C

    call peredi2c ;вызов подпрограммы передача байта

    btfsc flag,6 ;проверка флага ошибки

    goto err_i2c ;ошибка: переход на метку err_i2c

    movlw .0 ;проверка кол-ва передаваемых байт

    xorwf tmp_i2c,W ;

    btfss STATUS,Z ;

    goto i2c_3 ;кол-во передаваемых байт не равно 0: переход на метку i2c_3

    call stopi2c ;кол-во передаваемых байт равно 0: вызов подпрограммы "Стоп"

    return ;выход из подпрограммы чтения/записи I2C

    i2c_3 movlw data_i2c ;установка начального регистра хранения данных для передачи

    movwf FSR ;с помощью косвенной аддресации

    btfss flag,4 ;проверка флага направления передачи

    goto rd_i2c ;флаг равен 0: переход на метку rd_i2c (чтение)

    i2c_2 incf FSR,F ;инкремент регистра FSR, подготовка следующего байта для передачи

    movf INDF,W ;копирование байта данных для передачи

    call peredi2c ;вызов подпрограммы передача байта

    btfsc flag,6 ;проверка флага ошибки

    goto err_i2c ;ошибка: переход на метку err_i2c

    goto i2c_2 ;счетчик не равен 0: переход на метку i2c_2

    call stopi2c ;вызов подпрограммы "Стоп"

    return ;выход из подпрограммы чтения/записи I2C

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    rd_i2c call starti2c ;вызов подпрограммы "Старт" (Повторный Старт)

    bsf slave_adr,0 ;установка бита R/W для операции чтения

    movf slave_adr,W ;копирование адреса ведомого

    call peredi2c ;вызов подпрограммы передача байта

    btfsc flag,6 ;проверка флага ошибки

    goto err_i2c ;ошибка: переход на метку err_i2c

    goto rd_i2c_1 ;счетчик не равен 0: переход на метку rd_i2c_1

    bsf flag,5 ;установка флага окончания приема данных от ведомого

    rd_i2c_1 incf FSR,F ;инкремент регистра FSR, подготовка следующего регистра для приема данных

    call priemi2c ;вызов подпрограммы приема байта

    movwf INDF ;сохранение принятого байта в регистр INDF

    btfss flag,5 ;проверка флага окончания приема данных от ведомого

    goto rd_i2c_2 ;флаг не равен 0: переход на метку rd_i2c_2

    call stopi2c ;вызов подпрограммы "Стоп"

    return ;выход из подпрограммы чтения/записи I2C

    err_i2c call stopi2c ;вызов подпрограммы "Стоп"

    return ;выход из подпрограммы чтения/записи I2C

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    starti2c call scl_1 ;отпустить линию scl

    call pausi2c ;вызов подпрограммы паузы

    call sda_0 ;притянуть к 0 линию sda

    call pausi2c ;вызов подпрограммы паузы

    call scl_0 ;притянуть к 0 линию scl

    call pausi2c ;вызов подпрограммы паузы

    return ;возврат из подпрограммы

    stopi2c call sda_0 ;притянуть к 0 линию sda

    call pausi2c ;вызов подпрограммы паузы

    call scl_1 ;отпустить линию scl

    stpi2c_1 call pausi2c ;вызов подпрограммы паузы

    btfss scl ;проверка линии SCL на занятость ведомого

    goto stpi2c_1 ;ведомый занят: переход на метку stpi2c_1

    call sda_1 ;отпустить линию sda

    call pausi2c ;вызов подпрограммы паузы

    return ;возврат из подпрограммы

    sda_1 bsf STATUS,RP0 ;перенастройка линии sda на вход

    bcf STATUS,RP0 ;

    return ;возврат из подпрограммы

    sda_0 bcf sda ;перенастройка линии sda на выход

    bsf STATUS,RP0 ;

    bcf STATUS,RP0 ;

    return ;возврат из подпрограммы

    scl_1 bsf STATUS,RP0 ;перенастройка линии scl на вход

    © 2024 soundpad-voice.ru - Компьютер. Ноутбуки. ОС. Программы