Cara memeriksa bus CAN gratis atau tidak

8

Saya membaca banyak hal tentang arbitrase CAN bus, tetapi tidak menjawab pertanyaan saya.

Jika satu node sudah mentransmisikan data di bus dan di antara node lain ingin memulai transfer data, bagaimana "node lain" mengetahui bahwa bus sedang sibuk?

Semua dokumen (yang saya baca) menyatakan bahwa kedua node memulai transmisi secara bersamaan dan kemudian satu dengan bit dominan pertama akan mendapatkan bus tetapi tidak ada yang menjelaskan kondisi yang ingin saya ketahui.

Swanand
sumber
1
Swanand, Anda mungkin mendapatkan jawaban yang lebih baik untuk pertanyaan Anda jika Anda menunggu sedikit lebih lama untuk menerima jawabannya. Ini adalah komunitas internasional, dan beberapa pakar mungkin tidak dapat merespons secara instan.
W5VO
@ W5VO Saya akan mengingatnya lain kali! Terima kasih atas sarannya! :)
Swanand

Jawaban:

10

Jawaban singkatnya adalah simpul harus memonitor garis CAN agar tidak digunakan selama waktu tertentu sebelum mencoba mengirim. Jadi jika node lain mentransmisikan, ia harus tetap diam sampai node lain selesai.

Bus CAN didasarkan pada pensinyalan diferensial. Dua jalur, CAN-High (CAN +) dan CAN-Low (CAN-), keduanya memiliki potensi yang sama ketika bus dalam keadaan diam. Untuk mengirim bit, pemancar CAN menempatkan tegangan diferensial pada garis sekitar 2 volt.

Seorang pemancar CAN pertama-tama melihat apakah bus itu diam dan jika itu, mulai mengirimkan. Cara arbitrase bekerja adalah bahwa pemancar memonitor bus ketika sedang melakukan transmisi. Transmisi dilakukan seperti di atas dengan menjaga kedua garis pada potensial yang sama atau pada potensial diferensial. Jadi jika pemancar mentransmisikan sedikit dengan menjaga garis-garis pada potensial yang sama (sic), tetapi ia melihat bahwa dua jalur transmisi memiliki potensi diferensial, itu berarti bahwa beberapa node lain mentransmisikan dan pemancar pertama telah kehilangan arbitrase. Kemudian harus berhenti transmisi.

Ketika sebuah node pertama mulai mentransmisikan, bit yang ditransmisikan adalah sama sampai alamat dari node pengirim yang jelas berbeda. Jika dua node mulai mentransmisikan bersama, mereka akan mengirimkan bersama dalam sinkronisasi sampai bagian alamat tercapai. Ketika alamat berbeda, sebuah node akan melihat perbedaan potensial pada garis bahkan ketika itu tidak menempatkan satu di garis. Maka ia tahu itu telah hilang dan harus mencoba lagi. Node yang menang terus mentransmisikan tanpa mengetahui bahwa beberapa node lain sedang mencoba juga. Tentu saja, logika ini meluas ke lebih dari dua node juga.

Saya harap ini membantu.

Dokter
sumber
1
Jawaban yang bagus! Jika saya ingat benar, mengirim '0' lebih dominan daripada '1', yang menghasilkan arbitrase pemenang alamat terendah. Fitur yang rapi dari ini adalah bahwa jika kehilangan simpul berhenti ketika seharusnya berhenti, tidak akan ada kerusakan data pada bus.
W5VO
Jawaban bagus !! Akan sangat berterima kasih jika Anda bisa menghapus ini: Katakanlah pengidentifikasi adalah "1011001" dan "1000110" ketika bit ketiga tercapai pemancar pertama mengirim "1" dan yang kedua mengirim "0"; jadi sesuai protokol CAN bit dominan adalah 0, dan itu menimpa bit resesif. Jadi sekarang Bus memegang "0"; modul pertama mendeteksi ini dan akan menghentikan transmisi sedangkan yang kedua akan terus mentransmisikan. Apakah pemahaman saya benar ??
Febin Sunny
@FebinSunny Ya ... Apa yang Anda katakan itu benar!
Swanand
1
Jawaban ini bukan "baik" atau "hebat". Padahal, itu sama sekali salah . Pertama, pemancar tidak "menjaga kedua saluran pada potensi yang sama" untuk mengirim bit resesif. Itu hanya berhenti menarik garis terpisah, dan resistor terminasi menyamakan potensial. Kedua, alamat node pengirim bukan bagian dari bidang arbitrase dalam spec CAN, meskipun beberapa protokol berbasis CAN tingkat lebih tinggi menggunakannya sebagai bagian dari ID pesan. Ketiga, tak satu pun dari ini ada hubungannya dengan mendeteksi bus idle
Maple
7

