Menerapkan lapisan protokol CAN dalam perangkat lunak


12

Latar Belakang

Saya sedang mengembangkan sebuah proyek yang membutuhkan spesifikasi mikrokontroler sederhana:

  • 8 12-bit, 10kHz ADC
  • RAM 1kB
  • 48-QFN atau lebih kecil
  • 20kbps protokol komunikasi tahan-bising daisy-chainable dan mengoreksi kesalahan

Persyaratan pemrosesan sinyal cukup rendah, dan sebagian besar dapat diekspor ke prosesor utama dalam sistem. Tiga spesifikasi pertama mudah dipenuhi, dan dapat dilakukan dengan jumlah kurang dari $ 2. Namun, komunikasi akan terjadi di lingkungan yang sangat bising secara elektrik, sehingga jaringan yang rentan kebisingan seperti LIN dan I2C keluar. Argumen tambahan terhadap LIN adalah bahwa saya ingin menjalankan semuanya pada 5V atau 3.3V, dan transceiver LIN memerlukan 12V, dan karenanya akan membutuhkan regulator tambahan atau kawat per papan sensor. Awalnya saya memilih BISA untuk tugas ini. Namun, pengendali CAN dapat menambahkan biaya yang cukup besar, dan saya ingin tahu apakah ini dapat dilakukan dalam perangkat lunak.

BISA Lapisan Fisik

Spesifikasi CAN mendefinisikan Data Link dan lapisan Fisik model referensi jaringan OSI. Banyak IC 8-pin yang murah, seperti NXP TJA1040 / 50 , Maxim MAX3058 / 59 , Microchip MCP2551 , dan TI SN65HVD1050 ada untuk mengimplementasikan lapisan fisik. Menerapkan lapisan fisik dengan konverter D / A atau op-amp akan sulit, jika bukan tidak mungkin, sehingga IC ini bernilai $ 1 atau lebih sehingga harganya.

BISA Tautan Data / Lapisan Protokol

Untuk lapisan Data Link, beberapa mikrokontroler menambahkan modul protokol CAN ke lapisan komunikasi UART, I2C, dan SPI dasar. Namun, ini jauh lebih mahal daripada chip dasar.

Investigasi biaya modul protokol CAN

Untuk memperkuat klaim ini, berikut adalah beberapa micros populer dalam versi CAN dan non-CAN, dari:

  • ATmega16 - ATMEGA16M1 (dengan CAN): $ 3,87, ATMEGA168A (no CAN): $ 3,23
  • dsPIC - DSPIC33FJ64MC802 (dengan CAN): $ 6,14, DSPIC33FJ64GP202 (tanpa CAN): $ 5,48
  • PIC18 - PIC18F2480 (dengan CAN): $ 6,80, PIC18F24J10 (tanpa CAN): $ 2,10
  • Cortex-M3 - STM32F103C4T6A (dengan CAN): $ 6,50, STM32F100C4T6B (tanpa CAN): $ 2,73

Agar adil, saya hanya membandingkan mikrokontroler dengan ukuran memori yang setara, namun, banyak versi non-CAN tersedia dengan ukuran memori lebih kecil dengan harga lebih murah. Pengontrol CAN eksternal, seperti Microchip MCP2515 , hampir $ 2, jadi jelas lebih hemat biaya untuk mengintegrasikan CAN ke dalam mikrokontroler jika Anda memiliki pilihan.

Menariknya, bagian ATmega sejauh ini merupakan bagian termurah yang dilengkapi BISA dalam inventaris Digikey.

Fungsi lapisan protokol CAN

Modul CAN yang ditemukan dalam mikrokontroler dsPIC melakukan hal berikut:

Modul bus CAN terdiri dari mesin protokol dan penyangga / kontrol pesan. Mesin protokol CAN menangani semua fungsi untuk menerima dan mengirim pesan pada bus CAN. Pesan dikirimkan dengan terlebih dahulu memuat register data yang sesuai. Status dan kesalahan dapat diperiksa dengan membaca register yang sesuai. Setiap pesan yang terdeteksi pada bus CAN diperiksa untuk kesalahan dan kemudian dicocokkan dengan filter untuk melihat apakah itu harus diterima dan disimpan di salah satu register yang diterima.

