3.25. CAN-väylän perusteet

CAN (Controller Area Network) -väylän suunnitteli alun perin Bosch 1980-luvulla, jotta auton kaikki elektroniset ohjausyksiköt voitiin kytkeä yhteen lyhyeen jaettuun väylään. Se hallitsee yhä auton johtosarjaa, mutta sama vankkuus, reaaliaikainen toiminta ja moni-isäntäinen rakenne tekevät siitä oletuskenttäväylän automaatiossa, robotiikassa sekä kaikenlaisissa maatalous- ja teollisuuslaitteissa.

CAN:lla ei ole yhtä ”ohjainta” ja joukkoa ”oheislaitteita” niin kuin SPI:llä ja I2C:llä. Jokainen väylän solmu on vertainen, ja mikä tahansa solmu voi lähettää aina, kun väylä on vapaana. Tämän mahdollistaa väylän lähetys-ja-arbitrointi-rakenne.

3.25.1. Lähetys prioriteettiarbitroinnilla

Jokainen CAN-väylän viesti sisältää tunnisteen – 11 bittiä klassisessa vakiokehyksessä ja 29 bittiä laajennetussa muunnelmassa. Tunniste ei ole osoite; se kertoo, mistä viesti kertoo (moottorin kierrosluku, jarrupolkimen asento, akkujännite jne.). Kun solmu haluaa lähettää arvon, se lähettää sen merkittynä asianmukaisella tunnisteella, ja jokainen väylän solmu näkee lähetyksen. Kukin vastaanotin suodattaa väylää laitteistotasolla poimiakseen vain ne tunnisteet, joista se välittää.

Jos kaksi solmua yrittää lähettää samaan aikaan, väylän sähköinen rakenne antaa pienemmän numeerisen tunnisteen omaavan viestin voittaa menettämättä yhtään bittiä.

Temppu piilee väylän kahdessa sähköisessä tilassa: dominantti (loogisesti 0) ja resessiivinen (loogisesti 1). CAN-johdot pidetään korkealla (resessiivinen) päätevastusten avulla, kun yksikään solmu ei puhu; mikä tahansa solmu voi vetää johdot alas (dominantti) syöttämällä virtaa lähetinvastaanottimensa kautta. Tuloksena on langoitettu AND (wired-AND): jos yksikin solmu ajaa väylän dominantiksi, linja lukee dominantin, ja se lukee resessiivisen vain, kun jokainen solmu on vapauttanut sen. Dominantti voittaa aina. (Jotkin lähteet kutsuvat samaa järjestelyä wired-OR:ksi, käsitellen ”dominanttia” aktivoituna signaalina pikemminkin kuin resessiivisten bittien AND:na – fyysinen toiminta on molemmissa tapauksissa identtinen.)

Yksittäinen väylälinja, jota päätevastus pitää korkealla kohti Vcc:tä. Kolme solmua (A, B, C) riippuu väylästä. Kunkin solmun lähtöaste on sarjaan kytketty diodi kytkimen kanssa maahan -- diodi osoittaa väylästä alas kytkimelle, joten kytkimen sulkeminen vetää väylän alas diodin läpi, mutta yksikään solmu ei voi ajaa väylää korkealle.

Langoitettu AND käsitteellisessä muodossa. Todellinen CAN ajaa saman logiikan differentiaaliparin (CAN_H / CAN_L) yli niin, että lähetinvastaanottimet ja päätevastukset on jaettu molempien johtojen kesken, mutta sääntö väylällä on sama: mikä tahansa solmu voi vetää dominantiksi, ja vain kun jokainen solmu on vapauttanut, linja lukee resessiivisen.

Arbitrointi hyödyntää tätä epäsymmetriaa suoraan. Jokainen lähettävä solmu lähettää tunnisteensa bitti kerrallaan, MSB ensin, ja tarkkailee väylää lähetyksen aikana. Solmu, joka asettaa johtoon resessiivisen bitin mutta lukee takaisin dominantin, tietää, että toinen solmu, jolla on pienempi tunniste, lähettää samalla hetkellä ja on voittanut kyseisen bittiposition. Se lopettaa väylän ajamisen välittömästi ja kuuntelee. Voittava solmu puolestaan näkee omien bittiensä menevän ulos muuttumattomina – sen näkökulmasta mitään epätavallista ei tapahtunut. Pienemmän numeron tunniste voittaa, koska sen dominantit bitit ohittavat ne resessiiviset bitit, jotka suuremman numeron tunnisteet olisivat muuten lähettäneet samoissa positioissa.

Häviäjä odottaa sitten väylän vapautumista ja yrittää automaattisesti uudelleen. Törmäyksiä ei ole, viestejä ei häviä – on vain deterministinen prioriteettijärjestys.

Tämä on se julkaise/tilaa-tyyli, joka saa CAN:n toimimaan suuressa mittakaavassa: kuka tahansa voi puhua, kuka tahansa voi kuunnella, ja tunnisteet tekevät jakelusta implisiittistä.

3.25.2. Fyysinen väylä

MCU:n CAN-ohjain ei aja väylää suoraan. Se tarjoaa vain kaksi 3,3 V:n CMOS-nastaa – TX (bitti, jonka se haluaa lähettää) ja RX (bitti, jonka se näkee väylällä) – ja nämä nastat menevät erilliseen sirulle, jota kutsutaan CAN-lähetinvastaanottimeksi tai PHY:ksi. Lähetinvastaanotin sijaitsee ohjaimen ja varsinaisten CAN-johtojen välissä; se osaa puhua väylälle.

Väylä itse on 5 V:n differentiaalipari:

  • CAN_H – parin ”korkea” johto.

  • CAN_L – ”matala” johto.