Saya tahu dua cara untuk mengatasinya:

Pertama, pengontrol CAN akan selalu memonitor bus; ketika mendeteksi pesan di bus itu memulai proses penerimaan. Sekarang karena sudah dalam kondisi penerima, ia tahu bus sedang digunakan ketika sebuah transmisi diminta.

Kedua, dengan isian bit, transceiver CAN tidak akan memiliki bit yang sama selama lebih dari lima siklus (kecuali kesalahan bus terdeteksi, dalam hal ini Anda akan melihat hingga 12 bit dominan berturut-turut). Pengecualian untuk ini adalah ketika tidak ada yang ditransmisikan di bus, ketika bit pasif selalu dibaca. Seorang pengontrol yang baru mulai dapat mendengarkan bus selama lima siklus sebelum menyatakan 'mungkin gratis'.

Saya tidak menjamin bahwa ini adalah proses yang sebenarnya, tetapi berdasarkan pengetahuan saya (terbatas) tentang CAN, ini akan berhasil.

CoderTao
sumber
Saya menyukai trik ke-2! Itu murni logis dan mengagumkan!
Swanand
2
Anda kehilangan titik utama arbitrase bus - bahwa hal pertama dalam paket CAN adalah alamatnya.
W5VO
1
Itu bukan pertanyaannya; pertanyaannya adalah bagaimana controller menentukan apakah ada aktivitas di bus
CoderTao
@ W5VO BISA frame tidak memiliki alamat, kecuali beberapa protokol tingkat yang lebih tinggi membuatnya menjadi bagian dari ID pesan.
Maple
@CoderTao sementara bit stuffing bukan bagaimana controller mendeteksi bus yang tidak digunakan, Anda benar karena ia memainkan peran penting dalam proses ini, dengan memastikan data yang dikirimkan tidak dapat keliru untuk akhir frame
Maple
3

Seperti yang dikatakan CoderTao - kontroler CAN terus memantau bus, jadi ia tahu kapan transmisi sedang berlangsung. Jadi satu-satunya waktu ketika tabrakan dapat terjadi adalah ketika kedua node mulai mentransmisikan "secara bersamaan" - dalam waktu bit masing-masing (+ sejumlah kecil waktu tambahan untuk propagasi bus). Karenanya itulah satu-satunya kasus yang Anda temukan dalam dokumen :)

Martin Thompson
sumber
2

Alamat simpul menentukan prioritas, alamat yang lebih rendah menjadi prioritas tinggi. Transmisi dimulai dengan node yang menyiarkan alamatnya. Pada saat yang sama ia mentransmisikan, ia mendengarkan. Katakanlah simpul tiga dan dua mentransmisikan pada saat yang sama. Sebagai bit terakhir dari alamat, simpul tiga menyiarkan 1 dan simpul dua menyiarkan 0. Karena 0, jalur data ditarik ke status 0. Node tiga melihat bahwa alih-alih 1 yang disiarkan, salurannya adalah 0 dan berhenti mentransmisikan.

CAN pertama kali digunakan pada mobil dan truk. Beberapa sensor perlu memiliki prioritas yang jauh lebih tinggi daripada yang lain. Misalnya, pengereman anti selip perlu memiliki prioritas yang lebih tinggi daripada cairan pencuci kaca depan yang rendah.

Jim C
sumber
Saya sudah tahu ini .... Pertanyaan saya bukan tentang Arbitrase di Awal .... Itu tentang di sela-sela transmisi ....
Swanand
1

