Mengapa transceiver CAN saya tidak dapat menerima pesan kecuali ada penundaan startup yang lama atau penganalisa bus yang terhubung?

8

Saya menggunakan MCU 16-bit, PIC24HJ64GP504 , untuk menulis aplikasi berbasis CAN. Pada dasarnya ini adalah komunikasi antara papan saya dan satu simpul lain yang terus mengirim data ke papan saya menggunakan CAN pada 1 Mbit / s. Saya mengkonfigurasi modul ECAN di PIC24 saya untuk bekerja pada 1 Mbit / s. Saya telah menulis kode sedemikian rupa sehingga untuk 10 ms pertama modul ECAN akan menerima semua pesan yang datang dari sisi lain, dan setelah itu saya mengkonfigurasi ulang modul ECAN untuk menerima hanya pesan-pesan dengan pesan ID 0x13.

Sekarang inilah masalahnya .. Node lain dan papan saya dinyalakan pada saat yang sama. Node lain mulai mengirimkan pesan setelah 40 ms atau lebih setelah powerup. Tetapi saya tidak bisa mendapatkan pesan apa pun dari itu di papan tulis saya. Sekarang jika saya menyalakan papan saya terlebih dahulu, berikan waktu untuk mengkonfigurasi ulang modul ECAN dengan filter baru dan menetap dan kemudian nyalakan node lain, maka semuanya bekerja dengan sempurna.

Sekarang bagian yang paling aneh .. Jika saya memiliki alat analisa bus CAN yang terhubung antara board saya dan node lainnya dan bahkan jika saya menyalakan kedua node secara bersamaan, semuanya berfungsi dengan baik ... tidak perlu menyalakan board saya terlebih dahulu. Saya telah mencoba ini dengan tiga penganalisa bus yang berbeda dari pabrikan yang berbeda dan mendapatkan hasil yang sama.

Bagi saya tampaknya selama konfigurasi ulang modul ECAN, perlu beberapa waktu untuk menyelesaikannya. Dan dengan diperkenalkannya penganalisa bus di bus, kali ini entah bagaimana dipersingkat sehingga semuanya bekerja dengan sempurna. Tapi saya tidak yakin apa sebenarnya masalahnya.

Saya telah berjuang dengan masalah ini selama tujuh hari terakhir.

PS: Hari ini saya memeriksa dengan lingkup dan menemukan bahwa jika node lain mulai mentransmisikan setelah 170 ms setelah powerup, maka semuanya bekerja dengan baik. Sebelum itu, perangkat saya tidak akan menerima pesan apa pun darinya kecuali penganalisa bus terhubung. Bagian terburuknya adalah saya tidak bisa menunda transmisi node lain, firmware dari node itu adalah hak milik.