Resessiivisessä tilassa molemmat johdot ovat noin 2,5 V:ssa (väylän 5 V:n syötön keskipiste). Dominantissa tilassa lähetinvastaanotin nostaa CAN_H:n noin 3,5 V:iin ja laskee CAN_L:n noin 1,5 V:iin, tuottaen parin yli noin 2 V:n differentiaalin. Vastaanottimet näytteistävät kahden johdon välisen eron, mikä tekee signaalista immuunin pitkillä kaapeleilla kerääntyvälle yhteismuotoiselle kohinalle.

Lähetinvastaanottimen kaksisuuntainen tehtävä:

  • TX-puolella se lukee ohjaimen 3,3 V:n yksipäisen TX-nastan ja joko ajaa CAN_H:n ja CAN_L:n erilleen dominantille tai vapauttaa molemmat resessiiviselle.

  • RX-puolella se lukee differentiaalisen CAN_H / CAN_L -parin ja raportoi yksipäisen 3,3 V:n tason RX-nastassaan takaisin ohjaimelle.

Kaksi 120 ohmin päätevastusta, yksi kaapelin kummassakin fyysisessä päässä, pitävät väylän resessiivisessä keskipisteessä, kun yksikään solmu ei aja, ja vaimentavat heijastuksia, jotka muuten turmelisivat differentiaalisignaalin pitkillä matkoilla.

3.25.3. Datakehys

Vakiomuotoinen CAN-datakehys näyttää johdossa tältä:

Kahdeksan kenttää piirrettynä peräkkäin: SOF (1 bitti), ID (11 bittiä), RTR (1 bitti), ohjaus (6 bittiä), data (0 -- 8 tavua), CRC (16 bittiä), ACK (2 bittiä) ja EOF (7 bittiä).

Vakiomuotoinen CAN-datakehys: SOF-, ID-, RTR-, ohjaus-, data-, CRC-, ACK- ja EOF-kentät.

Kullakin kentällä on tietty tehtävä:

  • SOF (start of frame, kehyksen alku). Yksi dominantti bitti, joka kertoo uuden kehyksen alkavan ja synkronoi jokaisen solmun bittikellon.

  • ID (tunniste). 11-bittinen tunniste, jonka mukaan väylä arbitroi. Pienempi numero = korkeampi prioriteetti.

  • RTR (remote transmission request, etälähetyspyyntö). Asetetaan datan pyynnössä pikemminkin kuin datan toimituksessa; vastaanottimet, joilla on vastaava tunniste, vastaavat lähettämällä datan itse.

  • Ohjaus. 6-bittinen kenttä, joka koodaa datan pituuden (DLC) ja muutaman ylläpitobitin.

  • Data. 0–8 tavua hyötykuormaa (CAN Classic; CAN FD laajentaa tämän 64 tavuun).

  • CRC. 16 bittiä yhteensä: 15-bittinen CRC edeltävien kenttien yli sekä 1-bittinen CRC-erotin.

  • ACK. 2 bittiä yhteensä. Ensimmäisessä bitissä – ACK-paikassa – lähetin vapauttaa linjan ja mikä tahansa solmu, joka vastaanotti kehyksen oikein, vetää sen alas; toinen bitti on resessiivinen erotin. ACK:n puuttuminen kertoo lähettimelle, ettei yksikään solmu kuullut kehystä ja sen pitäisi yrittää uudelleen.

  • EOF (end of frame, kehyksen loppu). Seitsemän resessiivistä bittiä, jotka päättävät kehyksen.

Kaiken tämän generoi ja dekoodaa CAN-ohjain laitteistotasolla; ohjelmisto näkee vain tunnisteen, datan ja muutaman lipun.

3.25.4. Mihin CAN sijoittuu

CAN:n suunnitteluvalinnat määrittävät sen erikoisalueen:

  • Vankka. Differentiaalinen signalointi kierretyllä parikaapelilla, sisäänrakennettu virheentunnistus, deterministinen prioriteettiarbitrointi ja automaattiset uudelleenyritykset saavat CAN:n selviytymään sähköisesti kohinaisissa ympäristöissä, joissa UART ja SPI turmelisivat dataa.

  • Moni-isäntäinen. Mikä tahansa solmu voi puhua milloin tahansa. Keskusohjainta ei tarvita, eikä yksikään solmu ole yksittäinen vikaantumiskohta.

  • Kaistanleveydeltään rajoitettu. Klassinen CAN huipentuu noin 1 Mbit/s:iin; CAN FD laajentaa tätä. CAN on oikea vastaus, kun linkki on piirilevyjen tai moduulien välillä, usein metrien kaapelimatkojen yli, ja luotettavuus on etusijalla.

  • Ylemmän tason protokollat. Paljas CAN-väylä ei kerro, mitä tunniste tarkoittaa tai kuinka pitkä viesti jaetaan fragmentteihin. Sovellustason protokollat – CANopen, J1939, ISO-TP/UDS, NMEA 2000 – kerrostavat nämä säännöt päälle. Erillinen tuntemisen arvoinen kohta on DBC-tiedosto: valmistajakohtainen tekstimuoto, joka tallentaa, mitkä tunnisteet kuljettavat mitäkin bittitason signaaleja tietyssä ajoneuvossa tai järjestelmässä. DBC-tiedostot ovat metatietomuoto, joka kuvaa yhden väylän viestirakennetta, ei oma protokollansa.

CAN-väylä koodissa-osion ajuri käsittelee johtotason CAN-kehystä; tunnisteiden kuvaaminen merkityksiksi on sovelluksen tehtävä.