Ada empat elemen kunci dalam spesifikasi CAN yang memungkinkan pengontrol CAN untuk mendeteksi kondisi bus idle:

  • Pensinyalan Wired-AND memungkinkan bit dominan yang ditransmisikan oleh salah satu node untuk dideteksi oleh semua node lain yang mentransmisikan bit resesif pada saat yang sama. Jadi, jika ada node yang mengirimkan bit resesif melihat keadaan dominan bus, ia tahu bahwa bus sedang sibuk .

  • Isian bit memastikan bahwa tidak ada lebih dari 5 bit berturut-turut yang identik. Dengan sendirinya, bit stuffing digunakan untuk menjaga sinkronisasi. Namun efek sampingnya adalah tidak lebih dari 5 bit resesif berturut-turut dapat terjadi di dalam bit frame hingga pembatas CRC.

  • End-of-frame adalah serangkaian 7 bit resesif di ujung bingkai. Mereka tidak diisi bit, sehingga mereka dapat dengan mudah dideteksi oleh pengontrol. Perhatikan, bahwa bus belum menganggur selama waktu ini, karena EOF dianggap sebagai bagian dari frame.

  • Ruang IFS adalah serangkaian 3 resesif istirahat bit antara frame, diikuti oleh negara bus menganggur. Tidak ada node yang diizinkan untuk memulai transmisi selama istirahat, kecuali mereka ingin mengirim frame kesalahan atau kelebihan . Selanjutnya, node yang mentransmisikan frame terakhir juga harus mengirim 8 bit transmisi suspend resesif setelah istirahat sebelum memulai transmisi lain. Persyaratan terakhir ini memungkinkan node lain untuk mulai mengirim pesan yang tertunda, jadi tidak ada node yang dapat "memonopoli bus" tanpa batas.

Dari semua hal di atas, berikut adalah cara simpul mendeteksi keadaan bus idle:

  • Menerima node hanya menunggu 10 bit resesif berturut-turut , yang termasuk EOF dan waktu istirahat. Setelah waktu itu, mereka menganggap bus itu idle dan dapat mencoba memulai pengirimannya sendiri.

  • Node pengirim mengirimkan 11 bit resesif berturut-turut setelah EOF dari frame terakhir yang ditransmisikan. Jika tidak ada simpul lain yang memulai transmisi selama waktu ini, bus tersebut dianggap menganggur dan dapat mencoba memulai transmisi lain. Jika bit dominan terdeteksi selama ini, node menjadi penerima.

Informasi di atas ditambah info tambahan tentang waktu bit dapat ditemukan dalam spesifikasi CAN yang dikembangkan oleh BOSCH.

Maple
sumber
Ada bus dengan beberapa node aktif. Node baru dicolokkan ketika tidak ada komunikasi yang terjadi. Bagaimana simpul baru ini akan tahu bahwa bus itu idle? 10 bit resesif berturut-turut ditransmisikan ketika node baru ini tidak ada dalam gambar.
Swanand
"Wired-AND signaling" berarti bahwa bit resesif tidak "ditransmisikan", itu berarti node pengirim tidak secara aktif menghasilkan potensi dominan. Tetapi mereka diterima , yaitu node penerima sampel bus pada interval bit dan mereka melihat bit resesif di telepon. Jadi, jika simpul baru ini sampel bus 10 kali dan melihat bit resesif setiap kali menganggap bus menganggur.
Maple
Tidak ada perbedaan antara "10 bit resesif berturut-turut yang ditransmisikan ketika node baru ini tidak ada dalam gambar" dan keadaan diam bus setelah itu. Jika tidak ada komunikasi, pembacaan bus akan mengembalikan bit resesif ("1"). Jadi tidak masalah ketika Anda memulai pengambilan sampel, selama atau setelah bit dominan terakhir. Selama penerima melihat 10 bit, ia dapat mulai mentransmisikan. BTW, tidak ada yang mengirim 10 bit. Pemancar terakhir "mengirim" 11 bit resesif, 3 istirahat + 8 menunda. Jika node menunggu mulai mentransmisikan setelah tanggal 10, pemancar terakhir kehilangan arbitrasi dan menghasilkan bus ke node baru
Maple
0

Node tertentu memulai transmisi setelah periode INTERMISI saja (durasi ini juga disebut durasi TERTANGGUNG, dalam periode ini 3 bit resesif ditransmisikan ke bus setelah Transmisi frame DATA / REMOTE ke bus. Ini menunjukkan bahwa BUS adalah dalam status IDLE), karena, selama periode ini, tidak ada node yang memulai Transmisi. Setelah BUS berada di IDLE STATE, simpul yang menginginkan bus untuk transmisi masuk ke ARBITRASI.

Setelah transmisi ruang antar bingkai ke bus, node yang ada di jaringan CAN akan mencoba untuk memulai Transmisi. Oleh karena itu, simpul tertentu tahu apakah Bus sedang sibuk atau tidak.

Nagendra Pulaparthi
sumber
Bagaimana jika, itu akan menjadi transmisi pertama di bus? Dalam hal ini tidak akan ada "Masa istirahat". Lihat jawaban @ Doc untuk detailnya.
Swanand