Использование протокола 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 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 как мастер.