class CAN – Controller Area Network -protokolla¶
CAN on kaksijohtiminen sarjaprotokolla, jota käytetään luotettavaan reaaliaikaiseen viestien välitykseen yhden tai useamman yhteiseen väylään kytketyn solmun välillä. CAN 2.0 standardoitiin ISO-11898-standardissa, ja se tunnetaan nykyään myös nimellä CAN Classic.
On olemassa myös uudempi, taaksepäin yhteensopiva protokolla nimeltä CAN FD (CAN with Flexible Data-Rate). machine.CAN -ajuri ei tällä hetkellä tue CAN FD -ominaisuuksia; käytä pyb.CAN -luokkaa STM32:lla, jos tarvitset CAN FD:tä.
CAN-tuki vaatii ohjaimen (usein sisäinen mikro-ohjaimen oheislaite) sekä ulkoisen lähetin-vastaanottimen, joka muuntaa signaalien jännitetasot CAN-väylälle sopiviksi.
Saatavilla STM32 OpenMV -kameroissa (M4 / M7 / H7 / H7 Plus / Pure Thermal / N6 sekä Arduino-merkkisissä varianteissa, joihin on kytketty lähetin-vastaanotin). Ei vielä tuettu OpenMV Cam RT1062 -laitteella (mimxrt-portti) eikä OpenMV Cam AE3 -laitteella (alif-portti).
machine.CAN -rajapinta on matalan tason perustason CAN-viestintärajapinta, joka abstrahoi CAN-ohjaimen lähtevien viestien prioriteettijonoksi, saapuvien viestien jonoksi sekä virheiden raportointimekanismeiksi.
Muista
Suunnitellut can- ja aiocan-micropython-lib-moduulit tulevat olemaan suositeltu tapa käyttää CANia MicroPythonissa.
Konstruktori¶
- class machine.CAN(id: int, *args, **kwargs)¶
Luo annetun id:n mukainen CAN-ohjainolio:
idyksilöi tietyn CAN-ohjainolion; se on kortti- ja porttikohtainen.Kaikki muut argumentit välitetään
CAN.init()-funktiolle. Vähintään yksi argumentti (bitrate) on annettava.
Tämän luokan tulevat versiot saattavat hyväksyä tässä myös porttikohtaisia avainsana-argumentteja, jotka konfiguroivat laitteistoa. Tällä hetkellä tällaisia avainsana-argumentteja ei ole toteutettu.
Esimerkki¶
Luo ja alusta CAN-ohjain 1 siirtonopeudella 500 kbps:
from machine import CAN can = CAN(1, 500_000)
Metodit¶
- init(bitrate: int, mode: int = CAN.MODE_NORMAL, sample_point: int = 75, sjw: int = 1, tseg1: int | None = None, tseg2: int | None = None) None¶
Alusta CAN-väylä annetuilla parametreilla:
bitrate on haluttu väylän bittinopeus bitteinä sekunnissa.
mode on jokin kohdassa Tilat esitetyistä arvoista, joka ilmaisee halutun toimintatilan. Oletus on ”normal”-toiminta väylällä.
Seuraavat parametrit ovat valinnaisia ja liittyvät CAN-bittiajoituksiin. Useimmissa tapauksissa nämä parametrit voi jättää oletusarvoihinsa:
sample_point on databitin ajan kokonaislukuprosentti. Se määrittää bittinäytteen sijainnin suhteessa koko nimelliseen bittiaikaan. CAN-ajuri laskee parametrit vastaavasti. Tämä parametri jätetään huomiotta, jos tseg1 ja tseg2 on asetettu.
sjw on uudelleensynkronoinnin hyppyleveys aikakvanttiyksiköissä nimellisille biteille; se voi olla arvo väliltä 1–4 (mukaan lukien) klassisessa CANissa.
tseg1 määrittää näytepisteen sijainnin aikakvanttiyksiköissä nimellisille biteille; se voi olla arvo väliltä 1–16 (mukaan lukien) klassisessa CANissa. Tämä on ISO-11898-standardissa määriteltyjen
Prop_Seg- jaPhase_Seg1-vaiheiden summa. Jos tämä arvo on asetettu, myös tseg2 on asetettava, ja sample_point jätetään huomiotta.tseg2 määrittää lähetyspisteen sijainnin aikakvanttiyksiköissä nimellisille biteille; se voi olla arvo väliltä 1–8 (mukaan lukien) klassisessa CANissa. Tämä vastaa ISO-11898-standardin
Phase_Seg2-vaihetta. Jos tämä arvo on asetettu, myös tseg1 on asetettava.
Jos nämä argumentit annetaan, CAN-ohjain konfiguroidaan oikein halutulle bitrate-arvolle ja määritetylle aikakvanttien kokonaismäärälle bittiä kohden. tseg1- ja tseg2-arvot ohittavat sample_point-argumentin, jos kaikki nämä annetaan.
Muista
Yksittäisellä ohjainlaitteistolla voi olla lisärajoituksia näiden parametrien sallituille arvoille, ja se nostaa poikkeuksen
ValueError, jos annettua arvoa ei tueta.Muista
Tietty ohjainlaitteisto voi hyväksyä lisävalinnaisia avainsanaparametreja laitteistokohtaisille ominaisuuksille, kuten ylinäytteistykselle.
- set_filters(filters: list | tuple | None) None¶
Aseta vastaanottosuodattimet CAN-ohjaimeen. filters voi olla:
Nonekaikkien saapuvien viestien hyväksymiseksi, tai[]tai()kaiken viestien vastaanoton estämiseksi, taiIteroituva kokoelma, jossa on yksi tai useampi suodatusehdot määrittävä alkio. Kunkin alkion tulee olla kolmen elementin tuple tai lista:
identifieron CAN-tunniste (int).bit_maskon CAN-tunnistekentän bittien bittimaski (int).flagson kokonaisluku, jossa on asetettuna nolla tai useampi kohdassa Viestiliput määritellyistä biteistä. Tämä määrittää ominaisuudet, jotka saapuvan viestin on täsmättävä. Kaikki ohjaimet eivät tue suodatusta kaikkien lippujen perusteella; poikkeusValueErrornostetaan, jos pyydetään tukematonta lippua.
Saapuvat viestit hyväksytään, jos
bit_mask-maskissa maskatut bitit täsmäävät viestin tunnisteen ja suodattimenidentifier-arvon välillä, ja suodattimessa asetetut liput täsmäävät saapuvaan viestiin.Jos
CAN.FLAG_EXT_ID-bitti on asetettu lipuissa, suodatin täsmää vain laajennettuihin CAN-tunnisteisiin (Extended). JosCAN.FLAG_EXT_ID-bitti ei ole asetettu, suodatin täsmää vain vakiomuotoisiin CAN-tunnisteisiin (Standard).Kaikki suodattimet yhdistetään ohjaimessa OR-operaatiolla. Tyhjän listan tai tuplen antaminen filters-argumenttina tarkoittaa, ettei yhtään viestiä vastaanoteta.
Jotkin CAN-ohjaimet vaativat, että kukin suodatin liittyy vain yhteen vastaanotto-FIFO:hon. Näissä tapauksissa argumentin suodatinalkiot jaetaan vuorotellen käytettävissä oleviin FIFO:hin. Tämä ajuri ei erottele FIFO:ja vastaanotto-IRQ:ssa.
Muista
Jos kutsuja antaa iteroituvan, jossa on enemmän alkioita kuin
CAN.FILTERS_MAX, nostetaan poikkeusValueError.Muista
Jos joko
identifiertaibit_maskon määritetyn ID-tyypin sallitun alueen ulkopuolella, nostetaan poikkeusValueErrorsyyllä ”invalid id”.Esimerkkejä¶
Vastaanota kaikki saapuvat viestit:
can.set_filters(None)Vastaanota vain viestit, joiden vakiomuotoinen (Standard) ID-arvo on 0x301 ja 0x700:
can.set_filters(((0x301, 0x7FF, 0), (0x700, 0x7FF, 0)))
Vastaanota vain viestit, joiden vakiomuotoinen (Standard) ID-arvo on välillä 0x300–0x3FF, sekä laajennettu (Extended) ID-arvo 0x50700:
can.set_filters(((0x300, 0x700, 0), (0x50700, 0x1FFF_FFFF, CAN.FLAG_EXT_ID)))
- FILTERS_MAX: int¶
Vakioarvo, joka lukee tämän laitteisto-ohjaimen tukemien vastaanottosuodattimien enimmäismäärän.
Huomaa, että joillakin ohjaimilla voi olla monimutkaisempia laitteistorajoituksia käytössä olevien suodattimien määrälle (esimerkiksi laskemalla Standard- ja Extended-ID-suodattimet erikseen). Näissä tapauksissa
CAN.set_filtersvoi nostaa poikkeuksenValueErrorvaikkaFILTERS_MAX-rajaa ei ylitettäisi.
- send(id: int, data: bytes, flags: int = 0) int | None¶
Kopioi uusi CAN-viesti ohjaimen laitteiston lähetysjonoon väylälle lähetettäväksi. Lähetysjono on prioriteettijono, joka on järjestetty CAN-tunnisteen prioriteetin mukaan (pienemmillä numeerisilla tunnisteilla on korkeampi prioriteetti).
id on kokonaislukuarvoinen CAN-tunniste.
data on bytes-olio (tai vastaava), joka sisältää CAN-viestin datan tai kuvaa Remote Transmission Request -pyynnön (katso alla).
flags on kokonaisluku, jossa on asetettuna nolla tai useampi kohdassa Viestiliput määritellyistä biteistä ja joka määrittää lähtevän CAN-viestin ominaisuudet (Extended ID, Remote Transmission Request jne.).
Jos viesti asetetaan onnistuneesti väylälle lähetettäväksi jonoon, funktio palauttaa kokonaisluvun väliltä
0jaCAN.TX_QUEUE_LEN(poislukien). Tämä arvo on lähetyspuskurin indeksi, johon viesti on asetettu lähetettäväksi, ja sitä voidaan käyttääCAN.cancel_send-funktiossa jaCAN.IRQ_TX-tapahtumissa.Jos jono on täynnä, lähetys epäonnistuu ja palautetaan
None.Lähetys voi epäonnistua ja palauttaa
Nonemyös silloin, jos annetulla id-arvolla on sama prioriteetti kuin lähetysjonossa jo olevalla viestillä eikä CAN-ohjainlaitteisto voi taata, että samalla ID:llä varustetut viestit lähetetään väylälle samassa järjestyksessä kuin ne lisättiin jonoon. Lähettääksesi viestin silti, anna flags-argumentissa lippuCAN.FLAG_UNORDERED. Tämä lippu ilmaisee, että samalla CAN-ID:llä varustetut viestit voidaan lähettää väylälle missä tahansa järjestyksessä.Jos ohjain on ”Bus Off” -virhetilassa tai pois käytöstä, tämän funktion kutsuminen nostaa poikkeuksen
OSError.Muista
Tämä tarkoituksellisen matalan tason toteutus on suunniteltu niin, että kutsuja voi rakentaa ohjelmistopohjaisen jonon lähteville viesteille.
Tärkeä
CANin ”lähetysjono” ei ole FIFO-jono, vaan se on prioriteettijärjestyksessä, ja vaikka se voi sisältää enintään
CAN.TX_QUEUE_LENalkiota, samanaikaisesti jonotettaville viesteille voi olla muita laitteistorajoituksia.Remote Transmission Request -pyynnöt¶
Jos bitti
CAN.FLAG_RTRon asetettu flags-argumentissa, ohjain lähettää viestin sijasta Remote Transmission Request -pyynnön. Tässä tapauksessa data-argumentin sisältö jätetään huomiotta. Ohjain lähettää pyynnön, jossaDLC-pituuskenttä on yhtä suuri kuin data-argumentin pituus.Esimerkkejä¶
Yritä lähettää viesti, jonka kolmen tavun hyötykuorma on
0a0b0cja vakiomuotoinen (Standard) ID on 0x200:can.send(0x200, b"\x0a\x0b\x0c", 0)Yritä lähettää viesti, jonka hyötykuorma on tyhjä ja laajennettu (Extended) ID on 0x180008. Ilmaise, että ohjain voi lähettää tällä ID:llä varustetut viestit missä tahansa järjestyksessä, siltä varalta että muita samalla ID:llä varustettuja viestejä on jo jonossa lähetettäväksi:
can.send(0x180008, b"", can.FLAG_EXT_ID | can.FLAG_UNORDERED)Yritä lähettää Remote Transmission Request -pyyntö, jonka pituus on 8 tavua ja vakiomuotoinen (Standard) ID 0x555:
can.send(0x555, b" " * 8, can.FLAG_RTR)
- recv(arg: list | None = None) list | None¶
Palauta CAN-viesti, jonka ohjain on vastaanottanut
CAN.set_filters()-funktiolla asetettujen suodattimien mukaisesti.Tämä funktio ottaa yhden valinnaisen argumentin; jos se annetaan, sen on oltava lista, jossa on vähintään 4 elementtiä ja jonka toinen elementti on
memoryview-olio, joka viittaabytearray-olioon tai vastaavaan olioon, jolla on riittävästi kapasiteettia minkä tahansa vastaanotetun CAN-viestin tallentamiseen (8 tavua CAN Classicille, 64 tavua CAN FD:lle). Annettu lista palautetaan onnistuneena tuloksena, mikä välttää muistinvarauksen funktion sisällä.Jos CAN-ohjain ei ole vastaanottanut yhtään viestiä, tämä funktio palauttaa
None.Muista
CAN.set_filterson kutsuttava ennen kuin ohjain voi vastaanottaa yhtään viestiä. Vastaanottaaksesi kaikki viestit, kutsuset_filters(None).Jos CAN-ohjain on vastaanottanut viestin, tämä funktio palauttaa listan, jossa on 4 elementtiä:
Indeksi 0 on vastaanotetun viestin CAN-ID kokonaislukuna.
Indeksi 1 on memoryview, joka tarjoaa pääsyn vastaanotetun viestin dataan.
Jos arg ei ole annettu, tämä on
memoryview, joka sisältää vastaanotetut tavut. Tätämemoryview-oliota tukee juuri varattubytearray, joka on riittävän suuri tallentamaan minkä tahansa vastaanotetun CAN-viestin. Tämä mahdollistaa tuloksen turvallisen uudelleenkäytön tulevana arg-argumenttina muistinvarausten säästämiseksi.Jos arg annetaan, annetun
memoryview-olion kokoa muutetaan sisältämään täsmälleen vastaanotetut tavut. Kutsuja on vastuussa siitä, ettämemoryview-olion taustaolio voi sisältää minkä tahansa pituisen CAN-viestin.
Indeksi 2 on kokonaisluku, jossa on asetettuna nolla tai useampi kohdassa Viestiliput määritellyistä biteistä. Se ilmaisee vastaanotetun viestin metatietoja.
Indeksi 3 on kokonaisluku, jossa on asetettuna nolla tai useampi kohdassa Vastaanoton virheliput määritellyistä biteistä. Mikä tahansa nollasta poikkeava arvo ilmaisee mahdollisia ongelmia CAN-viestien vastaanotossa. Nämä liput nollataan ohjaimen sisällä joka kerta, kun tämä funktio palaa.
Remote Transmission Request -pyynnöt¶
Jos Remote Transmission Request -pyyntö vastaanotetaan, bitti
CAN.FLAG_RTRasetetaan indeksiin 2, ja indeksin 1 memoryview sisältää pelkkiä nollia pituudella, joka on yhtä suuri kuin vastaanotetun pyynnönDLC-kenttä.Esimerkki¶
can.set_filters(None) # receive all while True: res = can.recv() if res: can_id, data, flags, errs = res print("Received", hex(can_id), data.hex(), hex(flags), hex(errs)) else: time.sleep_ms(1) # not a good pattern, use the irq instead!
- irq(handler: Callable[[CAN], None] | None = None, trigger: int = 0, hard: bool = False) None¶
Asettaa keskeytyksen käsittelijäfunktion handler, joka kutsutaan, kun yksi tai useampi trigger-argumentissa lipulla merkityistä tapahtumista on tapahtunut.
handler on funktio, joka kutsutaan keskeytystapahtuman lauetessa. Käsittelijän on otettava täsmälleen yksi argumentti, joka on
CAN-instanssi.trigger konfiguroi tapahtuma(t), jotka voivat synnyttää keskeytyksen. Mahdolliset arvot ovat maski yhdestä tai useammasta seuraavista:
CAN.IRQ_RX-tapahtuma tapahtuu, kun CAN-ohjain on vastaanottanut vähintään yhden viestin RX-FIFO:hon (mikä tarkoittaa, ettäCAN.recv()palautuu onnistuneesti).CAN.IRQ_TX-tapahtuma tapahtuu, kun CAN-ohjain on joko onnistuneesti lähettänyt viestin CAN-väylälle tai epäonnistunut viestin lähettämisessä. Tällä laukaisimella on käsittelijälle lisävaatimuksia, katso tarkemmin IRQ-liput.CAN.IRQ_STATE-tapahtuma tapahtuu, kun CAN-ohjain on siirtynyt vakavampaan virhetilaan. KutsuCAN.state()saadaksesi päivitetyn tilan.
hard jos True, käytetään kovaa keskeytystä. Tämä vähentää viivettä CAN-ohjaimen tapahtuman ja käsittelijän kutsumisen välillä. Kovat keskeytyskäsittelijät eivät saa varata muistia; katso Keskeytyskäsittelijöiden kirjoittaminen.
Palauttaa irq-olion. Jos kutsutaan ilman argumentteja, palautetaan aiemmin konfiguroitu irq-olio.
Katso esimerkki kohdasta IRQ-liput.
- cancel_send(index: int) bool¶
Pyydä CAN-ohjainta peruuttamaan viestin lähettäminen väylälle.
Argumentti index yksilöi yhden lähetyspuskurin. Sen tulee olla kokonaisluku väliltä
0jaCAN.TX_QUEUE_LEN(poislukien). Yleensä tämä onCAN.send()-funktion aiemmin palauttama arvo.Tulos on
True, jos tässä puskurissa oli viesti odottamassa lähetystä ja lähetys peruutettiin.Tulos on muutoin
False(joko tässä puskurissa ei ollut viestiä odottamassa lähetystä, tai lähetys onnistui jo).IRQ-tapahtumaa
CAN.IRQ_TXtulisi käyttää sen määrittämiseen, lähetettiinkö viesti varmasti vai ei, mutta huomaa, että on mahdollisia kilpailutilanteita, jos lähetys peruutetaan ja samaa puskuria käytetään sitten toisen viestin lähettämiseen (etenkin jos CAN-ohjaimen IRQ ei ole ”hard”).
- state() int¶
Palauttaa kokonaislukuarvon, joka ilmaisee ohjaimen nykyisen tilan. Arvo on jokin kohdassa Tilat määritellyistä arvoista.
Lievemmät virhetilat voivat poistua automaattisesti, jos väylä toipuu, mutta
CAN.STATE_BUS_OFF-tilasta voi toipua vain kutsumallaCAN.restart().
- get_counters(list: list | None = None, /) list¶
Palauttaa ohjaimen virhelaskureiden arvot. Tulos on lista, jossa on kahdeksan arvoa. Jos valinnainen list-parametri annetaan, annettu lista-olio päivitetään ja palautetaan tuloksena varauksen välttämiseksi.
Listan alkiot ovat:
TEC (Transmit Error Counter) -arvo
REC (Receive Error Counter) -arvo
Kuinka monta kertaa ohjain siirtyi varoitustilaan (Warning) aktiivisesta tilasta (Active).
Kuinka monta kertaa ohjain siirtyi Error Passive -tilaan varoitustilasta (Warning).
Kuinka monta kertaa ohjain siirtyi Bus Off -tilaan Error Passive -tilasta.
Laitteistojonossa odottavien TX-viestien kokonaismäärä.
Laitteistojonossa odottavien RX-viestien kokonaismäärä.
Kuinka monta kertaa RX-ylivuoto tapahtui.
Muista
Ohjaimesta riippuen nämä arvot voivat ylivuotaa takaisin nollaan tietyn arvon jälkeen.
Muista
Jos ohjain ei tue tiettyä laskuria, se palauttaa
Nonekyseiselle listan elementille.
- get_timings(list: list | None = None, /) list¶
Palauttaa listan elementtejä, jotka ilmaisevat CAN-ohjaimeen tällä hetkellä konfiguroidut ajoitukset. Tätä voidaan käyttää ajoitusten varmentamiseen virheenkorjaustarkoituksiin. Tulos on lista, jossa on kuusi arvoa. Jos valinnainen list-parametri annetaan, annettu lista-olio päivitetään ja palautetaan tuloksena varauksen välttämiseksi.
Listan alkiot ovat:
Ohjaimen käyttämä tarkka siirtonopeus. Voi poiketa
CAN.init()-funktiolle annetusta bitrate-argumentista laitteistorajoitusten täyttämiseksi tehdyn kvantisoinnin vuoksi.Uudelleensynkronoinnin hyppyleveys (SJW) aikakvanttiyksiköissä nimellisille biteille. Sillä on sama merkitys kuin
CAN.init()-funktion sjw-parametrilla.Näytepisteen sijainti aikakvanttiyksiköissä nimellisille biteille. Sillä on sama merkitys kuin
CAN.init()-funktion tseg1-parametrilla.Lähetyspisteen sijainti aikakvanttiyksiköissä nimellisille biteille. Sillä on sama merkitys kuin
CAN.init()-funktion tseg2-parametrilla.CAN FD -ajoitustiedot.
Noneohjaimille, jotka eivät tue CAN FD:tä, tai jos CAN FD:tä ei ole alustettu. Muutoin neljän elementin sisäkkäinen lista, joka vastaa yllä olevia alkioita mutta soveltuu CAN FD:n BRS-ominaisuuteen.Valinnaiset ohjainkohtaiset ajoitustiedot. Ohjaimesta riippuen tämä on joko
None, jos ohjain ei raportoi mitään, tai se on vakiopituinen lista, jonka elementit ovat tietyn laitteisto-ohjaimen mukaisia.
Muista
Jos
CAN.init()-funktiota ei ole kutsuttu, tämä funktio palauttaa silti tuloksen, mutta tulos riippuu ohjaimen sisäisistä tiedoista eikä se välttämättä ole tarkka.
- restart() None¶
Saa ohjaimen poistumaan tilasta
STATE_BUS_OFFtyhjentämättä muuta sisäistä tilaa. Tyhjentää myös osan virhelaskureista (aina niiden kertojen määrän, jolloin kuhunkin virhetilaan on siirrytty, mahdollisesti myös TEC:n ja REC:n ohjaimesta riippuen).Tämän funktion kutsuminen peruuttaa myös kaikki lähetystä odottavat viestit. Näille viesteille ei toimiteta
IRQ_TX-keskeytyksiä.Huomaa, että tämä funktio voi saada tai olla saamatta ohjaimen poistumaan ”Error Passive” -tilasta riippuen siitä, nollaako ohjainlaitteisto TEC:n ja REC:n vai ei.
- deinit() None¶
Poistaa aiemmin aktiivisen CAN-instanssin alustuksen. Kaikki odottavat viestit (lähetys ja vastaanotto) hylätään, ja ohjain lopettaa väylällä toimimisen. Käyttääksesi tätä instanssia uudelleen, kutsu
CAN.init().Tähän funktioon vastauksena ei kutsuta
IRQ_TX- eikäIRQ_RX-keskeytyksiä.Katso myös
CAN.restart().
Vakiot¶
- TX_QUEUE_LEN: int¶
Suurin määrä CAN-viestejä, jotka voidaan jonottaa ohjaimen lähtevien viestien laitteistojonoon.
CAN.send()-,CAN.cancel_send()- ja IRQ-liput-funktioiden käyttämät ”lähetyspuskurin indeksit” ovat tällä alueella.
Tilat¶
Nämä arvot edustavat ohjaimen toimintatiloja, jotka annetaan
CAN.init()-funktiolle. Kaikki ohjaimet eivät välttämättä tue kaikkia tiloja.Käynnissä olevan ohjaimen tilan muuttaminen vaatii
CAN.deinit()-funktion kutsumista ja sen jälkeenCAN.init()-funktion kutsumista uudelleen uudella tilalla.- MODE_NORMAL: int¶
Ohjain on aktiivinen vakiomuotoisena CAN-verkkosolmuna (kuittaa kelvolliset viestit ja voi lähettää virheitä nykyisestä tilastaan riippuen).
- MODE_SLEEP: int¶
CAN-ohjain on lepotilassa matalan virrankulutuksen tilassa. Ohjaimesta riippuen tämä voi tukea ohjaimen herättämistä ja siirtymistä tilaan
CAN.MODE_NORMAL, jos CAN-liikennettä vastaanotetaan.
- MODE_LOOPBACK: int¶
Testaustila. CAN-ohjain on edelleen kytkettynä ulkoiseen väylään, mutta se vastaanottaa myös omat lähettämänsä viestit ja jättää huomiotta kaikki ACK-virheet.
Tilat¶
Nämä arvot palauttaa
CAN.state()ja ne kuvastavat CAN-ohjaimen virhetilaa:- STATE_ACTIVE: int¶
Ohjain on aktiivinen ja sekä
TEC- ettäREC-virhelaskurit ovat alle varoituskynnyksen 96. KatsoCAN.get_counters().
- STATE_WARNING: int¶
Ohjain on aktiivinen mutta ainakin toinen
TEC- jaREC-virhelaskureista on välillä 96–127. KatsoCAN.get_counters().
- STATE_PASSIVE: int¶
Ohjain on ”Error Passive” -tilassa, mikä tarkoittaa, ettei se enää lähetä aktiivisia virheitä väylälle, mutta on muutoin toimintakykyinen. Tähän tilaan siirrytään, kun ainakin toinen
TEC- jaREC-virhelaskureista on 128 tai suurempi, muttaTECon alle 255. KatsoCAN.get_counters().
- STATE_BUS_OFF: int¶
Ohjain on Bus-Off-tilassa, mikä tarkoittaa, että
TEC-virhelaskuri on suurempi kuin 255. CAN-ohjain ei ole vuorovaikutuksessa väylän kanssa tässä tilassa, ja se on käynnistettävä uudelleenCAN.restart()-funktiolla jatkaakseen.
Viestiliput¶
Nämä arvot edustavat CAN-viestin metatietoja. Funktiot
CAN.send(),CAN.recv()jaCAN.set_filters()joko hyväksyvät tai palauttavat kokonaislukuarvon, joka koostuu nollasta tai useammasta näistä lipuista bittikohtaisesti OR-yhdistettynä.- FLAG_EXT_ID: int¶
Jos asetettu, ilmaisee, että viestin tunniste on laajennettu (Extended, 29-bittinen). Jos ei asetettu, ilmaisee, että viestin tunniste on vakiomuotoinen (Standard, 11-bittinen).
- FLAG_UNORDERED: int¶
Jos asetettu
CAN.send()-funktionflags-argumentissa, ilmaisee, että samalla CAN-ID:llä varustetut viestit voidaan lähettää väylälle missä tahansa järjestyksessä.Muutoin useiden samalla ID:llä varustettujen viestien jonottaminen voi johtaa
CAN.send()-funktion epäonnistumiseen, jos ohjainlaitteisto ei voi pakottaa järjestystä.Tätä lippua ei koskaan aseteta vastaanotettuihin viesteihin, ja
CAN.set_filters()jättää sen huomiotta.
Vastaanoton virheliput¶
Funktion
CAN.recv()tulos sisältää kokonaislukuarvon, joka koostuu nollasta tai useammasta näistä lipuista bittikohtaisesti OR-yhdistettynä. Jos asetettu, nämä liput ilmaisevat mahdollisia yleisiä ongelmia CAN-viestien vastaanotossa.IRQ-arvot¶
- IRQ_RX: int¶
Anna
irq()-metodintrigger-argumentille laukaistaksesi käsittelijän joka kerta, kun CAN-ohjain on vastaanottanut täydellisen viestin RX-FIFO:hon. Käsittelijän sisällä lue viestirecv()-metodilla.
- IRQ_TX: int¶
Anna
irq()-metodintrigger-argumentille laukaistaksesi käsittelijän joka kerta, kun CAN-ohjain saa lähetysyrityksen valmiiksi (onnistui tai epäonnistui). Käytä käsittelijän sisällä alla olevia lisäbittejä selvittääksesi, mikä postilaatikko valmistui ja epäonnistuiko se – katso IRQ-liput.
- IRQ_STATE: int¶
Anna
irq()-metodintrigger-argumentille laukaistaksesi käsittelijän joka kerta, kun ohjain siirtyySTATE_*-arvojen välillä (active / warning / passive / bus-off). Käytä käsittelijän sisällästate()-metodia lukeaksesi uuden tilan.
- IRQ_TX_FAILED: int¶
Tilalippu, joka voidaan asettaa kohtaan
irq().flags(), kunIRQ_TX-tapahtuma laukeaa. Ilmaisee, että lähetysyritys epäonnistui (tyypillisesti koskacancel_send()kutsuttiin, tai ohjain siirtyi virhetilaan).
- IRQ_TX_IDX_SHIFT: int¶
Lähetyspostilaatikon indeksikentän bittisijainti
irq().flags()-arvossaIRQ_TX-tapahtuman aikana. Postilaatikon indeksi puretaan kaavalla(flags >> IRQ_TX_IDX_SHIFT) & IRQ_TX_IDX_MASK.
- IRQ_TX_IDX_MASK: int¶
Lähetyspostilaatikon indeksikentän bittimaski
irq().flags()-arvossaIRQ_TX-tapahtuman aikana. Purettu indeksi vastaa vastaavansend()-kutsun palauttamaa kokonaislukua (int väliltä0jaTX_QUEUE_LEN).
IRQ-liput¶
Funktion CAN.irq() kutsuminen rekisteröi keskeytyskäsittelijän yhdellä tai useammalla laukaisimista CAN.IRQ_RX, CAN.IRQ_TX ja CAN.IRQ_STATE.
Funktio palauttaa IRQ-olion, ja flags()-funktion kutsuminen tälle oliolle palauttaa kokonaisluvun, joka ilmaisee, mikä laukaisutapahtuma(t) aiheutti keskeytyksen. CAN IRQ -käsittelijän tulisi kutsua flags()-funktiota toistuvasti, kunnes se palauttaa 0.
Kun flags()-funktio palauttaa CAN.IRQ_TX -bitti asetettuna, käsittelijä voi myös tarkistaa tuloksesta seuraavat lippubitit saadakseen lisätietoja TX-tapahtumasta:
CAN.IRQ_TX_FAILED-bitti on asetettu, jos lähetys epäonnistui. Yleensä näin tapahtuu vain, josCAN.cancel_send()kutsuttiin, vaikka se voi tapahtua myös, jos ohjain siirtyy virhetilaan.CAN.IRQ_TX_IDX_MASK << CAN.IRQ_TX_IDX_SHIFTon flags-arvon bittimaskattu alue, joka sisältää tapahtuman synnyttäneen lähetyspuskurin indeksin. Tämä on kokonaisluku väliltä0jaCAN.TX_QUEUE_LEN(poislukien), ja se vastaa aiemmanCAN.send()-kutsun tulosta.
IRQ_TX-esimerkki¶
from machine import CAN
def irq_send(can):
while flags := can.irq().flags():
if flags & can.IRQ_TX:
idx = (flags >> can.IRQ_TX_IDX_SHIFT) & can.IRQ_TX_IDX_MASK
success = not (flags & can.IRQ_TX_FAILED)
print("irq_send", idx, success)
can = CAN(1, 500_000)
can.irq(irq_send, trigger=can.IRQ_TX, hard=True)
Tärkeä
Jos CAN.IRQ_TX -laukaisin on asetettu, käsittelijän on kutsuttava flags() toistuvasti, kunnes se palauttaa 0, kuten tässä esimerkissä näytetään. Muutoin CAN-keskeytyksiä ei välttämättä oteta oikein uudelleen käyttöön.