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



 

Урок 16

Часть 2

 

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

 

В предыдущей части занятия мы кратко ознакомились с шина I2C или TWI (Two-wire Serial Interface), а также узнали, как именно она работает, как к ней можно что-то подключить, также познакомились с её регистрами, ну и кое-какие узнали нюансы, как, например настроить частоту или скорость данной шины.

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

Давайте поконкретнее резберёмся с расчетом скорости шины и её конфигурированием.

Как мы уже знаем из предыдущей части нашего урока, за установку скорости отвечает регистр TWBR

 

image05

 

С формулой расчета скорости мы познакомились. Но там у нас неизвестной величиной является скорость шины I2C.

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

 

image06

 

Вот так будет считать гораздо удобнее.

Например. мы хотим к контроллеру, работающему на частоте 8 МГц подключить какой-то девайз и работать мы с данным девайзом хотим на частоте 400 кГц. Биты TWPS пусть у нас остаются в нуле, тогда мы получим значение TWBR, равное 2. Вот так вот и считаем.

В качестве подопытного устройства мы возьмём микросхему EEPROM AT24C32D, которая установлена в модуле с часовой микросхемой DS1307. Я думаю, такие модули у многих есть, а у кого нет, то их можно заказать и приобрести, стоят они вообще копейки. А раз уж на данном модуле бонусом идёт такая микросхема, так почему бы ей не воспользоваться в качетсве тестирования шины I2C.

Создадим стандартный проект в Atmel Studio, подключим туда файлы для работы usart из соответствующего проекта, также создадим файл main.h, так же стандартно со всеми обычными стандартными библиотечными файлами, подключив его затем к DS1307Eeprom.c. Затем создадим и подключим также обычным образом две пары файлов. eepromext.h и eepromext.c для специфических функций по работе с внешним EEPROM и, соответственно, twi.h и twi.c для работы с шиной TWI.

 

 

После всего этого у нас получится вот такой вот main.h

 

#ifndef MAIN_H_

#define MAIN_H_

#define F_CPU 8000000UL

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

#include <stdio.h>

#include <stdlib.h>

#include «usart.h»

#include «twi.h»

#include «eepromext.h»

#endif /* MAIN_H_ */

 

А файл DS1307Eeprom.c вместе с инициализацие USART — вот такой

 

#include «main.h»

int main(void)

{

  USART_Init (8);

  while(1)

  {

  }

}

 

 

Посмотрим блок-схему микросхемы EEPROM

 

image07

 

Как мы видим, здесь имеется само собой шина I2C, контакт WP — Write Protect, при соединении которого с общим проводом мы работаем с данной микросхемой в обычном режиме, а если мы его подтянем к шине питания, то, соответственно, память микросхемы будет только читаться.

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

 

image08

Данная микросхема также умеет работать очень быстро. При питании 1,7 вольт она может работать до 400 кГц, а при 2,5-5 в — до 1 мегагерца.

Конечно, мы таких частот на нашем контроллере не добьёмся, так как частота шины I2C у микроконтроллера AVR не может быть больше, чем частота тактирования, делённая на 16. Поэтому при 8МГц мы можем разогнаться по I2C только до 500 кГц.

Но нам спешить некуда, нам главное надёжность. Поэтому с шиной мы будем работать на частоте 100 кГц и путём подсчета по вышенаписанной формуле мы получим значение TWBR, равное 32 или шестнадцатеричных 0x20.

Также ещё скажу интересную вещь, что инициализация нашей шины I2C будет состоять только лишь из настройки скорости. Напишем эту функцию в файле twi.c и создадим на неё прототип в соответствующем хедер-файле

 

#include «twi.h»

void I2C_Init(void)

{

  TWBR=0x20; //скорость передачи (при 8 мГц получается 100 кГц)

}

 

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

Также вызовем данную функцию в main()

 

USART_Init (8);

I2C_Init();

 

Попробуем собрать проект.

Если всё нормально собралось, то на этом закончим данную часть занятия.

 

 

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

 

Техническая документация на микросхему AT24C32

 

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

Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером

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

 

 

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

 

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

6 комментариев на “AVR Урок 16. Интерфейс TWI (I2C). Часть 2
  1. Boba:

    TWBR ne Prawilno nado na 4 delit.
    TWBR = 8
    Spasibo

  2. Alexey:

    Severity Code Description Project File Line
    Error 'TWBR' undeclared (first use in this function) DS1307EEprom D:\AVRx\AtmelProjects\DS1307EEprom\DS1307EEprom\twi.c 4

  3. Михаил:

    Так как автор поленился, добавлю для понимания:
    TWBR=((8000000гц/400000гц)-16)/(2*4^0)=((20)-16)/(2*1)=(4)/(2)=2

  4. IVAN:

    «подключим туда файлы для работы usart из соответствующего проекта, также создадим файл main.h» вот этот вот манёвр вымораживает нереально. Заходишь прочитать про I2C, херак тебя на USART перекидывает. Оттуда наверняка ещё куда пораньше. И так рекурсивно. Уроки Ваши экономят людям время, инфа должна быть концентрирована, кто не вробился в этот момент, тот пусть отмотает назад. Многим достаточно примеров кода здесь.

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

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

*