Ini tampaknya cukup bisa dilakukan dalam perangkat lunak.

Pertanyaan

Dapatkah lapisan protokol perangkat lunak digunakan mengimplementasikan spesifikasi CAN hanya dengan mikrokontroler yang dilengkapi UART dan transceiver CAN? Jika demikian, apakah ada implementasi open-source?

Atau, bisakah transceiver BISA digunakan dengan UART untuk mengimplementasikan protokol khusus? Saya setuju dengan topologi master tunggal; Saya memahami bahwa arbitrase mungkin sulit dilakukan dengan benar pada protokol khusus.


CAN juga 12v, karena dikembangkan untuk penggunaan otomotif.
kenny

@ Kenny - Level tegangan yang digunakan pada transceiver di atas adalah 5V.
Kevin Vermeer

Jika Anda akan mempertimbangkan seri STM32F, bolehkah saya menyarankan bagian NXP ini juga? Ini adalah inti Cortex-M0. search.digikey.com/scripts/DkSearch/…
Jon L

@ Jon - Itu belum tentu dipertimbangkan, dan M0 akan ideal untuk kasus penggunaan ini - Namun, pertimbangkan bagian-bagian yang Nuvoton M052LAN juga Cortex-M0, dan kira-kira setengah harga dalam jumlah ($ 1.21 vs $ 2.35), tetapi tidak memiliki modul CAN. Perbedaan harga semacam itu adalah motivasi saya.
Kevin Vermeer

Anda mungkin ingin mempertimbangkan peringkat operasional juga. Sebagian besar bagian dengan dukungan CAN akan menjadi industri atau otomotif vs komersial untuk varian non CAN.
Tandai

Jawaban:


11

Saya pikir menerapkan protokol CAN di firmware saja akan sulit dan akan memakan waktu cukup lama untuk memperbaikinya. Itu bukan ide yang bagus.

Namun, harga Anda tinggi. Saya baru saja memeriksa, dan 33FJ64GP802 dsPIC dalam paket QFN dijual seharga 3,68 USD pada microchipdirect seharga 1000 buah. Harga akan lebih rendah untuk volume produksi nyata.

Perangkat keras BISA melakukan beberapa hal nyata bagi Anda, dan kenaikan harga untuk itu tidak mendekati apa yang Anda klaim.

Ditambahkan:

Karena Anda tampaknya bertekad untuk mencoba rute firmware, berikut adalah beberapa masalah nyata yang muncul di benak Anda. Kemungkinan besar akan ada masalah lain yang belum terjadi pada saya.

Anda ingin melakukan CAN dengan kecepatan 20 kbit / s. Itu adalah laju yang sangat lambat untuk CAN, yang naik hingga 1Mbit / s untuk setidaknya 10 detik. Untuk memberi Anda satu titik data, standar pensinyalan kapal NMEA 2000 adalah layerd pada CAN dengan kecepatan 200 kbits / dtk, dan itu artinya pergi dari satu ujung kapal besar ke yang lain.

Anda mungkin berpikir bahwa semua yang Anda butuhkan adalah satu interupsi per bit dan Anda dapat melakukan semua yang Anda butuhkan dalam interupsi itu. Itu tidak akan berhasil karena ada beberapa hal yang terjadi dalam setiap waktu BISA. Dua hal khususnya perlu dilakukan pada level sub-bit. Yang pertama adalah mendeteksi tabrakan, dan yang kedua adalah menyesuaikan laju bit dengan cepat.

Ada dua status pensinyalan pada bus CAN, resesif dan dominan. Resesif adalah apa yang terjadi ketika tidak ada yang mengemudikan bus. Kedua garis ditarik bersama-sama dengan total 60 Ω. Bus CAN normal seperti yang diterapkan oleh chip umum seperti MCP2551, harus memiliki 120 "terminator di kedua ujungnya, sehingga total 60" menarik dua garis diferensial secara bersama-sama secara pasif. Keadaan dominan adalah ketika kedua garis secara aktif ditarik terpisah, sekitar 900mV dari keadaan resesif jika saya ingat benar. Pada dasarnya, ini seperti bus pengumpul terbuka, kecuali bahwa itu diterapkan dengan pasangan diferensial. Bus dalam keadaan resesif jika CANH-CANL <900mV dan dominan ketika CANH-CANL> 900mV. Sinyal dominan 0, dan resesif 1.

