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.
Jawaban:
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.
sumber
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.
sumber
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 :)
sumber
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.
sumber
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.
sumber
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.
sumber