Использование протокола 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 как мастер.
 
 
 
По материалам статьи: http://avrhelp.mcselec.com