Подписаться на получение новых статей на почту:

TWI ( I2C ) — режим Multi-Master. Библиотека ProcyonAVRlib. Шаг №34.

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

Первая часть протокола была рассмотрена в статье №28, именно та информация, которая необходима для подключения схемы: один ведущий остальные ведомые. И рассмотрели пример подключения часов DS1307 в статье №29. Немного хочется добавить, что несмотря на простоту протокола, общение контроллера по I²C (TWI) затруднено из-за изобилия возможных нештатных ситуаций на шине. По этой причине большинство систем используют I²C c единственным ведущим (Master) устройством и распространённые драйверы поддерживают только монопольный режим обмена по I²C.

В нашем разрабатываемом устройстве также предполагается один ведущий, но в качестве ведомого предполагается еще один микроконтроллер ATmega, который будет как принимать информацию, так ее и передавать обратно. Для закрепления информации мы рассмотрим два ведущих на линии, взаимодействие прикладной программы с модулем TWI и статусные коды. Экспериментировать будем с двумя Atmega 8 и часами реального времени DS1307 по следующей схеме.

Два ведущих AVR  по TWI

Используя данный интерфейс с двумя ведущими устройствами (режим MultiMaster ), нам необходимо рассмотреть вопрос синхронизации частоты на общей шине, который возникает при несовпадении тактовых частот при нескольких ведущих. Если посмотрите рисунок ниже и прикинете таблицу истинности, то видно что общий такт возникает только в момент высокого состояния на линии всех устройств. На рисунке, также видно случаи запаздывания и опережения тактов и результат за счет схемного подключения «МОНТАЖНОЕ И».

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

Второй вопрос, это вопрос приоритета, который возникает в случае когда два и более ведущих пытаются начать передачу данных. Понятно что для целостности передачи данных, на шине должен быть только один ведущий. В данном случае в контроллере работает процесс распределения приоритетов (АРБИТРАЖ), который заключается в том что все ведущие устройства после выдачи данных на SDA, контролируют состояние на общей линии. Если оно отличается, не забываем что у нас монтажное И, то он переключается в режим ведомого. На рисунке ниже изображена данная ситуация.

приоритет TWI

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

— ПОВСТАР и передачей разряда данных
— СТОП и передачей разряда данных
— ПОВСТАР и СТОП.

Данные конфликты, которые могут возникнуть в этих пунктах, необходимо решать программно !!!!!

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

Формат регистра TWAR

TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCE
R/W R/W R/W R/W R/W R/W R/W R/W
1 1 1 1 1 1 1 0

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

TWGCE – разрешение распознавание общих вызовов. 1 – устройство отзывается на общие вызовы (пакеты с адресом $00) и на вызовы с адресом находящемся в разрядах TWA6…TWA0.

Как же взаимодействует прикладная программа с модулем TWI ?  Все очень просто — используется прерывание от модуля TWI, которое возникает после каждого события. Прерывание от модуля TWI, разрешается в регистре управления. Срабатывает по наступлению события в регистре состояния TWCR, в котором записывается код статуса. Выдаваемый код регистром зависит от выбранного режима. В даташите можно просмотреть полный перечень.

Выглядит данная операция следующим образом.

SIGNAL (SIG_2WIRE_SERIAL)   либо         SIGNAL (TWI)      //Одно и тоже.
{
switch (status)
{
           // Master General
           case TW_START: // 0×08: Sent start condition
           case TW_REP_START: // 0×10: Sent repeated start condition
           // send device address
          i2cSendByte (I2cDeviceAddrRW);
          break;
          ……………….
}

Как Вы поняли код в прерывании это обработка статусных кодов на какое либо событие. В справочнике и документации описаны все варианты кодов для всех четырех случаев(режимов). Так что можно написать код самому, а можно взять готовые библиотеки. Т.к. мы с Вами уже научились подключать библиотеки в статье №21, то не будем писать громоздкий код, а возьмем готовый. Как на меня самые распространенные это апноуты от атмел: аппноут №315, где описывается ведущий интерфейс и аппноут №311 – ведомый. А также библиотека известного набора джентльмена ProcyonAVRlib, автора PascalStang, где описаны все 4-ри режима. Вот этой библиотекой мы и воспользуемся. А именно нам будут необходимы следующие файлы:

avrlibdefs.h–определяются макросы по работе с портами;
avrlibtypes.h – здесь переопределяются типы переменных для переносимости;
global.h — выбирается частота для дальнейших расчетов;
i2cconf.h – определяется размер буферов отправки/приема данных;
i2c.c – непосредственно наш рабочий файл. Единственно что в функции инициализации не забудьте выставить порты SDA и SCL,
void i2cInit (void)
{
        // set pull-up resistors on I2C bus pins
        sbi (PORTC, 5); // i2c SCL 
        sbi (PORTC, 4); // i2c SDA 
        ………………………………...
}

i2c.h – заголовочный файл . Здесь определяются коды состояний, функции и одна структура с номерами режима работы контроллера.

Быстро просморев файлы Вы увидите что код работы в этом интерфейсе не такой простой, а точнее не такой короткий, на противовес тому что мы писали для пассивного устройства, а именно наших часов в статье №29. Но без такой последовательности мы не получим стабильную работу.

Разобраться в коде не сложно, тем более что мы основы рассмотрели в статьях №28 (Шаг №28. Последовательный двухпроводный интерфейс TWI для AVR с одним ведущим) и №29 (Подключаем часы реального времени DS1307 к AVR).

Основные функции, которые мы будем использовать это

void i2cInit (void);  // Инициализация 
//Запись адреса в контроллер на который он будет отзываться я
void i2cSetLocalDeviceAddr (u08 deviceAddr, u08 genCallEn);
//Прием данных ведомым
void i2cSetSlaveReceiveHandler (void (*i2cSlaveRx_func)(u08 receiveDataLength, u08* recieveData));
//Отправка данных ведомым ведущему
void i2cSetSlaveTransmitHandler (u08 (*i2cSlaveTx_func)(u08 transmitDataLengthMax, u08* transmitData));
//Передача данных ведомому
void i2cMasterSend (u08 deviceAddr, u08 length, u08 *data);
//Прием данных ведущим
void i2cMasterReceive (u08 deviceAddr, u08 length, u08* data);

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

Просмотрено 2099 раз.

Я на Google+

TWI ( I2C ) — режим Multi-Master. Библиотека ProcyonAVRlib. Шаг №34.: 2 комментария

  1. Сильно много заморочек с этим TWI два ведущих, непонятно где его использовать?

    • Здравствуйте да действительно не так просто, но зато очень удобный метод общения + не занимает ресурс контроллера ,т.к. встроенный модуль + два контроллера могут выполнять разные задачи. например в статье № 39 выложу контроллер сбора данных, где можно просмотреть работу двух мк по интерфейсам TWI и SPI.

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

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting