kelas CAN -- Protokol Controller Area Network¶
CAN adalah protokol serial dua kabel yang digunakan untuk pengiriman pesan real-time yang andal antara satu atau lebih node yang terhubung ke bus bersama. CAN 2.0 telah distandarisasi dalam ISO-11898, dan sekarang juga dikenal sebagai CAN Classic.
Ada juga protokol yang lebih baru dan kompatibel mundur, bernama CAN FD (CAN dengan Flexible Data-Rate). Driver machine.CAN saat ini tidak mendukung fitur CAN FD; gunakan pyb.CAN pada STM32 jika Anda memerlukan CAN FD.
Dukungan CAN memerlukan sebuah kontroler (seringkali periferal mikrokontroler internal), dan transceiver eksternal untuk menggeser level sinyal ke bus CAN.
Tersedia pada OpenMV cam STM32 (M4 / M7 / H7 / H7 Plus / Pure Thermal / N6, plus varian bermerek Arduino yang menghubungkan transceiver). Belum didukung pada OpenMV Cam RT1062 (port mimxrt) atau OpenMV Cam AE3 (port alif).
Antarmuka machine.CAN adalah antarmuka pesan CAN tingkat rendah dasar yang mengabstraksi kontroler CAN sebagai antrean prioritas keluar untuk mengirim pesan, antrean masuk untuk menerima pesan, dan mekanisme untuk melaporkan kesalahan.
Catatan
Modul can dan aiocan micropython-lib yang direncanakan akan menjadi cara yang direkomendasikan untuk menggunakan CAN dengan MicroPython.
Konstruktor¶
- class machine.CAN(id: int, *args, **kwargs)¶
Buat objek kontroler CAN dengan id yang diberikan:
idmengidentifikasi objek kontroler CAN tertentu; ini bersifat spesifik untuk papan dan port.Semua argumen lain diteruskan ke
CAN.init(). Setidaknya satu argumen (bitrate) harus disediakan.
Versi kelas ini di masa mendatang mungkin juga menerima argumen kata kunci spesifik port di sini yang mengonfigurasi perangkat keras. Saat ini tidak ada argumen kata kunci seperti itu yang diimplementasikan.
Contoh¶
Buat dan inisialisasi kontroler CAN 1 dengan bitrate 500kbps:
from machine import CAN can = CAN(1, 500_000)
Metode¶
- init(bitrate: int, mode: int = CAN.MODE_NORMAL, sample_point: int = 75, sjw: int = 1, tseg1: int | None = None, tseg2: int | None = None) None¶
Inisialisasi bus CAN dengan parameter yang diberikan:
bitrate adalah laju bit bus yang diinginkan dalam bit per detik.
mode adalah salah satu nilai yang ditampilkan di bawah Mode, menunjukkan mode operasi yang diinginkan. Defaultnya adalah operasi "normal" pada bus.
Parameter berikutnya bersifat opsional dan berkaitan dengan timing bit CAN. Dalam kebanyakan kasus Anda dapat membiarkan parameter ini diatur ke nilai default:
sample_point adalah persentase bilangan bulat dari waktu bit data. Ini menentukan posisi sampel bit terhadap seluruh waktu bit nominal. Driver CAN akan menghitung parameter yang sesuai. Parameter ini diabaikan jika tseg1 dan tseg2 diatur.
sjw adalah lebar lompat resinkronisasi dalam satuan time quanta untuk bit nominal; nilainya bisa antara 1 dan 4 inklusif untuk CAN classic.
tseg1 mendefinisikan lokasi titik sampel dalam satuan time quanta untuk bit nominal; nilainya bisa antara 1 dan 16 inklusif untuk CAN classic. Ini adalah jumlah fase
Prop_SegdanPhase_Seg1sebagaimana didefinisikan dalam standar ISO-11898. Jika nilai ini diatur maka tseg2 juga harus diatur dan sample_point diabaikan.tseg2 mendefinisikan lokasi titik transmit dalam satuan time quanta untuk bit nominal; nilainya bisa antara 1 dan 8 inklusif untuk CAN classic. Ini sesuai dengan
Phase_Seg2dalam standar ISO-11898. Jika nilai ini diatur maka tseg1 juga harus diatur.
Jika argumen ini ditentukan maka kontroler CAN dikonfigurasi dengan benar untuk bitrate yang diinginkan dan jumlah total time quanta per bit yang ditentukan. Nilai tseg1 dan tseg2 mengesampingkan argumen sample_point jika semuanya disediakan.
Catatan
Perangkat keras kontroler individual mungkin memiliki pembatasan tambahan pada nilai yang valid untuk parameter ini, dan akan memunculkan
ValueErrorjika nilai yang diberikan tidak didukung.Catatan
Perangkat keras kontroler tertentu mungkin menerima parameter kata kunci opsional tambahan untuk fitur spesifik perangkat keras seperti oversampling.
- set_filters(filters: list | tuple | None) None¶
Atur filter penerimaan dalam kontroler CAN. filters dapat berupa:
Noneuntuk menerima semua pesan masuk, atau[]atau()untuk menonaktifkan semua penerimaan pesan, atauSebuah iterable dari satu atau lebih item yang mendefinisikan kriteria filter. Setiap item harus berupa tuple atau list dengan tiga elemen:
identifieradalah identifier CAN (int).bit_maskadalah bit mask untuk bit dalam field identifier CAN (int).flagsadalah bilangan bulat dengan nol atau lebih bit yang didefinisikan dalam Flag Pesan yang diatur. Ini menentukan properti yang perlu dicocokkan oleh pesan masuk. Tidak semua kontroler mendukung filtering pada semua flag,ValueErrorakan dimunculkan jika flag yang tidak didukung diminta.
Pesan masuk diterima jika bit yang dimasking dalam
bit_maskcocok antara identifier pesan dan nilaiidentifierfilter, dan flag yang diatur dalam filter cocok dengan pesan masuk.Jika bit
CAN.FLAG_EXT_IDdiatur dalam flags, filter hanya mencocokkan Extended CAN ID. Jika bitCAN.FLAG_EXT_IDtidak diatur, filter hanya mencocokkan Standard CAN ID.Semua filter di-OR bersama dalam kontroler. Melewatkan list atau tuple kosong untuk argumen filters berarti tidak ada pesan yang akan diterima.
Beberapa kontroler CAN mengharuskan setiap filter dikaitkan hanya dengan satu FIFO penerimaan. Dalam kasus ini, item filter dalam argumen dialokasikan secara round-robin ke FIFO yang tersedia. Driver ini tidak membedakan antara FIFO dalam IRQ penerimaan.
Catatan
Jika pemanggil melewatkan iterable dengan lebih banyak item dari
CAN.FILTERS_MAX,ValueErrorakan dimunculkan.Catatan
Jika
identifierataubit_maskberada di luar rentang untuk jenis ID yang ditentukan,ValueErrordengan alasan "invalid id" akan dimunculkan.Contoh-contoh¶
Terima semua pesan masuk:
can.set_filters(None)Terima pesan dengan nilai Standard ID 0x301 dan 0x700 saja:
can.set_filters(((0x301, 0x7FF, 0), (0x700, 0x7FF, 0)))
Terima pesan dengan nilai Standard ID dalam rentang 0x300-0x3FF, dan Extended ID nilai 0x50700 saja:
can.set_filters(((0x300, 0x700, 0), (0x50700, 0x1FFF_FFFF, CAN.FLAG_EXT_ID)))
- FILTERS_MAX: int¶
Nilai konstan yang membaca jumlah maksimum filter penerimaan yang didukung untuk kontroler perangkat keras ini.
Perhatikan bahwa beberapa kontroler mungkin memiliki batasan perangkat keras yang lebih kompleks pada jumlah filter yang digunakan (misalnya, menghitung filter Standard dan Extended ID secara independen.) Dalam kasus ini
CAN.set_filtersmungkin memunculkanValueErrorbahkan ketika batasFILTERS_MAXtidak terlampaui.
- send(id: int, data: bytes, flags: int = 0) int | None¶
Salin pesan CAN baru ke dalam antrean transmit perangkat keras kontroler untuk dikirim ke bus. Antrean transmit adalah antrean prioritas yang diurutkan berdasarkan prioritas identifier CAN (identifier numerik yang lebih rendah memiliki prioritas lebih tinggi).
id adalah nilai integer identifier CAN.
data adalah objek bytes (atau sejenisnya) yang berisi data pesan CAN, atau mendeskripsikan Remote Transmission Request (lihat di bawah).
flags adalah bilangan bulat dengan nol atau lebih bit yang didefinisikan dalam Flag Pesan yang diatur, menentukan properti pesan CAN keluar (Extended ID, Remote Transmission Request, dll.)
Jika pesan berhasil dimasukkan ke antrean untuk dikirim ke bus, fungsi mengembalikan bilangan bulat dalam rentang
0hinggaCAN.TX_QUEUE_LEN(eksklusif). Nilai ini adalah indeks buffer transmit tempat pesan dimasukkan ke antrean untuk dikirim, dan dapat digunakan oleh fungsiCAN.cancel_senddan dalam eventCAN.IRQ_TX.Jika antrean penuh maka pengiriman akan gagal dan
Nonedikembalikan.Pengiriman juga dapat gagal dan mengembalikan
Nonejika nilai id yang diberikan memiliki prioritas yang sama dengan pesan yang ada dalam antrean transmit dan perangkat keras kontroler CAN tidak dapat menjamin bahwa pesan dengan ID yang sama akan dikirim ke bus dalam urutan yang sama seperti saat ditambahkan ke antrean. Untuk memasukkan pesan ke antrean bagaimanapun, lewatkan flagCAN.FLAG_UNORDEREDdalam argumen flags. Flag ini menunjukkan bahwa tidak apa-apa untuk mengirim pesan dengan CAN ID yang sama ke bus dalam urutan apa pun.Jika kontroler berada dalam status kesalahan "Bus Off" atau dinonaktifkan maka memanggil fungsi ini akan memunculkan
OSError.Catatan
Implementasi tingkat rendah yang disengaja ini dirancang agar pemanggil dapat membangun antrean perangkat lunak dari pesan keluar.
Penting
"Antrean transmit" CAN bukan antrean FIFO, ia diurutkan berdasarkan prioritas, dan meskipun dapat menampung hingga
CAN.TX_QUEUE_LENitem, mungkin ada batasan perangkat keras lain pada pesan yang dapat dimasukkan ke antrean pada saat yang sama.Remote Transmission Request¶
Jika bit
CAN.FLAG_RTRdiatur dalam argumen flags maka kontroler akan mengirim Remote Transmission Request alih-alih pesan. Dalam kasus ini isi argumen data diabaikan. Kontroler akan mengirim permintaan di mana field panjangDLCsama dengan panjang argumen data.Contoh-contoh¶
Mencoba mengirim pesan dengan payload tiga byte
0a0b0cdan Standard ID 0x200:can.send(0x200, b"\x0a\x0b\x0c", 0)Mencoba mengirim pesan dengan payload kosong dan Extended ID 0x180008. Menunjukkan bahwa kontroler dapat mengirim pesan dengan ID ini dalam urutan apa pun, jika pesan lain sudah dimasukkan ke antrean untuk dikirim dengan ID yang sama:
can.send(0x180008, b"", can.FLAG_EXT_ID | can.FLAG_UNORDERED)Mencoba mengirim Remote Transmission Request dengan panjang 8 byte dan Standard ID 0x555:
can.send(0x555, b" " * 8, can.FLAG_RTR)
- recv(arg: list | None = None) list | None¶
Kembalikan pesan CAN yang telah diterima oleh kontroler, sesuai dengan filter yang diatur oleh
CAN.set_filters().Fungsi ini mengambil satu argumen opsional, jika disediakan maka harus berupa list setidaknya 4 elemen di mana elemen kedua adalah objek
memoryviewyang merujuk kebytearrayatau objek serupa yang memiliki kapasitas cukup untuk menampung pesan CAN yang diterima (8 byte untuk CAN Classic, 64 byte untuk CAN FD). List yang disediakan akan dikembalikan sebagai hasil yang berhasil, dan menghindari alokasi memori di dalam fungsi.Jika tidak ada pesan yang diterima oleh kontroler CAN, fungsi ini mengembalikan
None.Catatan
CAN.set_filtersharus dipanggil sebelum pesan apa pun dapat diterima oleh kontroler. Untuk menerima semua pesan, panggilset_filters(None).Jika sebuah pesan telah diterima oleh kontroler CAN, fungsi ini mengembalikan list dengan 4 elemen:
Indeks 0 adalah CAN ID dari pesan yang diterima, sebagai bilangan bulat.
Indeks 1 adalah memoryview yang menyediakan akses ke data pesan yang diterima.
Jika arg tidak disediakan maka ini adalah
memoryviewyang menyimpan byte yang diterima.memoryviewini didukung olehbytearrayyang baru dialokasikan dan cukup besar untuk menampung pesan CAN yang diterima. Ini memungkinkan hasil dapat digunakan kembali dengan aman sebagai arg di masa mendatang, untuk menghemat alokasi memori.Jika arg disediakan maka
memoryviewyang disediakan akan diubah ukurannya untuk menampung tepat byte yang diterima. Pemanggil bertanggung jawab untuk memastikan objek pendukung untukmemoryviewdapat menampung pesan CAN dengan panjang berapa pun.
Indeks 2 adalah bilangan bulat dengan nol atau lebih bit yang didefinisikan dalam Flag Pesan yang diatur. Ini menunjukkan metadata tentang pesan yang diterima.
Indeks 3 adalah bilangan bulat dengan nol atau lebih bit yang didefinisikan dalam Flag Kesalahan Penerimaan yang diatur. Nilai non-nol apa pun menunjukkan potensi masalah saat menerima pesan CAN. Flag-flag ini direset di dalam kontroler setiap kali fungsi ini mengembalikan nilai.
Remote Transmission Request¶
Jika Remote Transmission Request diterima maka bit
CAN.FLAG_RTRakan diatur pada Indeks 2 dan memoryview pada Indeks 1 akan berisi semua nol, dengan panjang yang sama dengan fieldDLCdari permintaan yang diterima.Contoh¶
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¶
Mengatur fungsi handler interupsi yang akan dipanggil ketika satu atau lebih event yang ditandai dalam trigger telah terjadi.
handler adalah fungsi yang akan dipanggil ketika event interupsi terpicu. Handler harus mengambil tepat satu argumen yaitu instance
CAN.trigger mengonfigurasi event yang dapat menghasilkan interupsi. Nilai yang mungkin adalah mask dari satu atau lebih dari berikut ini:
Event
CAN.IRQ_RXterjadi setelah kontroler CAN telah menerima setidaknya satu pesan ke dalam RX FIFO-nya (artinyaCAN.recv()akan berhasil dikembalikan).Event
CAN.IRQ_TXterjadi setelah kontroler CAN berhasil mengirim pesan ke bus CAN atau gagal mengirim pesan. Trigger ini memiliki persyaratan tambahan untuk handler, lihat Flag IRQ untuk detailnya.Event
CAN.IRQ_STATEterjadi ketika kontroler CAN telah beralih ke status kesalahan yang lebih parah. PanggilCAN.state()untuk mendapatkan status yang diperbarui.
hard jika True, interupsi keras digunakan. Ini mengurangi penundaan antara event kontroler CAN dan handler yang dipanggil. Handler interupsi keras mungkin tidak mengalokasikan memori; lihat Menulis interrupt handler.
Mengembalikan objek irq. Jika dipanggil tanpa argumen maka objek irq yang sebelumnya dikonfigurasi dikembalikan.
Lihat Flag IRQ untuk contoh.
- cancel_send(index: int) bool¶
Minta kontroler CAN untuk membatalkan pengiriman pesan ke bus.
Argumen index mengidentifikasi satu buffer transmit. Ini harus berupa bilangan bulat dalam rentang
0hinggaCAN.TX_QUEUE_LEN(eksklusif). Umumnya ini akan menjadi nilai yang sebelumnya dikembalikan olehCAN.send().Hasilnya adalah
Truejika pesan sedang menunggu transmisi dalam buffer ini dan transmisi dibatalkan.Hasilnya adalah
Falsesebaliknya (baik tidak ada pesan yang menunggu transmisi dalam buffer ini, atau transmisi sudah berhasil).Event IRQ
CAN.IRQ_TXharus digunakan untuk menentukan apakah pesan pasti terkirim atau tidak, tetapi perhatikan ada potensi kondisi balapan jika transmisi dibatalkan dan kemudian buffer yang sama digunakan untuk mengirim pesan lain (terutama jika IRQ kontroler CAN tidak "keras").
- state() int¶
Mengembalikan nilai bilangan bulat yang menunjukkan status kontroler saat ini. Nilainya akan menjadi salah satu nilai yang didefinisikan dalam Status.
Status kesalahan dengan tingkat keparahan lebih rendah mungkin secara otomatis terhapus jika bus pulih, tetapi status
CAN.STATE_BUS_OFFhanya dapat dipulihkan dengan memanggilCAN.restart().
- get_counters(list: list | None = None, /) list¶
Mengembalikan nilai penghitung kesalahan kontroler. Hasilnya adalah list delapan nilai. Jika parameter list opsional ditentukan maka objek list yang disediakan diperbarui dan dikembalikan sebagai hasil, untuk menghindari alokasi.
Item list adalah:
Nilai TEC (Transmit Error Counter)
Nilai REC (Receive Error Counter)
Jumlah kali kontroler memasuki status Warning dari status Active.
Jumlah kali kontroler memasuki status Error Passive dari status Warning.
Jumlah kali kontroler memasuki status Bus Off dari status Error Passive.
Jumlah total pesan TX yang menunggu dalam antrean perangkat keras.
Jumlah total pesan RX yang menunggu dalam antrean perangkat keras.
Jumlah kali terjadi RX overrun.
Catatan
Tergantung pada kontroler, nilai-nilai ini mungkin meluap kembali ke 0 setelah nilai tertentu.
Catatan
Jika kontroler tidak mendukung penghitung tertentu, ia akan mengembalikan
Noneuntuk elemen list tersebut.
- get_timings(list: list | None = None, /) list¶
Mengembalikan list elemen yang menunjukkan timing yang saat ini dikonfigurasi dalam kontroler CAN. Ini dapat digunakan untuk memverifikasi timing untuk tujuan debugging. Hasilnya adalah list enam nilai. Jika parameter list opsional ditentukan maka objek list yang disediakan diperbarui dan dikembalikan sebagai hasil, untuk menghindari alokasi.
Item list adalah:
Bitrate tepat yang digunakan oleh kontroler. Mungkin berbeda dari argumen bitrate yang diteruskan ke
CAN.init()karena kuantisasi untuk memenuhi batasan perangkat keras.Lebar lompat resinkronisasi (SJW) dalam satuan time quanta untuk bit nominal. Memiliki arti yang sama seperti parameter sjw dari
CAN.init().Lokasi titik sampel dalam satuan time quanta untuk bit nominal. Memiliki arti yang sama seperti parameter tseg1 dari
CAN.init().Lokasi titik transmit dalam satuan time quanta untuk bit nominal. Memiliki arti yang sama seperti parameter tseg2 dari
CAN.init().Informasi timing CAN FD.
Noneuntuk kontroler yang tidak mendukung CAN FD, atau jika CAN FD tidak diinisialisasi. Jika tidak, list bersarang empat elemen yang sesuai dengan item di atas tetapi berlaku untuk fitur CAN FD BRS.Informasi timing spesifik kontroler opsional. Tergantung pada kontroler ini akan berupa
Nonejika kontroler tidak melaporkan apa pun, atau akan berupa list panjang konstan yang elemennya spesifik untuk kontroler perangkat keras tertentu.
Catatan
Jika
CAN.init()belum dipanggil maka fungsi ini tetap mengembalikan hasil, tetapi hasilnya bergantung pada internal kontroler dan mungkin tidak akurat.
- restart() None¶
Menyebabkan kontroler keluar dari
STATE_BUS_OFFtanpa menghapus status internal lainnya. Juga menghapus beberapa penghitung kesalahan (selalu jumlah kali setiap status kesalahan telah dimasuki, kemungkinan TEC dan REC tergantung pada kontroler.)Memanggil fungsi ini juga membatalkan pesan apa pun yang menunggu untuk dikirim. Tidak ada interupsi
IRQ_TXyang dikirimkan untuk pesan-pesan ini.Perhatikan bahwa fungsi ini mungkin atau mungkin tidak menyebabkan kontroler keluar dari status "Error Passive", tergantung apakah perangkat keras kontroler menol-kan TEC dan REC atau tidak.
- deinit() None¶
Men-deinisialisasi instance CAN yang sebelumnya aktif. Semua pesan yang menunggu (transmit dan terima) dibuang dan kontroler berhenti berinteraksi pada bus. Untuk menggunakan instance ini lagi, panggil
CAN.init().Tidak ada interupsi
IRQ_TXatauIRQ_RXyang dipanggil sebagai respons terhadap pemanggilan fungsi ini.Lihat juga
CAN.restart().
Konstanta¶
- TX_QUEUE_LEN: int¶
Jumlah maksimum pesan CAN yang dapat dimasukkan ke dalam antrean pesan perangkat keras keluar dari kontroler. "Indeks buffer transmit" yang digunakan oleh
CAN.send(),CAN.cancel_send()dan Flag IRQ akan berada dalam rentang ini.
Mode¶
Nilai-nilai ini merepresentasikan mode operasi kontroler, sebagaimana diteruskan ke
CAN.init(). Tidak semua kontroler mungkin mendukung semua mode.Mengubah mode kontroler yang sedang berjalan memerlukan pemanggilan
CAN.deinit()dan kemudian pemanggilanCAN.init()lagi dengan mode baru.- MODE_NORMAL: int¶
Kontroler aktif sebagai node jaringan CAN standar (akan mengakui pesan yang valid dan mungkin mentransmisikan kesalahan tergantung pada State saat ini).
- MODE_SLEEP: int¶
Kontroler CAN tertidur dalam mode daya rendah. Tergantung pada kontroler, ini mungkin mendukung membangunkan kontroler dan beralih ke
CAN.MODE_NORMALjika lalu lintas CAN diterima.
- MODE_LOOPBACK: int¶
Mode pengujian. Kontroler CAN masih terhubung ke bus eksternal, tetapi juga akan menerima pesan yang dikirimnya sendiri dan mengabaikan kesalahan ACK apa pun.
Status¶
Nilai-nilai ini dikembalikan oleh
CAN.state()dan mencerminkan status kesalahan kontroler CAN:- STATE_ACTIVE: int¶
Kontroler aktif dan penghitung kesalahan
TECdanRECkeduanya di bawah ambang batas peringatan 96. LihatCAN.get_counters().
- STATE_WARNING: int¶
Kontroler aktif tetapi setidaknya salah satu penghitung kesalahan
TECdanRECberada antara 96 dan 127. LihatCAN.get_counters().
- STATE_PASSIVE: int¶
Kontroler berada dalam status "Error Passive" artinya ia tidak lagi mentransmisikan kesalahan aktif ke bus, tetapi fungsional sebaliknya. Status ini dimasuki ketika setidaknya salah satu penghitung kesalahan
TECdanRECadalah 128 atau lebih besar, tetapiTECkurang dari 255. LihatCAN.get_counters().
- STATE_BUS_OFF: int¶
Kontroler berada dalam status Bus-Off, artinya penghitung kesalahan
TEClebih besar dari 255. Kontroler CAN tidak akan berinteraksi dengan bus dalam status ini, dan perlu dimulai ulang melaluiCAN.restart()untuk melanjutkan.
Flag Pesan¶
Nilai-nilai ini merepresentasikan metadata tentang pesan CAN. Fungsi
CAN.send(),CAN.recv(), danCAN.set_filters()baik menerima maupun mengembalikan nilai bilangan bulat yang terdiri dari nol atau lebih flag ini yang di-OR-kan secara bitwise.- FLAG_EXT_ID: int¶
Jika diatur, menunjukkan identifier Pesan adalah Extended (29-bit). Jika tidak diatur, menunjukkan identifier pesan adalah Standard (11-bit).
- FLAG_UNORDERED: int¶
Jika diatur dalam argumen
flagsdariCAN.send(), menunjukkan bahwa tidak apa-apa jika pesan dengan CAN ID yang sama dikirim dalam urutan apa pun ke bus.Jika tidak, mencoba memasukkan beberapa pesan dengan ID yang sama ke antrean mungkin mengakibatkan
CAN.send()gagal jika perangkat keras kontroler tidak dapat menerapkan pengurutan.Flag ini tidak pernah diatur pada pesan yang diterima, dan diabaikan oleh
CAN.set_filters().
Flag Kesalahan Penerimaan¶
Hasil dari
CAN.recv()mencakup nilai bilangan bulat yang terdiri dari nol atau lebih flag ini yang di-OR-kan secara bitwise. Jika diatur, flag-flag ini menunjukkan potensi masalah umum dalam menerima pesan CAN.Nilai IRQ¶
- IRQ_RX: int¶
Lewatkan ke argumen
triggerdariirq()untuk menyalakan handler setiap kali kontroler CAN telah menerima pesan lengkap ke dalam RX FIFO. Di dalam handler, baca pesan denganrecv().
- IRQ_TX: int¶
Lewatkan ke argumen
triggerdariirq()untuk menyalakan handler setiap kali kontroler CAN menyelesaikan percobaan transmit (berhasil atau gagal). Di dalam handler, gunakan bit tambahan di bawah ini untuk memulihkan mailbox mana yang selesai dan apakah gagal -- lihat Flag IRQ.
- IRQ_STATE: int¶
Lewatkan ke argumen
triggerdariirq()untuk menyalakan handler setiap kali kontroler beralih antara nilaiSTATE_*(active / warning / passive / bus-off). Gunakanstate()di dalam handler untuk membaca status baru.
- IRQ_TX_FAILED: int¶
Flag status yang mungkin diatur dalam
irq().flags()ketika eventIRQ_TXterpicu. Menunjukkan percobaan transmit gagal (biasanya karenacancel_send()dipanggil, atau kontroler memasuki status kesalahan).
- IRQ_TX_IDX_SHIFT: int¶
Posisi bit dari field transmit-mailbox-index dalam nilai
irq().flags()selama eventIRQ_TX. Indeks mailbox diekstrak sebagai(flags >> IRQ_TX_IDX_SHIFT) & IRQ_TX_IDX_MASK.
- IRQ_TX_IDX_MASK: int¶
Bit mask dari field transmit-mailbox-index dalam nilai
irq().flags()selama eventIRQ_TX. Indeks yang diekstrak cocok dengan bilangan bulat yang dikembalikan oleh panggilansend()yang sesuai (int dalam rentang0hinggaTX_QUEUE_LEN).
Flag IRQ¶
Memanggil CAN.irq() mendaftarkan handler interupsi dengan satu atau lebih trigger CAN.IRQ_RX, CAN.IRQ_TX dan CAN.IRQ_STATE.
Fungsi ini mengembalikan objek IRQ, dan memanggil fungsi flags() pada objek ini mengembalikan bilangan bulat yang menunjukkan event trigger mana yang memicu interupsi. Handler IRQ CAN harus memanggil fungsi flags() berulang kali hingga mengembalikan 0.
Ketika fungsi flags() mengembalikan dengan bit CAN.IRQ_TX yang diatur, handler juga dapat memeriksa bit flag berikut dalam hasil untuk informasi tambahan tentang event TX:
Bit
CAN.IRQ_TX_FAILEDdiatur jika transmit gagal. Biasanya ini hanya akan terjadi jikaCAN.cancel_send()dipanggil, meskipun mungkin juga terjadi jika kontroler memasuki status kesalahan.CAN.IRQ_TX_IDX_MASK << CAN.IRQ_TX_IDX_SHIFTadalah region yang dimasking secara bitwise dari nilai flags yang menyimpan indeks buffer transmit yang menghasilkan event. Ini akan berupa bilangan bulat dalam rentang0hinggaCAN.TX_QUEUE_LEN(eksklusif), dan akan cocok dengan hasil panggilan sebelumnya keCAN.send().
Contoh IRQ_TX¶
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)
Penting
Jika trigger CAN.IRQ_TX diatur maka handler harus memanggil flags() berulang kali hingga mengembalikan 0, seperti yang ditunjukkan dalam contoh ini. Jika tidak, interupsi CAN mungkin tidak diaktifkan kembali dengan benar.