I2C Bus

Fra Kommunikation-IT Holstebro HTX
Skift til: navigering, søgning

I2C er en standard hvor man kan kommunikere med mange enheder på en simpel digital bus, som bare er tilsluttet PIC eller Arduino, men som også er så simpel at den ikke kan kommunikere over så store afstande, og ikke kan tage den store belastning.

Princip-diagram for I2C

Der skal selvsølgelig stel og forsyning til alle enheder der skal arbejde på I2C Bussen - her skal man måske være opmærksom på om alle enheder kan arbejde med 5V, eller om nogle enheder skal arbejde på 3,3V forsyning. Der er en del enheder der er designet til 3,3V forsyning, som alligevel kan holde til at få 5V signaler.

Hver enhed skal have sin unikke adresse fra 0 - 127, hvor det normalt er selve enheden der bestemmer hvad man kommunikerer med.

Typisk vil en bestemt type enhed have en bestemt adresse, f.x. har en Arduino DS1307 RTC adressen 0x68 og et serielt display har adressen 0x27.

Principskitse af 3 enheder på en I2C Bus

Software modulet I2C.jal

Der ligger en del biblioteker i standard versionen af jalpack, som indeholder følgende:

Bibliotek Beskrivelse
I2C_Hardware.jal Grundlæggende modul, der opstiller registre og rutiner til at kommunikere med I2C bussen ved hjælp af den indbyggede hardware i PIC'en og dens registre - dette bibliotek er skrevet til PIC16F877, og kan ikke fungere sammen med PIC16F690, selvom denne også skulle kunne arbejde med I2C ved hjælp af de interne registre.

Modulet har tillige den ulempe, at kommunikationen er bundet til 2 faste ben på PIC'en.

I2C_Software.jal Grundlæggende modul, der opstiller variabler og rutiner til at kommunikere med I2C bussen ved hjælp af software rutiner - dette bibliotek skulle kunne fungere sammen med alle PIC-typer.

Modulet har den ulempe, at kommunikationen sker i softwaren og dermed tager tid fra og er afhængig af andre dele af PIC-programmet.

Modulet har så til gengæld den fordel at det skulle kunne fungere på forskellige PIC-ben.

I2C_Level1.jal Et bibliotek, hvor man kan kommunikere med forskellige I2C enheder, ved at sende data og modtage data til/fra enheden på den angivne adresse.
I2C_Slave.jal Ikke testet, men kan sikkert noget i stil med at lade en PIC optræde som I2C unit på bussen.
I2C_Slave_Isr.jal Ikke testet
I2C_Slave_Msg.jal Ikke testet

I2C Search program

Når man vil anvende I2C moduler, så kan det i første omgang være smart at se om man kan "se" enhederne på bussen.

Til dette er der lavet et lille program, der løber alle adresser fra 0 - 127 igennem, for at se hvilke der svarer.

Hardwaren kobles op med et ALCD 2 x 16 display på port C og I2C bussen med SCL på pin B6 og SDA på pin B4.

Initialiseringen af ALCD og I2C modulet laves som følger:

include ALCD

-- --- generate LCD screen activity ---------
ALCD_clear_screen()             -- (to first line)

-- I2C Pin definitions
-- Dette er definitioner til 16F690
var volatile bit i2c_scl is pin_b6
var volatile bit i2c_scl_direction is pin_b6_direction
var volatile bit i2c_sda is pin_b4
var volatile bit i2c_sda_direction is pin_b4_direction

-- Second, define the next two constants:
const word _i2c_bus_speed = 1 ; * 100kHz
const bit _i2c_level = true ; i2c levels (not SMB)

ALCD_cursor_position(1,0) -- start anden linje

ALCD_Write_char("I")      -- Vis at det er I2C program
ALCD_Write_char("2")
ALCD_Write_char("C")

-- And now you can include the 'level0' i2c library. This is the library that creates the i2c signals and comes in two flavors:

-- 16F690 kan kun virke med software-versionen, der belaster softwaren mere
-- Til gengæld bude den have frihed til at bruge alle pins
include i2c_software
i2c_initialize()

Der defineres 3 variabler til at registrere hvilke adresser der findes og hvor mange der findes.

Selve loopet løbet alle 128 adresser igennem i et for-loop, hvor der først sættes gang i kommunikationen med hver adresse, og ved at forsøge at sende en adresse til enheden (den skal angives som 2 gange adressen + 1), så kan man se om der er en enhed der svarer på den adresse. Hvis der ikke svares, så stoppes kommunikationen igen.

Hvis man se en adresse, så skrives den i displayet og der gøres klar til med pos at skrive den næste adresse der findes, og antallet af fundne tælles op og udskrives.

På denne måde kan man finde adresserne af de enheder der er tilsluttet I2C-bussen.

forever loop
   for 128 using address loop      -- Løb alle 128 adresser igennem (0-127)
      i2c_start()                  -- Start kommunikationen
      -- Forsøg at sende adressen - skal sendes som *2 + 1. Hvis den svarer er der et device
      if i2c_transmit_byte(address * 2 + 1) then
         ALCD_cursor_position(0,pos) -- Placer cursoren til at skrive adressen
         ALCD_Hex_2(address)         -- Skriv adressen som Hex
         pos = pos + 3               -- Gør klar til næste position
         antal = antal + 1           -- Registrer at der er fundet en
         ALCD_cursor_position(1,4)   -- Placer til skrivning af antal
         ALCD_Dec_3(antal)           -- Skriv antal
         delay_100ms(1)
      end if
      i2c_stop()                   -- Luk forsøget på at kommunikere
   end loop
   ALCD_cursor_position(1,4) -- Skriv antallet, så det ses, også hvis der er 0
   ALCD_Dec_3(antal)
   antal = 0                 -- Klargør til næste forsøg
   pos = 0
   delay_100ms(20)           -- Vent 2 sekunder inden næste forsøg
end loop

JAL-filen ligger sammen med ALCD pin filen i Media:Modul_I2C_Search.zip

I2C på Arduino

I2C kommunikationen er lavet ved hjælp af Wire modulet, som understøtter det at kommunikere på I2C Bus med forskellige enheder.

Der etableres forskellige moduler som Arduino DS1307 RTC og I2C Display til at kommunikere med de aktuelle moduler.

Ligesom til PIC'en er der til Arduino'en udviklet et I2C Search Modul til at finde enheder der er koblet på I2C-bussen.

Moduler på Holstebro HTX
Tastaturer Displays AD-konvertering I/O-ekspander Serielt Interface Færdige Andre
RC-tast - AD-tast - M_tast ALCD - LCD ADC_holst - ADC
mcp3201 - mcp3208
input - output Seriel_holst - Serial hardware
Serial hw int cts - Serial software
Stepmotor - RFID
RGB - RF-link - Afstand
Humidity - Analog temp - Dig temp
Accelerometer
Rotary Encoder

Oversigt over Hardware Moduler på Holstebro HTX