Использование протокола I2C

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

SDA - линия данных
SCL - линия сихронизации
Обратите внимание, что к линиям SDA и SCL можно подключить несколько ведомых устройств. SDA и SCL являются двунаправленными линиями и подключаются к источнику питания через оттягивающий резистор. В большинстве случаев ведущим устройством выступает микроконтроллер, а ведомыми могут быть часы реального времени и датчики температуры, например, DS1307 и DS1624 от www.maxim-ic.com.

Сигналы START и STOP

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

Длина данных, передаваемых по линии SDA, всегда равна 8 битам (включая команды чтения и записи). Каждый байт должен оканчиваться битом подтверждения. Старший бит MSB передается первым. Если происходит команда записи, то R/W бит = 0, и если чтения - R/W бит = 1. Подтверждение при передаче данных обязательно. Приемник должен удерживать линию данных в течение подверждения в стабильно Низком состоянии. Приёмник, которому были адресованы данные, обязан генерировать подтверждение после каждого принятого байта, исключая те случаи, когда посылка начинается с адреса CBUS. В том случае, когда ведомый-приёмник не может подтвердить свой адрес, линия данных должна быть оставлена в ВЫСОКОМ состоянии. После этого ведущий может выдать сигнал СТОП для прерывания пересылки данных. Ведущий может в любое время остановить передачу данных.
Допустим, у нас есть ведомое устройство с адресом 1101000, и ведущий хочет, чтобы он выступал в роле приемника.

На рисунке можно увидеть, что ведомый всегда порождает условия старта и посылает ведущему R/W бит, равный 0. После этого ведущий может начать передачу данных или остановить ее условием СТОП.

На рисунке показано все то же самое, только R/W бит равен 1. Ведомый может начать передачу данных после потверждения от ведущего, он также может прекратить прием данных, создав условие СТОП.
Пример.
Этот пример показывает, как настроить чтение с датчика температуры DS1624.
Схема подключения DS1624.

Код программы представлен ниже.

$regfile = "m88def. dat" ;Define the chip you use
$crystal = 8000000 ;Define speed
$baud = 19200 ;Define UART BAUD rate
  ;Declare RAM for temperature storage
Dim I2ctemp As Byte ;Storage for the temperature
  ;Configure pins we want to use for the I²C bus
Config Scl = Portd. 1 ;Is serial clock SCL
Config Sda = Portd. 3 ;Is serial data SDA
  ;Declare constants – I2C chip addresses
Const Ds1624wr = &B10010000 ;DS1624 Sensor write
Const Ds1624rd = &B10010001 ;DS1624 Sensor read
  ;This section initializes the DS1624
I2cstart ;Sends start condition
I2cwbyte Ds1624wr ;Sends the address
  ;byte with r/w 0
  ;Access the CONFIG register (&HAC address byte)
I2cwbyte &HAC  
  ;Set continuous conversion (&H00 command byte)
I2cwbyte &H00  
I2cstop ;Sends stop condition
Waitms 25 ;We have to wait some time after a stop
I2cstart  
I2cwbyte Ds1624wr  
  ;Start conversion (&HEE command byte)
I2cwbyte &HEE  
I2cstop  
Waitms 25  
  ;End of initialization
Print ;Print empty line
Do  
  ;Get the current temperature
I2cstart  
I2cwbyte Ds1624wr  
I2cwbyte &HAA ;Read temperature (&HAA command byte)
I2cstart  
I2cwbyte Ds1624rd ;The chip will give register contents
  ;Temperature is stored as 12, 5 but the , 5 first
I2crbyte I2ctemp  
  ;So you'll have to read twice… first the , 5
I2crbyte I2ctemp , Nack  
  ;And then the 12… we don't store the , 5
I2cstop  
  ;That's why we read twice.
  ;We give NACK if the last byte is read
  ;Finally we print
Print "Temperature: " ; Str(i2ctemp) ; " degrees" ; Chr(13);  
Waitms 25  
Loop  
End  


Отметим, что используемые команды в этом примере можно найти в документации к DS1624.
Программа написана в среде Bascom AVR IDE, в которой можно разрабатывать программы для микроконтроллеров на языке высокого уровня Бейсик (Basic). Bascom AVR имеет встроенный компилятор, который преобразует программы, написанные на языке Basic, в шестнадцатеричный код, который, в свою очередь, можно запрограммировать (прошить) в микроконтроллер.
Краткий обзор команд.
Config Sda = Portx. x
Настраивает контактный порт для использования в качестве последовательной передачи данных SDA.
Config Scl = Portx. x
Настраивает контактный порт для использования в качестве линии SCL.
I2cstart
Отправляет условие СТАРТ.
I2cstop
Отправляет условие СТОП.
I2cwbyte
Записывает один байт в I2C.
I2crbyte
Считывает один байт из I2C.
I2csend
Записывает количество байт, I2C.
I2creceive
Читает количество байтов от I2C.

Практика
Ниже показано, как реализовать I2C. В схеме использeтся контроллер Mega88 как мастер.

По материалам статьи