I2C

Fra HTX Arduino
Spring til navigation Spring til søgning

Denne side er en kort sammenfatning af noget af indholdet fra I2C.info[1] og [2] specielt undersiden med selve specifikationen[3]. Hvis man vil yderligere i dybden med protokollen, så kan man læse en af specifikationerne fra I2C[4]

I2C protokollen er oprindeligt defineret af Philips, men bruges vidt udbredt af mange i elektronik-industrien.

Den typiske anvendelse er en Master (typisk en computer eller microcontroller) det kan kommunikere med en eller flere slave-enheder (specifikke IC'er eller andre microcontrollere), der har hver sin adresse. Man kan både sende og modtage data fra de enkelte slave-enheder, og der specificeres for den enkelte enhed, hvordan man kommunikerer med den.

Man kan finde produkter der sælges som "2 wire interface". Typisk overholder de I2C standarden, men ønsker ikke at betale for rettighederne for at anvende navnet I2C.

Elektrisk

I2C består af to signal-ledninger SDA og SCL, der kommunikerer det hele i forhold til en stel-ledning. Signalerne har en pull-up der typisk går til 5V, således at der er 5V på begge ledninger når der ikke kommunikeres.

Typisk kan systemet bestå af en Master og et antal slaver som skitseret her. De to modstande sørger for at linjen er høj, når der ikke kommunikeres på den.

Skitse af I2C system
Skitse af I2C system med en Master og 3 slaver (ADC, DAC og RTC)

Kommunikations-hastighed

Den typiske kommunikations-hastighed for I2C er 100kBit/sekund.

Der har tidligere været standard også for 10kBit/sekund, men den nye 100kBit standard er defineret ned til 0, så den er overflødig.

Der findes også hurtigere standarder op til 3,4 MBit/sekund, men de fleste mindre enheder understøtter kun 100kBit/sekund.

Vente-tilstand

Hvis en enhed skal bruge tid på at behandle den modtagne byte, så har slaven den mulighed at den kan trække SCL lav efter den 9. clock-puls. Så længe en slave holder SCL lav, så må masteren ikke begynde at sende den næste byte før SCL bliver høj igen - det giver slaven mulighed for at kunne f.x. gemme data før den er klar til at behandle næste byte.

Master og Slave

Den typiske anvendelse af af I2C er at der er en Master, der kan kommunikere med en eller flere Slaver.

Denne dokumentation går på denne type anvendelse.

Multi Master

I2C standarden beskriver også anvendelse af flere mastere, hvor de forskellige mastere skal "slås" om bussen, så det er en noget mere kompliceret måde at kommunikere på.

Denne type kommunikation er ikke dokumenteret her, og der henvises til referencerne[4] for nærmere detaljer.

Start og stop

I den typiske konfiguration vil Masteren starte kommunikationen med en start-condition, kommunikere der masteren ønsker og afslutte med en stop-condition.

En del af I2C definitionen siger at SDA ikke må skifte niveau, når SCL er høj - der er dog to undtagelser, nemlig når Masteren skal angive start- og stop-condition.

Start-condition sker ved at SDA trækkes lav af Masteren, mens SCL er høj, som det er vist i den grønne indramning.

I2C start-condition
I2C start-condition vist i den grønne indramning

Stop-condition sker ved at SDA trækkes høj af masteren, mens SCL er høj, som vist i den grønne indramning herunder.

I2C stop-condition
I2C stop-condition vist i den grønne indramning

Kommunikation af en Byte

Hele denne beskrivelse er baseret på 7-bits addressering, men dele af den vil sikkert også være gældende for 10-bits addressering - der er bare ikke specificeret hvilket.

Der kommunikeres altid hele bytes af 8 bit - også ved 7-bits adressen, der i slutningen indeholder en bit der angiver læs/skriv.

De 8 bit kommunikeres ved at mest betydende bit lægges på SDA, hvorefter SCL slippes høj og trækkes lav igen fra masteren, og på samme måde kommunikeres de næste 7 bit. Dette kan ses herunder, hvor mest betydende bit skal læses ved SCL nr. 1, den næste ved SCL nr. 2 og så videre hen til SCL nr. 8, så der kommer en hel byte over. På den 9. SCL bekræftes som beskrevet nedenfor.

I2C overførsel af en byte
I2C overførsel af en byte

Den overførte byte er binært 1101_0001 = hexadecimalt 0xD1 = decimalt 209.

Acknowledge

Som 9. bit sender masteren en clock igen på SCL og her er det slavens opgave at trække SDA lav som Acknowledge, altså en kvittering for at byten er blevet læst. Hvis SDA ikke trækkes lav, så tolkes det som Not Acknowledge.

I den 9. bit har slaven mulighed for at trække SCL lav for at indikere at den endnu ikke er klar til at modtage næste byte. Den melder klar ved at slippe SCL igen, så masteren kan se det og begynde på den næste byte.

I2C Acknowledge af en byte
I2C Acknowledge af en byte vist ved at slaven trækker SDA lav i den grønne indramning

Læsning og skrivning

Som med alt andet er det Masteren der styrer om der skal læses eller skrives Det gøres i forbindelse med addreseringen, hvor sidste bit af adresse-byten angiver om resten er en skrivning til slaven eller om det er slaven der skal svare med et antal bytes. Det er i begge tilfælde masteren der bestemmer hvornår kommunikationen er slut, ved at sætte en stop-condition.

I det viste tilfælde herunder sendes en adresse med en skrive-kommando som sidste bit.

I2C Adresse-byte med skrive-kommando
I2C adresse fra Masteren med 7 bits adresse og en lav bit som bit 8 vist i den grønne indramning - betyder at den/de næste byte skrives fra masteren til slaven

I det viste tilfælde herunder sendes en adresse med en læse-kommando som sidste bit.

I2C Adresse-byte med læse-kommando
I2C adresse fra Masteren med 7 bits adresse og en høj bit som bit 8 vist i den grønne indramning - betyder at den/de næste læses ind fra slaven til masteren


I de tilfælde hvor man skal sende en kommando til slaven (altså skrive til den) og hente et svar tilbage, så kan det gøres ved at man første sender med skrive-kommando, og i stedet for en stop, så sender man en ny adresse til slaven med en læse-kommando.

I det viste tilfælde herunder sendes først en adresse med en skrive-kommando som sidste bit, og derefter skrives en byte. I stedet for at afslutte, så sendes en ny start-condition, som markeret i den grønne indramning.

I2C Adresse-byte, skrive-kommando og en byte der skrives, hvorefter der sættes endnu en start-condition
I2C adresse fra Masteren med 7 bits adresse og en skrive-kommando efterfulgt af en byte til slaven. Herefter sættes en ny start-condition i den grønne indramning (vis i en anden tids-scala)

Efter den viste kommunikation med en ekstra start-condition sendes samme adresse igen, men denne gang med en læse-kommando, så der kan læses fra slaven. I dette tilfælde (ikke vist) læses der 7 bytes fra slaven. Det er afhængigt af slaven hvad man kan skrive til den og læse fra den.

Adresse

Adressefeltet kan indeholde noget information om hvordan bussen skal fungere og hvordan slaverne skal forholde sig som det er angivet i tabellen herunder. Dette er faktisk mest undtagelser, hvor den normale kommunikation foregår med adresser fra 8-119 i 7 bit adresserings-mode.

Adr. binært Adr. Hex Adr. Decimalt R/W Forklaring
0000 000 0x00 0 0 General Bus call address
0000 000 0x00 0 1 START byte - for langsomme microcontrollere uden I2C h/w
0000 001 0x01 1 X CBUS address - en anden bus protokol
0000 010 0x02 2 X Reserveret til et andet bus format
0000 011 0x03 3 X Reserveret til fremtidig brug
0000 1XX 0x04-0x07 4-7 X High speed mode master code
0x08-0x77 8-119 X 7 bits addresserings mode
1111 0XX 0x78-0x7B 120-123 X 10-bit slave addressering
1111 1XX 0x7C-0x7F 124-127 X Reserveret til fremtidig brug

Adressen sendes som de første 7 bit af første byte. Den sidste bit angiver om det er læsning (høj) eller skrivning (lav) der skal ske.

7 bits adressering

Ved normal I2C kommunikation starter Masteren med at sende adressen på Slaven, så slaverne ved hvem der skal modtage noget.

Som det kunne ses under læse og skrive-kommandoeerne, så ligger adressen placeret som de første 7 bit der sendes, som vist herunder.

I2C Adresse-byte med adressen 0x68
I2C adresse fra Masteren med 7 bits adresse med hexadecimalværdien 0x68 og den lave bit 8 vist i den grønne indramning - betyder at der skrives til slaven

Den viste adresse er binært 110_1000 efterfulgt af en lav bit som skrivekommando.
Dette kan udtrykkes hexadecimalt som 0x68, eller som decimaltallet 104.

Slaverne kan have adresser i følgende områder:
Binært: 000_1000 - 111_0111
Hexadecimalt: 0x08 - 0x77
Decimalt: 8 - 119

Adresserne 0-7 har en speciel betydning, som angivet i følgende tabel og adresserne 120-127 har ligeledes en speciel betydning som angivet i tabellen.

10 bits adressering

Ikke dokumenteret, men går på at adresser-området 120 til 123 anvendes og at de to bit herfra sammen med en ekstra byte angiver adressen.

Referencer

Logik Begreber
Gates AND-gate - OR-gate - NOT-gate - NAND-gate - NOR-gate - XOR-gate - XNOR-gate - Inverter-gate - Schmitt-trigger
Flip-flop RS-flip-flop - D-flip-flop - JK-flip-flop - Latch - Toggle-flip-flop
Sekventiel logik Flip-flop - Multivibrator - Astabil Multivibrator - Monostabil Multivibrator - Digital tæller - Binær counter - BCD-counter - Skifteregister - Bistabil Multivibrator
Logiske grundbegreber Kombinatorisk logik - Binære tal - Hexadecimal - BCD - Talsystemer - Sandhedstabel - Pull-down - Pull-up - 7-segment-display - Binær Adder - Binær comperator - Logisk Dekoder - HEX-fil
Logisk Reduktion Boolesk Algebra - De Morgan - Karnaughkort - Karnaughkort udlæsning - Automatisk reduktion
Hukommelse RAM - ROM - PROM - EPROM - EEPROM
Logik-familier CMOS-logik - TTL-logik
Seriel Kommunikation Arduino Bluetooth - Baud - Handshake - I2C - I2C Adresser - I2C Bus - I2C Generelt - RS-232 - Serial hardware - Serial hw int cts - Serial software - Seriel port - UART
Generelt Digital-bogen - Digitale Input - Konverter - PWM - Schmitt-trigger - Simulering - Pulsplaner


Kom i gang med Arduino
Grundlæggende forståelse for Arduino Arduino Hardware - Arduino Prototype Print - Blink Eksempel - Overblik - Serial Monitor - Simple Komponenter - Software og Udviklingsmiljø
Programmering af Arduino Anvendelse af Eksempler - Klasser og Objekter - Programafvikling i Arduino - Test af Programmer
Dokumentationsformer Dokumentation med Kode og Flowchart - Dokumentation med State-machines - Flowchart - Pseudokode - Program-kommentarer - Systemdokumentation - Syntaksfarvning - Blokdiagram - Pulsplaner - UML
Opkoblinger til Arduino Moduler og Biblioteker - Driver - Opkobling af Hardware - Simple Komponenter - Tips til anvendelse af ben på Arduino UNO
Kompliceret Programmering Arduino kombineret med Processing - Kommunikation fra Arduino til Processing - Kommunikation fra Processing til Arduino - CopyThread Multitasking - Dokumentation med State-machines - Tid og Samtidighed i Software - Arduino Memory
Kompliceret Hardware I2C - Andre Processorboards - Internet of Things (IoT)
Oprindelige Dokumenter PDF-Version - Forfattere
Software Udviklingsteknikker Agile metoder - Brugertest - SCRUM

Fasemodellen - Kravspecifikation - Databasedesign - Struktur eller Arkitektur - Softwaretest

Projekter Afstand programforslag - Lysmåling - Projektforslag - Prototyper
Undervisningsforløb 4t Valgfag til Folkeskolen - Læsevejledning 4t Valgfag - Materialer til 4t Valgfag - Undervisningsnoter 4t Valgfag - Undervisningsplan 4t Valgfag - Slides til Undervisning

Kort Valgfag til Folkeskolen - Læsevejledning Kort Valgfag - Materialer til Kort Valgfag - Undervisningsnoter Kort Valgfag - Undervisningsplan Kort Valgfag