I2C, SPI og UART - protokoller for kommunikasjon mellom elektroniske enheter.
Seriell kommunikasjon mellom komponenter
Inne i elektroniske enheter må komponenter kommunisere med hverandre. En mikrokontroller (som Arduino) må for eksempel lese data fra en sensor, sende tekst til en skjerm eller kommunisere med en annen mikrokontroller. Til dette bruker vi serielle kommunikasjonsprotokoller.
Seriell kommunikasjon betyr at data sendes én bit om gangen over én eller noen få ledere. Motsetningen er parallell kommunikasjon, som sender flere bit samtidig (f.eks. gamle skriverkabler).
De tre viktigste serielle protokollene i elektronikk er:
- UART – enkel, asynkron, punkt-til-punkt
- SPI – rask, full-duplex, master/slave
- I2C – fleksibel, to ledere, mange enheter
Kjennetegn:
- To ledere: TX (sender) og RX (mottaker) – pluss felles jord (GND)
- Asynkron: Ingen klokkesignal – baudraten må settes likt på begge sider
- Punkt-til-punkt: Kobler sammen kun to enheter
- Full-duplex: Kan sende og motta samtidig (på separate ledere)
Vanlige baudrater: 9600, 19200, 38400, 57600, 115200 bps
Et UART-datapakke (frame) ser slik ut:
- 1 startbit (alltid 0)
- 8 databits (selve informasjonen)
- 0 eller 1 paritetsbit (valgfri feilsjekk)
- 1–2 stoppbit (alltid 1)
Du kobler en GPS-modul til en Arduino via UART. GPS-modulen sender data med baudrate 9600. Hva må du passe på?
For at kommunikasjonen skal fungere må du:
1. Sette riktig baudrate: I Arduino-koden skriver du Serial.begin(9600) for å matche GPS-modulens hastighet.
2. Koble riktig: GPS-modulens TX → Arduinos RX, og GPS-modulens RX → Arduinos TX. Linjene krysses.
3. Felles jord: Koble GND-pinnene sammen.
4. Spenningsnivå: Sjekk at begge bruker 3,3V eller 5V logikk. Hvis GPS bruker 3,3V og Arduino bruker 5V, trenger du en nivåkonverter for å unngå skade.
Hvis baudraten er feil, vil du se uleselig «søppeltekst» i seriemonitoren.
Hva betyr det at UART er asynkron?
SPI bruker 4 ledere:
- MOSI (Master Out Slave In): Data fra master til slave
- MISO (Master In Slave Out): Data fra slave til master
- SCK (Serial Clock): Klokkesignal fra master
- SS/CS (Slave Select / Chip Select): Velger hvilken slave som er aktiv (én per slave)
Kjennetegn:
- Synkron: Klokkesignal styrer overføringen
- Full-duplex: Sender og mottar data samtidig
- Høy hastighet: Typisk 1–50 MHz
- Flere slaver: Trenger én SS-linje per slave-enhet
Typiske bruksområder: SD-kort, TFT-skjermer, rask sensorkommunikasjon.
Du har en Arduino (master) koblet til en temperatursensor og et SD-kort via SPI. Forklar hvordan masteren velger hvilken enhet den kommuniserer med.
SPI bruker Slave Select (SS)-linjer for å velge aktiv enhet:
- Temperatursensoren er koblet til SS-pinne 10
- SD-kortet er koblet til SS-pinne 4
- MOSI, MISO og SCK deles av begge
Når Arduinoen vil lese temperatur:
1. Sett SS-pinne 10 LOW (aktiver sensor)
2. Sett SS-pinne 4 HIGH (deaktiver SD-kort)
3. Send/motta data via MOSI/MISO
Når Arduinoen vil skrive til SD-kort:
1. Sett SS-pinne 4 LOW (aktiver SD-kort)
2. Sett SS-pinne 10 HIGH (deaktiver sensor)
3. Send/motta data
Bare én slave kan være aktiv om gangen. Lav (LOW) = aktiv, høy (HIGH) = inaktiv.
Forklar hva som menes med «full-duplex» kommunikasjon i SPI, og hvordan dette skiller seg fra «half-duplex».
De to lederne:
- SDA (Serial Data): Datalinje (toveis)
- SCL (Serial Clock): Klokkesignal fra master
Kjennetegn:
- Synkron: Klokkesignal styrer overføringen
- Half-duplex: Data sendes én vei om gangen på SDA
- Adressebasert: Hver enhet har en unik 7-bits adresse (0x00–0x7F)
- Multi-master/multi-slave: Flere mastere og opptil 128 slaver på samme buss
- Moderat hastighet: Standard 100 kHz, fast mode 400 kHz, high-speed 3,4 MHz
Typiske bruksområder: sensorer (temperatur, akselerometer), OLED-skjermer, sanntidsklokker (RTC), EEPROM-minne.
Du har tre I2C-sensorer koblet til en Arduino: en temperatursensor (adresse 0x48), et akselerometer (adresse 0x68) og en OLED-skjerm (adresse 0x3C). Forklar hvordan masteren velger riktig enhet.
I I2C brukes adresser i stedet for separate select-linjer:
1. Alle tre enhetene er koblet til de samme to lederne (SDA og SCL).
2. Når Arduinoen vil lese temperatur, sender den en startbetingelse fulgt av adressen 0x48 og en lese-bit.
3. Kun temperatursensoren (som har adresse 0x48) svarer – de andre ignorerer meldingen.
4. Etter kommunikasjonen sender Arduinoen en stoppbetingelse.
Fordelen med I2C er at du trenger bare 2 ledere uansett hvor mange enheter du har (opptil 128 med 7-bits adresser). Ulempen er at det er langsommere enn SPI og at adresser kan kollidere hvis to enheter har samme fabrikkadresse.
Hvor mange ledere trenger I2C for datakommunikasjon (utenom jord)?
Oppsummering
| Egenskap | UART | SPI | I2C |
|---|---|---|---|
| Ledere | 2 (TX, RX) | 4+ (MOSI, MISO, SCK, SS) | 2 (SDA, SCL) |
| Synkron/asynkron | Asynkron | Synkron | Synkron |
| Duplex | Full-duplex | Full-duplex | Half-duplex |
| Hastighet | Opptil 115200 bps | 1–50 MHz | 100 kHz – 3,4 MHz |
| Antall enheter | 2 (punkt-til-punkt) | 1 master + flere slaver | Flere mastere + slaver |
| Adressering | Ingen | Slave Select-linjer | 7-bits adresser |
- UART er enklest og brukes ofte for debugging og GPS-moduler.
- SPI er raskest og brukes for skjermer og minnekort.
- I2C er mest fleksibel med tanke på antall enheter og brukes for sensorer.
Du skal designe et værstasjonsystem med Arduino. Systemet trenger: en temperatursensor, en luftfuktighetssensor, en barometrisk trykksensor, en OLED-skjerm for visning, og et SD-kort for logging. Hvilken seriell protokoll ville du valgt for hver komponent, og begrunn valgene.
Forklar hva som skjer hvis to UART-enheter er konfigurert med ulik baudrate (f.eks. 9600 og 115200). Hva vil mottakeren se?
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.