AVR Урок 16. Интерфейс TWI (I2C). Часть 1



 

Урок 16

Часть 1

 

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

 

Опыт нашей предыдущей работы с микроконтроллерами AVR показал то, что мы уже многому научились, в том числе общаться с внешними устройствами типа ПК. Теперь, я думаю, все понимают, что этого недостаточно. Есть масса устройств и датчиков, которые нам хочется подключить к микроконтроллера и, мало того, ещё ими и поуправлять, забрать у них какие-то данные. Только данные девайзы подключаются к МК с помощью проводов и существует несколько видов подключений. Один из таких видов — шина I2C. Данный интерфейс является авторской разработкой компании Phillips и поэтому Atmel, чтобы не нарушать авторские права, немного изменила наименование данной шины и назвала её TWI (Two-wire Serial Interface).

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

 

 

Как мы уже поняли, данный интерфейс предаёт данные по проводам. Причем именно по двум проводам

 

image01

 

Как мы видим из данной блок-схемы, у нас есть два провода или контакта — SDA и SCL, подсоединённые к контроллеру к его соответствующим ножкам, а затем к этим проводам мы ещё подключаем какое-нибудь устройство или несколько устройств. Теоретически мы можем подключить до 127 устройств, впоследствии мы поймём, почему именно столько. Ножка SDA отвечает за передачу и приём данных по данной шине, а ножка SCL — это ножка тактирования, таким образом шина I2C является синхронной, что увеличивает стабильность и гарантированность передачи данных по ней. Также в данной блок-схеме мы наблюдаем то, что ещё к данным ножкам необходимо подтянуть резисторы на шину питания, причём как правило в каких-то модулях или устройствах данные резисторы уже подтянуты, и. если мы подключим их несколько, то у нас получится ряд параллельно подключенных подтягивающих резисторов, что будет очень нехорошо и придется оставить их в каком-то одном усторйстве, а в других выпаять. Всё это происходит потому, что есть ограничение на номинал данных резисторов в зависимости от определенных условия

 

image02

 

Как показала практика, данные резисторы не должны быть сопротивлением более 10 килоом и менее 4,7 килоом.

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

Хочу подчеркнуть, что данный интерфейс в микроконтроллрах AVR реализован на аппаратном уровне. Можно также организовывать его и программным способом, путём включение в определённое время двух любых ножек портов в определенные логические состояния, но само собой, аппаратная организация всегда лучше по всем показателям. Программная реализация как правило используется, если не хватит одной шины, но как правило хватает, так как мы выше уже видели, что устройств можно к одной шине подключить несколько. Таким образом, мы будем рассматривать именно аппаратную реализацию — на уровне регистров контроллера.

 

 

В сдедующей блок-схеме мы видим следующие регистры интерфейса TWI в контроллере Atmega8

 

image03

 

Давайте с ними кратко ознакомимся.

Регистр TWBR — это регистр, в котором мы устанавливаем значения для обеспечения определённой скорости шины. Устройства, которые мы подключаем по I2C требуют определённой скорости ну или определённого диапазона скоростей. Расчитывается эта скорость или битрейт по следующей формуле

 

image04

 

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

Причем TWPS — это не отдельный регистр, а совокупность всего лишь двух битов статусного регистра TWSR, в котором помимо этих битов есть ещё и другие, посредством которых мы будем отслеживать определенные состояния или ошибки обмена данными. Есть перечень кодов статуса, по которым мы и будем узнавать, удачно ли прошла команда или что-то не так.

Также само собой существует ещё и управляющий регистр TWCR, с помощью установки в соответствующее состояния битов которого мы будем определённым образом настраивать нашу шину.

Есть ещё адресный регистр TWAR, с помощью которого, если мы настраиваем контроллер ведущим устройством, мы передаем ведомому устройству 7-битный адрес (отсюда и 127 максимально устройств на шине), по которому-то как раз и будет обращение именно к определённому устройству из всех навешанных на наши два провода. А восьмой бит к адресу будет добавляться для того, чтобы передать, читаем мы данные или пишем. А если у нас контроллер будет настроен как ведомое устройство, то в данном регистре мы будем получать от ведущего адрес и сравнивать его с определённым, чтобы понять, обратился ведущий именно к нам или к кому-то другому.

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

Вот, вообщем, вкратце о регистрах так.

В следующей части занятия мы продолжим подробнее заниматься с данной шиной.

 

 

Предыдущий урок Программирование МК AVR Следующая часть

 

Программатор и модуль RTC DS1307 с микросхемой памяти можно приобрести здесь:

Программатор (продавец надёжный) USBASP USBISP 2.0

Модуль RTC DS1307 с микросхемой памяти

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR Интерфейс TWI (I2C)

2 комментария на “AVR Урок 16. Интерфейс TWI (I2C). Часть 1
  1. в симуляторе работает а в железе не хочет

  2. Brainfog:

    TWAR — регистр, с помощью которого задается адрес самого контроллера, когда он работает в качестве ведомого

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

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

*