Setiap kali simpul "menulis" 1 ke bus (biarkan saja), ia memeriksa untuk melihat apakah beberapa simpul lain menulis 0. Ketika Anda menemukan bus dalam keadaan dominan (0) ketika Anda berpikir Anda mengirim dan bit saat ini yang Anda kirim adalah 1, maka itu berarti orang lain juga mengirim. Tabrakan hanya penting ketika kedua pengirim tidak setuju, dan aturannya adalah bahwa pengirim yang mengirim negara resesif mundur dan membatalkan pesannya. Node mengirimkan negara dominan bahkan tidak tahu ini terjadi. Beginilah cara arbitrasi bekerja di bus CAN.

Aturan arbitrase CAN bus berarti Anda harus mengawasi bus di tengah jalan melalui setiap bit yang Anda kirim sebagai 1 untuk memastikan orang lain tidak mengirimkan 0. Pemeriksaan ini biasanya dilakukan sekitar 2/3 dari jalan ke bit , dan merupakan batasan mendasar pada panjang bus CAN. Semakin lambat bit rate, semakin banyak waktu untuk propagasi kasus terburuk dari satu ujung bus ke yang lain, dan oleh karena itu semakin lama bus dapat. Pemeriksaan ini harus dilakukan setiap bit di mana Anda pikir Anda memiliki bus dan mengirimkan 1 bit.

Masalah lainnya adalah penyesuaian laju bit. Semua node pada bus harus menyetujui laju bit, lebih dekat daripada dengan RS-232. Untuk mencegah perbedaan jam kecil dari akumulasi menjadi kesalahan yang signifikan, setiap node harus dapat melakukan sedikit yang sedikit lebih lama atau lebih pendek dari nominalnya. Dalam perangkat keras, ini diterapkan dengan menjalankan jam di suatu tempat sekitar 9x hingga 20x lebih cepat dari bit rate. Siklus jam cepat ini disebut kuanta waktu. Ada cara untuk mendeteksi bahwa awal bit baru berkeliaran di mana Anda pikir mereka seharusnya. Implementasi perangkat keras kemudian tambahkan atau lewati satu kuanta waktu dalam sedikit untuk menyinkronkan kembali. Ada cara lain Anda bisa menerapkan ini selama Anda dapat menyesuaikan diri dengan perbedaan kecil dalam fase antara waktu bit yang diharapkan dan waktu bit aktual yang diukur.

Either way, mekanisme ini membutuhkan berbagai hal yang harus dilakukan pada waktu yang berbeda-beda dalam waktu sedikit. Waktu semacam ini akan menjadi sangat rumit dalam firmware, atau akan membutuhkan bus untuk berjalan sangat lambat. Katakanlah Anda menerapkan sistem kuanta waktu dalam firmware dengan kecepatan 20 kbits / s. Pada minimum 9 kali kuanta per bit, itu akan membutuhkan 180 kHz interupsi. Itu tentu mungkin dengan sesuatu seperti dsPIC 33F, tetapi akan memakan sebagian besar dari prosesor. Pada kecepatan instruksi maks 40 MHz, Anda mendapatkan 222 siklus instruksi per interupsi. Seharusnya tidak butuh waktu lama untuk melakukan semua pengecekan, tetapi mungkin 50-100 siklus, yang berarti 25-50% dari prosesor akan digunakan untuk CAN dan bahwa itu harus mendahului segala hal lain yang sedang berjalan. Itu mencegah banyak aplikasi yang sering dijalankan oleh prosesor ini, seperti pulsa demi kontrol pulsa catu daya switching atau driver motor. Latensi siklus 50-100 pada setiap interupsi lainnya akan menjadi penghenti acara lengkap untuk banyak hal yang telah saya lakukan dengan chip seperti ini.

Jadi Anda akan menghabiskan uang untuk melakukan CAN entah bagaimana. Jika tidak di perangkat keras khusus yang ditujukan untuk tujuan itu, maka dalam mendapatkan prosesor yang lebih besar untuk menangani overhead firmware yang signifikan dan kemudian berurusan dengan latensi interupsi besar yang tidak terduga dan kemungkinan besar untuk semua hal lainnya.

