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