Saya juga membaca di forum hari ini bahwa BISA membutuhkan resistor 120 at pada node untuk membuatnya berfungsi (meskipun node saya tidak memiliki satu dan berfungsi dengan baik, asalkan diberi waktu untuk menyelesaikan setelah konfigurasi ulang). Saya menduga pengenalan bus analyzer entah bagaimana mengubah parameter listrik beberapa jaringan sehingga waktu yang dibutuhkan oleh simpul saya untuk menyelesaikan setelah konfigurasi ulang terpotong. Tapi saya tidak yakin .. :(

Mayuresh
sumber
1
Bisakah Anda memberi kami tautan ke semua produk yang Anda gunakan. Ini memungkinkan jawaban konkret menjadi lebih mudah diformulasikan.
Kortuk
Apakah Anda dapat membuat perubahan pada papan Anda, atau apakah Anda mengharapkan / berharap untuk solusi perangkat lunak murni?
vicatcu
Apakah Anda yakin simpul lain terus mentransmisikan, bahkan jika simpul Anda sendiri tidak aktif dan berjalan? Beberapa implementasi CAN menggunakan penghitung kesalahan, dan jika ini meluap (misalnya karena tidak ada node yang menerima), node pengirim berhenti.
Schedler
1
keil.com/download/files/can_primer_2009sp.pdf Primer yang sangat baik di CAN.
Stephen Collings

Jawaban:

9

Anda "membaca di forum" di suatu tempat bahwa bus BISA membutuhkan resistor? Serius !!?

Ini adalah bagian integral dari desain Anda. Jika Anda akan menggunakan CAN, Anda harus memahaminya, yang berarti membaca dokumentasi yang relevan.

Spearson benar tetapi karena alasan yang salah. BISA diferensial bus seperti yang mungkin Anda miliki (Anda tidak mengatakan apa antarmuka chip yang Anda gunakan, tetapi mungkin Anda memiliki BISA diferensial diferensial bus karena didorong oleh sesuatu seperti MCP2551 di setiap node) membutuhkan perlawanan di antara garis-garis. Ini karena keadaan resesif ditandai oleh dua garis yang ditarik secara pasif, dan keadaan dominan oleh mereka secara aktif ditarik terpisah. Resistor antara garis dalam arti adalah setara dengan resistor pullup pada garis kolektor terbuka. Tanpa sesuatu yang menarik garis ketika tidak ada yang mengemudi bus, bus tidak berfungsi.

Resistor juga berfungsi sebagai terminator seperti yang ditunjukkan spearson. Anda biasanya menggunakan twisted pair untuk dua jalur bus. Ini memiliki impedansi sekitar 120 Ω. Jenis diferensial bus CAN ini didefinisikan memiliki 60 Ω antara garis sebagai tarik-bersama sehingga dapat diimplementasikan dengan 120 120 di masing-masing untuk mengakhiri bus dan menghindari refleksi.

 

Olin Lathrop
sumber
Apa yang dimaksud dengan "spearson"? Seorang pengguna bernama "spearson" yang meninggalkan komentar (sejak itu dihapus atau pengguna mengubah nama layar?)? Buku (nama penulis)?
Peter Mortensen
@ Peter: Rupanya ya.
Olin Lathrop
4

Dalam operasi CAN yang normal, sebuah node akan mengulangi pengirimannya sampai ACK'd atau jumlah kesalahan telah terlampaui. Ketika Anda memiliki alat analisa CAN terhubung ke jaringan, itu akan mengeluarkan bit ACK ketika mendeteksi frame dari node pertama Anda, membuat transmisi berhasil. Jika Anda menggunakan Microchip CAN BUS Analyzer, Anda dapat mengonfigurasinya ke mode 'hanya mendengarkan', yang berarti tidak akan mengeluarkan bit ACK, karena itu tidak memengaruhi jaringan. Jadi Anda harus dapat melihat frame CAN yang diulang di layar analyzer sampai simpul kedua mengeluarkan ACK atau simpul pertama berhenti mentransmisikan karena kesalahan hitungan.

Bit ACK akan diatur oleh node penerima (jika frame selesai dan benar) terlepas dari penyaringan alamat.

Kemungkinan besar simpul pertama Anda mencapai status kesalahan karena frame tidak sedang ACK. Anda harus mendeteksi ini dalam perangkat lunak menggunakan register CiINTF. Anda juga dapat mengkonfigurasi PIC untuk mengeluarkan interupsi untuk kondisi kesalahan menggunakan register CiINTE.

Jika ruang lingkup Anda tidak men-decode frame CAN, coba penganalisa Saleae Logic . Ini akan men-decode frame CAN dan menampilkan bit ACK / Error. Ini jauh lebih dapat diandalkan daripada penganalisa CAN Microchip.

Erik
sumber
3

Ada slot ACK (dua bit) dalam CAN Frame. Jika sebuah simpul A mentransmisikan data dan ada lima simpul lain di bus, setelah transmisi simpul mana pun yang menerima bingkai akan menempatkan bit dominan di slot ACK. Ini menunjukkan pesan berhasil dikirim. Kalau tidak, pengendali CAN dapat menganggapnya sebagai kesalahan pada bus.

Ketika Anda menambahkan analisa CAN, mengirimkan ACK ke pemancar. Pemancar berpikir bus itu baik dan terus mentransmisikan. Dalam ketiadaan analisis CAN, ketika Anda mengkonfigurasi ulang kontroler CAN Anda, pemancar tidak mendapatkan ACK dan berpikir ada kesalahan pada bus, sehingga berhenti mentransmisikan.

Saya harap Anda mengerti maksudnya.

Pastikan ACK semakin baik. Coba juga untuk tidak mematikan penerima CAN Anda sepenuhnya saat melakukan konfigurasi ulang.

Trik lain (saya tidak yakin ini akan selalu berhasil) adalah mengirim nol DLC dan nol ID frame setelah konfigurasi ulang. Ini akan memberi tahu node pengirim bahwa bus aktif, dan akan mulai mentransmisikan.

Catatan: resistor 120 is adalah HARUS !!! . Resistansi penghentian adalah hal penting di bus APAPUN.

Swanand
sumber
Trik Anda mengirim nol DLC dan nol ID frame setelah inisialisasi, sebenarnya sudah ada dalam standar, yang dikenal sebagai pesan bootup. ID-nya sama dengan detak jantung (0x700 + ID simpul) dan memiliki DLC tunggal 1. Alat analisis harus mengenali ini.
BullBoyShoes