Lalu ada rekayasa di muka. Perangkat CAN hanya berfungsi. Dari komentar Anda, sepertinya biaya tambahan perangkat ini adalah $ 0,556. Itu tampak seperti tawar-menawar bagi saya. Kecuali jika Anda memiliki produk volume yang sangat tinggi, tidak ada cara Anda akan mendapatkan kembali waktu dan biaya yang diperlukan untuk mengimplementasikan CAN di firmware saja. Jika volume Anda setinggi itu, harga yang telah kami sebutkan tidak realistis, dan perbedaan untuk menambahkan perangkat keras CAN akan lebih rendah.

Saya benar-benar tidak melihat ini masuk akal.


Saya menghargai pendapat Anda, tetapi saya ingin tahu mengapa tidak ada yang mencoba mengatasi kesulitan - Setiap proyek akan memiliki masalah itu! Saya akan memberi tahu Anda bagaimana hasilnya jika saya akhirnya mencobanya.
Kevin Vermeer

Pada jumlah 1000, saya menemukan harga $ 3,12 untuk dsPIC33FJ64GP202 dari microchipdirect - Perbedaan nilai total $ 560! Setidaknya layak dicoba. Saya mengutip harga per masing-masing hanya karena lebih mudah untuk mendapatkan nomor untuk masing-masing bagian tanpa harus khawatir terguncang, jumlah paket standar dll.
Kevin Vermeer

2
@ Kevin, harga kuantitas rendah tidak selalu sebanding dengan harga kuantitas tinggi. Saya tidak tahu berapa banyak dari hal-hal ini yang Anda rencanakan untuk dibuat, tetapi $ 560 tidak akan mulai membayar untuk melakukan rekayasa BISA dalam firmware. Saya akan menambahkan untuk menjawab menjelaskan beberapa kesulitan yang akan Anda hadapi.
Olin Lathrop

WTF !? Saya baru saja menambahkan beberapa hal ke jawaban saya, dan sebagian besar istirahat paragraf hilang. Jelas ada garis-garis kosong di jendela edit yang saya ketikkan.
Olin Lathrop

1
Jawabannya adalah ya, tapi saya setuju sepenuhnya dengan Olin di sini. Saya benar-benar bekerja penuh waktu di bidang ini. Saya menggunakan chip dsPIC33FJ256. Waktu yang dihabiskan untuk menulis sesuatu menggunakan pendekatan bit-bang hanya menghilangkan keuntungan biaya dari memiliki perangkat keras yang melakukannya untuk Anda dan Anda menciptakan kembali roda. Belum lagi apa pun yang Anda lakukan di perangkat keras harus direncanakan dengan hati-hati di atas segalanya. Juga, saya ingin tahu apakah Anda melihat protokol tingkat yang lebih tinggi lainnya seperti ISO14229 atau OSEK / Autosar NetworkManagement perlu?
Eric M

2

Kami menggunakan PIC18F25K80 . Meskipun tidak memiliki DSP, itu adalah ~ $ 2 dalam jumlah. Ini hampir merupakan pengganti langsung untuk PIC18F2480 yang Anda sebutkan. Kami menggunakan kompiler CCS dan tumpukan perangkat lunak mereka untuk CAN yang mungkin porting dari Microchip. Ini bekerja dengan baik untuk semua yang saya butuhkan dan coba.


Tidak mencari ECAN. Nama Microchip yang konyol, tapi saya harus membaca lebih dekat lain kali! Seperti yang saya katakan, kebutuhan pemrosesan sinyal saya rendah, jadi saya rasa saya tidak perlu DSP yang sebenarnya.
Kevin Vermeer

2

Jika saya membaca ini dengan benar, sepertinya Anda ingin fungsi bit-bash CAN hanya menggunakan UART dan beberapa firmware pintar. Percayalah, ini tidak akan berhasil - Saya sarankan membaca teks yang bagus tentang seluk-beluk CAN atau CANopen. Anda akan menghapus semua penghematan biaya yang Anda cari dengan menempuh rute ini.

