Tilbake
4.5
Serielle kommunikasjonsprotokoller

4.5 Serielle kommunikasjonsprotokoller

I2C, SPI og UART - protokoller for kommunikasjon mellom elektroniske enheter.

55 min
5 oppgaver
I2CSPIUARTSeriell kommunikasjonBussystemer
Du leser den lesevennlige versjonen
Din fremgang i kapitlet
0 / 5 oppgaver

Når brikkene må snakke sammen

Tenk deg at du har bygd en liten dings med en Arduino. Mikrokontrolleren skal lese temperaturen fra en sensor, skrive et tall til en skjerm og kanskje lagre noe på et minnekort. Men hvordan får disse brikkene egentlig snakket sammen? De har ingen tastatur, ingen stemme – bare noen små ben av metall, pinnene, som de kan sende spenning ut på og lese spenning inn på.

Løsningen er seriell kommunikasjon: data sendes én bit om gangen over én eller noen få ledere. Det høres tregt ut sammenlignet med parallell kommunikasjon, der mange bit sendes samtidig på mange ledere, slik som i gamle skriverkabler. Men seriell vant kampen fordi du slipper en hel bunt med tråder, og fordi det kan kjøres lynraskt. I elektronikkverdenen finnes det tre store serielle protokoller du må kjenne: UART, SPI og I2C. De løser samme oppgave på tre ganske forskjellige måter, og hver av dem har sine styrker.

UART – den enkle praten på to tråder

La oss begynne med den enkleste, UART. Tenk deg to personer som snakker uten en felles klokke på veggen – de må på forhånd bli enige om hvor fort de skal snakke. Akkurat slik fungerer UART: den er asynkron, altså uten et eget klokkesignal. I stedet må sender og mottaker stille inn samme baudrate, altså hastighet. Vanlige verdier er 9600 og 115200 bits per sekund.

UART trenger forbløffende lite: bare to ledere pluss felles jord. TX sender, RX mottar, og GND er den felles bunnlinjen. Siden TX og RX er hver sin leder, kan den sende og motta samtidig – det kalles full-duplex. Hver lille datapakke, en "frame", bygges opp av en startbit som alltid er 0, åtte databit med selve informasjonen, en valgfri paritetsbit til feilsjekk, og til slutt en eller to stoppbit som alltid er 1.

Si at du kobler en GPS-modul til Arduinoen din, og modulen sender med baudrate 9600. Da må du skrive Serial.begin(9600) i koden så hastighetene stemmer. Du kobler modulens TX til Arduinoens RX og omvendt – linjene krysses – og du må huske felles jord. Og en siste felle: bruker den ene 3,3 V og den andre 5 V, trenger du en nivåkonverter, ellers risikerer du å ødelegge brikken. Hva skjer hvis du roter med baudraten, og setter 115200 på den ene og 9600 på den andre? Da sampler mottakeren signalet med feil takt, og du ser bare uleselig "søppeltekst" på skjermen. Det er fordi UART er asynkron og ikke har noe klokkesignal å synkronisere etter.

📝Oppgave Quiz 1

SPI – den raske med en sjef i front

Når UART blir for tregt, henter vi fram SPI. Her er det ikke lenger to likeverdige parter som snakker fritt; nå har vi en tydelig sjef. SPI følger master/slave-prinsippet, der én enhet, masteren, styrer hele kommunikasjonen, og resten lytter. Og denne gangen er det et klokkesignal med – SPI er synkron.

SPI bruker fire ledere. MOSI fører data fra master til slave, MISO fører data andre veien fra slave til master, SCK er klokkesignalet masteren slår takten med, og SS (Slave Select, også kalt Chip Select) brukes til å peke ut hvilken slave som er aktiv. Fordi data går på to atskilte linjer, MOSI og MISO, kan SPI sende og motta samtidig – også den er full-duplex. Og den er rask: typisk fra 1 helt opp til 50 MHz. Det er derfor SPI er førstevalget for SD-kort, fargeskjermer og sensorer som spytter ut mye data.

Men hvordan velger masteren hvem den snakker med når flere slaver henger på? Si at du har både en temperatursensor på SS-pinne 10 og et SD-kort på SS-pinne 4, mens MOSI, MISO og SCK deles av begge. Vil masteren lese temperatur, drar den pinne 10 LOW (aktiv) og holder pinne 4 HIGH (inaktiv), og snakker fritt med sensoren. Skal den så skrive til kortet, snur den om: pinne 4 LOW, pinne 10 HIGH. Regelen er at lav spenning betyr aktiv, høy betyr sovende, og bare én slave kan være aktiv av gangen. Ulempen er åpenbar – du trenger en egen SS-leder for hver eneste slave.

📝Oppgave Quiz 2

I2C – mange enheter på bare to tråder

Til slutt har vi I2C, uttalt "i-to-c". Den løser akkurat problemet SPI sliter med: hva om du vil koble på mange enheter uten å drukne i ledere? I2C er synkron som SPI, men greier seg med bare to ledere, uansett hvor mange enheter du har. SDA er datalinjen, som går begge veier, og SCL er klokkesignalet fra masteren. Fordi det bare er én datalinje, kan I2C sende én vei av gangen – den er half-duplex.

Hemmeligheten bak at så mange enheter kan dele de to lederne, er adressering. Hver enhet har sin egen 7-bits adresse. Si at du har tre I2C-enheter på samme buss: en temperatursensor på adresse 0x48, et akselerometer på 0x68 og en OLED-skjerm på 0x3C. Når Arduinoen vil lese temperatur, sender den en startbetingelse fulgt av adressen 0x48. Bare sensoren med akkurat den adressen svarer; de andre ligger stille. Etterpå sender masteren en stoppbetingelse, og bussen er fri igjen. På denne måten kan du i teorien ha opptil 128 enheter på de samme to lederne. Hastigheten er mer beskjeden enn SPI – fra 100 kHz i standardmodus opp til 3,4 MHz – og en felle er at to enheter med samme fabrikkadresse vil kollidere. Men for sensorer, små skjermer, klokkebrikker og minne er I2C ofte det smarteste valget.

Forestill deg at du bygger en værstasjon med temperatursensor, fuktsensor, trykksensor, en OLED-skjerm og et SD-kort. De fire første sender små datamengder – legg dem alle på I2C-bussen, hver med sin adresse, og slipp unna med to ledere totalt. SD-kortet derimot, som skal skrive store loggfiler raskt, fortjener SPI. Slik bruker du styrkene til begge protokollene samtidig.

📝Oppgave Quiz 3

Oppsummering

Vi har møtt tre måter å la brikker snakke sammen på, alle seriell – én bit om gangen. UART er den enkleste: to ledere (TX og RX), asynkron uten klokke, full-duplex, men avhengig av at begge bruker samme baudrate. Den passer fint til GPS-moduler og feilsøking. SPI er den raske med en master i front: fire ledere (MOSI, MISO, SCK og en SS per slave), synkron og full-duplex, ideell for SD-kort og skjermer. I2C er den fleksible: bare to ledere (SDA og SCL), synkron og half-duplex, der mange enheter deler bussen og skilles ved hver sin 7-bits adresse.

Valget mellom dem handler om behovene dine. Trenger du enkel punkt-til-punkt, velg UART. Trenger du fart, velg SPI. Trenger du mange enheter på få ledere, velg I2C. Og som værstasjonen viste – ofte er det smarteste å kombinere dem og la hver protokoll gjøre det den er best på.

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.