I2C står for Inter-Intergrated Circuit, og det er en seriell databuss som var utiklet av Phillips (nå NXP) i 1982. Bussen brukes til å koble til enheter med forholdsvis lav hastighet f.eks. til mikrokontrollere. Vanlige hastigheter er 10 kbps (low-speed mode), 100kbps (standard mode), 1 Mbs (fast mode plus) og 3,4 Mbps (high speed mode). Atmel bruker også navnet TWI på bussen, som står for Two Wire Interface.

Det finnes et utall av forskjellige enheter som bruker I2C (egentlig I2C). Eksempler kan være display, minnekretser, omformere, sensorer eller aktuatorer av forskjellig slag. Listen er veldig lang, og en kan få en viss oversikt på denne nettsiden: https://i2cdevices.org/ 

I2C er en buss som bruker et master-slave system over 2 linjer, som kalles SDA (seriell data) og SCL (seriell klokke). Bussen trenger pullup-motstander, men en del enheter har disse innebygd, eventuelt med jumpere for aktivering. Størrelsen på motstandene er avhengig av blant annet lengden på bussen og antall enheter som er tilkoblet. Både +3.3V og +5V kan brukes som arbeidsspenning, men det er selvsagt viktig å ikke blande disse uten at en tar forholdsregler for å beskytte mot overspenning.

I2C-bussen (Kilde wikipedia.no)

(Bilde fra Wikipedia.no)

Enhetene adresseres med en 7-bits adresse, det vil si at vi har 128 mulige kombinasjoner. 16 av adressene er derimot reserverte, så det gir oss mulighet for å koble 112 enheter til bussen.  ( https://i2cdevices.org/addresses )

Her skal vi se på en krets hvor vi bruker en RTC (Real Time Clock) og et digitalt potensiometer som eksempel. Vi starter med så se på potensiometeret, et AD5241, og bruker terminalen som "utgang".

Et veldig greit sted å starte når en skal bruke I2C, er å teste med en skisse som "skanner" bussen etter enheten. Da kan vi sjekke at alt er koblet til riktig, samtidig som vi finner ID til enheten(e) vi har koblet til.
(Ligger under fanen "I2C-scanner"). Når vi kjører koden, vil vi se at RTC'en detekteres på adresse 0x68 (heksadesimalt), og potensiometeret detekteres på adresse 0x2C.

I2C-scanner

Koden under er et program som skanner I2C-bussen ved å sende et "hallo" til hver enkelt adresse, og se om den får svar:


// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
#include <Wire.h>

void setup(){
  Wire.begin();
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}

void loop(){
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ){  // The i2c_scanner uses the return value of the Wire.endTransmisstion to see if a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0){
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    } else if (error==4){
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

 

Flik 2

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

Flik 3

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.