Saya akan menggunakan mikrokontroler dengan modul CAN dan memberikan tambahan $ 2, atau apakah Anda memikirkan protokol lain yang kompatibel dengan UART, seperti Modbus over RS-485 ?


Anda membacanya dengan benar. Saya sudah membaca buklet pelatihan vektor di CAN. Sepertinya setiap pesan akan memerlukan beberapa preprocessing untuk CRC, tetapi sisa paketnya harus sama dan saya hanya perlu terus memeriksa baris penerimaan untuk konflik. Tampaknya tidak sesulit orang-orang yang melakukannya, tetapi saya pasti akan mempertimbangkan saran Anda.
Kevin Vermeer

Saya suka ide Modbus lebih dari RS485. Tampaknya sebagian besar transceiver juga merupakan pasokan 5V; Saya mendapat kesan bahwa diperlukan tegangan input +/- seperti RS232. Harus melihat itu.
Kevin Vermeer

menggedor pasti akan bekerja! Ini tidak sepele seperti Olin, di atas, menyebutkan tetapi dapat dilakukan. Saya pribadi menariknya pada seri PIC18F dan mikro seri dsPIC33. Saya dapat mengunggah sumber PIC18F jika Anda benar-benar ingin melihatnya. Saya tidak bisa, bagaimanapun, memberikan sumber dsPIC karena itu adalah bagian dari proyek komersial yang saya kerjakan. Dalam kedua kasus kami menggunakan MCP2551 dan saya juga memiliki kode LIN juga. LIN sedikit lebih sederhana pada lapisan protokol tetapi menerapkan jadwal LIN sedikit lebih sulit ...
Eric M

1
@EricM - Berapa laju bitnya, dan apakah Anda dapat mengimplementasikan spesifikasi CAN penuh pada perangkat lunak? Saya akan senang melihat kode PIC18F untuk ini.
Rocketmagnet

Ya, terapkan spesifikasi CAN penuh sejauh tidak menduplikasi modul ECAN pada dsPIC yang menangani banyak aspek. Pada implementasi PIC18 saya menggedor bus ke spec penuh dan kemudian dan kode ini akan bekerja pada dsPIC memanfaatkan jalur GPIO. Saya akan memperbarui dalam beberapa hari dengan tautan ke kode.
Eric M

0

Saya juga berpikir tentang CAN-Protocol bit-banging pada PIC µC, jadi tolong EricM, jika Anda benar-benar melakukan itu, harap balas dan katakan setidaknya, bitrate apa pada frekuensi inti PIC18F atau DSPic yang Anda dapatkan. Terima kasih!

Secara umum: RS 485 akan menjadi solusi untuk masalah utama yang ditanyakan, tetapi juga dimungkinkan untuk menggunakan CAN- (atau bahkan FlexRay) -Penerima dengan komunikasi UART non-dupleks-penuh (poin 2 poin) karena semua protokol itu gunakan NRZ-coding.

Tetapi dalam UART / V24 / RS232 full duplex sebagian besar digunakan tanpa memikirkan secara detail, jadi mungkin Anda perlu menaruh otak pada superloop atau statemachine aplikasi Anda ...

Tetapi kembali ke CAN-bitbanging: Saya bekerja dengan CAN selama bertahun-tahun dan tidak pernah melihat implementasi bitbanging, tetapi sejauh yang saya bisa pikirkan, yang seharusnya bekerja untuk pengaturan waktu hingga tk 100kBit dengan μC modern seperti DSPic atau ARM dll. (memiliki Core pada 80MHz atau lebih tinggi ...)

Setidaknya jika hanya membaca kembali dianggap ... Mengirim akan berarti beberapa overhead dalam mempersiapkan struktur bit sehingga tidak 100% busload akan terjangkau, tetapi di BISA lebih dari 65% jarang terjadi sama sekali ...


2
Selamat datang di Teknik Elektro StackExchange. Bagian pertama dari jawaban Anda sama sekali bukan jawaban, jadi Anda mengajukan pertanyaan baru jika itu yang Anda inginkan. OP bertanya secara khusus tentang implementasi perangkat lunak protokol CAN dan jawaban Anda tampaknya berkeliaran tanpa menjawab pertanyaan itu; tolong coba untuk tetap pada topik pertanyaan.
Joe Hass
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.