Введение
В составе некоторых микроконтроллеров AVR есть модуль двухпроводного последовательного интерфейса (Two -wire Serial Interface или TWI). Модуль предназначен для организации обмена данными между микросхемами, подключенными к двухпроводной шине. Основное преимущество этого интерфейса перед SPI и UART`ом - это возможность организации сети из нескольких устройств.
Двухпроводный интерфейс является аналогом I2C интерфейса фирмы Philips, только в случае AVR, не поддерживает высокие скорости передачи данных (свыше 400 kbit/s). Соображения, по которым Atmel использует другое названия, видимо связано с нежеланием платить Philips за лицензию.
В этом материале мы разберемся с основами двухпроводного последовательного интерфейса, а в следующих перейдем к работе с TWI модулем AVR.
Далее я буду опираться на даташит atmega16 и спецификацию I2C.
Подключение устройств к I2C шине
I2C шина представляет собой две двунаправленные линии связи - SDA (Serial Data Line) и SCL (Serial Clock Line). По SDA передаются данные, по SCL тактовый сигнал. Обе линии подтянуты через резисторы к плюсу питания.
Устройства на шине подразделяются на ведущих (master) и ведомых (slave). Ведущие запускают и завершают передачу данных, ведомые - отвечают на запросы. Одни - начальники, другие - подчиненные. Микроконтроллеры могут совмещать в себе обе эти функции.
Выходные каскады устройств, поддерживающих I2C, выполнены как структуры с открытым коллектором/стоком. При подключении к шине, они образуют схему монтажного "И". Это значит, что любое устройство, установившее низкий логический уровень на линии шины, "проваливает" высокий уровень остальных устройств.
На шине может быть несколько ведущих устройств, но в любой момент времени, обмен данными может производить только один из них. Остальные ведущие в это время молчат в тряпочку и слушают шину.
Существует механизм распределения приоритетов между ведущими, если они начинают передачу данных одновременно. Он заключается в том, что ведущие устанавливают на шине данные и проверяют результат. Если он отличается от ожидаемого, устройство теряет приоритет и останавливает передачу данных.
Передача данных по I2C
Данные передаются поразрядно (спасибо кэп!), старшим разрядом вперед. Каждый разряд сопровождается тактовым сигналом.
Начало и окончание передачи данных сопровождается специальными состояниями шины - СТАРТ и СТОП. Эти состояния формирует ведущее устройство. Также ведущий может сформировать состояние повторного старта до формирования состояния СТОП.
Данные передаются по I2C шине со служебной информацией. Все вместе это называется пакетом. Существуют адресные пакеты и пакеты данных. Адресные пакеты состоят из 7-и разрядного адреса, управляющего бита R/W и бита квитирования (весь пакет - 9 бит). Адресный пакет нужен, чтобы обратиться к конкретному устройству.
R/W - определяет последующее направление передачи данных. Бит квитирования - это ответ ведомого устройства на принятый адрес. Если адрес распознан, ведомый выдает на линию SDA низкий уровень. В противном случае на линии удерживается высокий уровень.
Под адрес отведено 7 разрядов, что как бы намекает на возможность адресации 128 устройств, но это не совсем так. Во-первых существует ряд служебных адресов, например, 0000000 - это адрес общего вызова (обращение ко всем ведомым устройствам). Во-вторых есть режим 10-и разрядной адресации, когда адрес передается двумя пакетами. Не буду углубляться в эту тему, только скажу, что адреса из диапазона 1111000...1111111 не рекомендуется использовать в TWI модуле AVR (курим даташит).
Пакеты данных состоят из байта данных и бита квитирования, то есть тоже имеют длину 9 бит. После приема каждого байта данных, принимающее устройство (приемник) отвечает передающему устройству (передатчику), устанавливая на линии SDА низкий уровень (это и есть бит квитирования). Если принимающее устройство получило последний байт или больше не может продолжать прием данных, оно должно "оставить" на линии SDA высокий уровень.
В общем случае, полный цикл обмена по I2C состоит из следующих шагов:
- формирование состояния СТАРТ,
- передача адресного пакета,
- передача пакетов данных,
- прием пакетов данных,
- формирование состояния СТОП.
На этом все. Продолжение следует..
Comments
Будут ли примеры с DS1307 и 24LCxx?
"...если мастер не получает сигнал подтверждения, он может сформировать состояние СТОП или повторить состояние СТАРТ, чтобы начать новую передачу. Есть пять условий, приводящих к ответу NACK:
1. На шине нет устройства с требуемым адресом.
2. Приемник не может принять или передать данные, так как занят.
3. Во время передачи приемник получил данные, которые не понимает.
4. Во время передачи приемник не может получить данных больше, чем уже есть.
5. Мастер, принимающий данные, сигнализирует об окончании передачи ведомому."
Подскажите, я правильно понял что в tiny и mega аппаратно это реализовано немного по разному?
Но скорее всего по-другому сделано.
Если код прерывания выполняется, естественно, основной код не будет выполнятся. А передача в любом случае будет идти, хотя и код выполняется...
RSS feed for comments to this post