3.25. Dasar-dasar bus CAN¶
CAN (Controller Area Network) awalnya dirancang oleh Bosch pada tahun 1980-an untuk menghubungkan semua unit kontrol elektronik dalam sebuah mobil ke satu bus bersama yang pendek. CAN masih mendominasi jaringan kabel mobil, namun ketangguhan, perilaku real-time, dan desain multi-master yang sama menjadikannya bus lapangan baku dalam otomasi, robotika, peralatan pertanian, dan industri dari berbagai jenis.
CAN tidak memiliki satu "pengendali" dan sekumpulan "periferal" seperti halnya SPI dan I2C. Setiap simpul pada bus adalah sesama rekan, dan simpul mana pun dapat mentransmisikan kapan pun bus sedang tidak aktif. Yang memungkinkan skala ini adalah desain siaran-dengan-arbitrase pada bus.
3.25.1. Siaran dengan arbitrase prioritas¶
Setiap pesan pada bus CAN membawa sebuah pengenal -- 11 bit untuk bingkai standar klasik, 29 bit untuk varian yang diperluas. Pengenal bukanlah sebuah alamat; pengenal melabeli apa yang dibahas pesan tersebut (RPM mesin, posisi pedal rem, tegangan baterai, dll.). Ketika sebuah simpul ingin mengirimkan sebuah nilai, ia menyiarkannya dengan tag pengenal yang sesuai, dan setiap simpul pada bus melihat siaran tersebut. Setiap penerima memfilter bus secara perangkat keras untuk hanya mengambil ID yang dipedulikannya.
Jika dua simpul mencoba mentransmisikan pada waktu yang sama, desain elektrikal bus membiarkan pesan dengan pengenal numerik yang lebih rendah menang tanpa kehilangan bit mana pun.
Kuncinya adalah dua kondisi elektrikal bus: dominan (secara logis 0) dan resesif (secara logis 1). Kabel CAN dijaga tinggi (resesif) oleh resistor terminasi ketika tidak ada simpul yang berbicara; simpul mana pun dapat menarik kabel ke bawah (dominan) dengan mengalirkan arus melalui transceiver-nya. Hasilnya adalah AND-kabel: jika satu simpul pun mendorong bus ke dominan, jalur terbaca dominan, dan hanya terbaca resesif ketika setiap simpul telah melepasnya. Dominan selalu menang. (Beberapa referensi menyebut susunan yang sama sebagai OR-kabel, memperlakukan "dominan" sebagai sinyal yang ditegaskan daripada AND dari bit resesif -- perilaku fisiknya identik dalam kedua kasus.)
AND-kabel dalam bentuk konsep. CAN nyata menjalankan logika yang sama melalui pasangan diferensial (CAN_H / CAN_L) dengan transceiver dan resistor terminasi yang terbagi di kedua kabel, namun aturan pada bus tetap sama: simpul mana pun dapat menarik ke dominan, hanya ketika setiap simpul telah melepas barulah terbaca resesif.¶
Arbitrase menggunakan asimetri ini secara langsung. Setiap simpul yang mentransmisikan mengirimkan ID-nya satu bit per waktu, MSB terlebih dahulu, dan memantau bus saat mentransmisikan. Simpul yang menempatkan bit resesif pada kabel namun membaca kembali dominan mengetahui bahwa simpul lain dengan ID yang lebih rendah sedang mentransmisikan pada saat yang sama dan telah memenangkan posisi bit tersebut. Simpul tersebut segera berhenti mendorong bus dan mendengarkan. Sementara itu, simpul yang menang melihat bit-bitnya keluar tanpa perubahan -- dari sudut pandangnya tidak ada yang tidak biasa terjadi. ID bernomor lebih rendah menang karena bit dominannya mengesampingkan bit resesif yang seharusnya dikirim oleh ID bernomor lebih tinggi pada posisi yang sama.
Pihak yang kalah kemudian menunggu bus menjadi idle dan mencoba ulang secara otomatis. Tidak ada tabrakan, tidak ada pesan yang hilang -- hanya pengurutan prioritas yang deterministik.
Inilah gaya publish/subscribe yang membuat CAN bekerja pada skala besar: siapa pun dapat berbicara, siapa pun dapat mendengarkan, dan ID membuat pengiriman menjadi implisit.
3.25.2. Bus fisik¶
Pengendali CAN MCU tidak menggerakkan bus secara langsung. MCU hanya mengekspos dua pin CMOS 3,3 V -- TX (bit yang ingin dikirimnya) dan RX (bit yang dilihatnya pada bus) -- dan pin-pin tersebut terhubung ke chip terpisah yang disebut transceiver CAN atau PHY. Transceiver berada di antara pengendali dan kabel CAN yang sebenarnya; dialah yang tahu cara berkomunikasi dengan bus.
Bus itu sendiri adalah pasangan diferensial 5 V:
CAN_H -- kabel "tinggi" dari pasangan.
CAN_L -- kabel "rendah".
Dalam kondisi resesif kedua kabel berada pada sekitar 2,5 V (titik tengah dari catu daya 5 V bus). Dalam kondisi dominan, transceiver menarik CAN_H ke atas hingga sekitar 3,5 V dan CAN_L ke bawah hingga sekitar 1,5 V, menghasilkan diferensial sekitar 2 V di seluruh pasangan. Penerima mengambil sampel selisih antara kedua kabel, yang membuat sinyal kebal terhadap noise mode-umum yang dipungut melalui kabel panjang.
Tugas dua arah transceiver:
Pada sisi TX, ia membaca pin TX single-ended 3,3 V pengendali dan baik mendorong CAN_H dan CAN_L terpisah untuk dominan maupun melepas keduanya untuk resesif.
Pada sisi RX, ia membaca pasangan diferensial CAN_H / CAN_L dan melaporkan level 3,3 V single-ended pada pin RX-nya kembali ke pengendali.
Dua resistor terminasi 120-ohm, satu di setiap ujung fisik kabel, menahan bus pada titik tengah resesif ketika tidak ada simpul yang menggerakkan dan meredam pantulan yang otherwise akan merusak sinyal diferensial pada kabel panjang.
3.25.3. Bingkai data¶
Bingkai data CAN standar terlihat seperti ini pada kabel:
Bingkai data CAN standar: bidang SOF, ID, RTR, kontrol, data, CRC, ACK, dan EOF.¶
Setiap bidang memiliki tugas tertentu:
SOF (start of frame). Satu bit dominan yang menandakan bingkai baru sedang dimulai dan menyinkronkan jam bit setiap simpul.
ID (pengenal). Pengenal 11-bit yang digunakan bus untuk arbitrase. Nomor lebih rendah = prioritas lebih tinggi.
RTR (remote transmission request). Diset pada sebuah permintaan data daripada sebuah pengiriman data; penerima dengan ID yang cocok merespons dengan mengirimkan data sendiri.
Kontrol. Sebuah bidang 6-bit yang mengkodekan panjang data (
DLC) dan beberapa bit pemeliharaan.Data. 0 hingga 8 byte payload (CAN Classic; CAN FD memperluas ini hingga 64 byte).
CRC. Total 16 bit: sebuah CRC 15-bit atas bidang-bidang sebelumnya ditambah 1-bit pembatas CRC.
ACK. Total 2 bit. Pada bit pertama -- slot ACK -- transmitter melepas jalur dan simpul mana pun yang menerima bingkai dengan benar menariknya ke bawah; bit kedua adalah pembatas resesif. Tidak adanya ACK memberi tahu transmitter bahwa tidak ada simpul yang mendengar bingkai tersebut dan harus mencoba lagi.
EOF (end of frame). Tujuh bit resesif menutup bingkai.
Semua itu dihasilkan dan didekode oleh pengendali CAN dalam perangkat keras; perangkat lunak hanya melihat ID, data, dan beberapa flag.
3.25.4. Posisi CAN¶
Pilihan desain CAN menetapkan ceruknya:
Tangguh. Pensinyalan diferensial pada pasangan twisted, deteksi kesalahan bawaan, arbitrase prioritas deterministik, dan percobaan ulang otomatis membuat CAN bertahan dalam lingkungan yang elektrikalnya bising di mana UART dan SPI akan merusak data.
Multi-master. Simpul mana pun dapat berbicara kapan saja. Tidak diperlukan pengendali pusat dan tidak ada simpul yang menjadi titik kegagalan tunggal.
Lebar pita terbatas. CAN Classic mencapai puncak sekitar
1 Mbit/s; CAN FD memperluas ini. CAN adalah jawaban yang tepat ketika tautan berada di antara papan atau modul, seringkali melalui meter kabel, dengan keandalan sebagai prioritas.Protokol lapisan lebih tinggi. Bus CAN dasar tidak menyatakan apa arti sebuah ID atau cara memecah pesan panjang menjadi fragmen. Protokol lapisan aplikasi -- CANopen, J1939, ISO-TP/UDS, NMEA 2000 -- melapisi aturan-aturan tersebut di atasnya. Item terpisah yang perlu diketahui adalah file DBC: format teks khusus vendor yang mencatat ID mana yang membawa sinyal tingkat bit mana pada kendaraan atau sistem tertentu. File DBC adalah format metadata yang mendeskripsikan tata letak pesan satu bus, bukan protokol tersendiri.
Driver di Bus CAN dalam kode menangani bingkai CAN tingkat kabel; pemetaan ID ke makna adalah tugas aplikasi.