Apa protokol umum untuk mengirim informasi dari satu sistem ke sistem lainnya? Sebagai contoh, katakanlah kita memiliki beberapa informasi yang dikumpulkan dari mikrokontroler selama jangka waktu yang ingin kita kirim ke mikrokontroler lain. Saya pernah mendengar tentang antarmuka SPI dan I2C, tetapi saya tidak jelas ketika Anda menggunakan satu metode di atas yang lain dan bagaimana Anda menerapkannya. Apakah ada metode lain selain SPI dan I2C yang umum? Apakah proses implementasi serupa untuk mikrokontroler yang berbeda? Apakah pada dasarnya parsing byte data yang saya lakukan pada mikrokontroler penerima?
18
Jawaban:
SPI dan I2C agak mirip, karena mereka benar-benar lebih banyak digunakan untuk melampirkan perangkat periferal ke cpu atau cpu, daripada untuk benar-benar mentransfer data antar sistem. USB adalah antarmuka lain yang tampaknya orang ingin perlakukan sebagai sistem komunikasi, yang notabene adalah bus lampiran periferal.
Komunikasi antar sistem tidak persis seperti memasang perangkat ke bus. Lampiran bus memungkinkan prosesor untuk secara langsung menggedor register dalam suatu perangkat, sedangkan antarmuka komunikasi memungkinkan Anda untuk mengirim / menerima aliran data. Perangkat yang terhubung pada bus umumnya memerlukan driver perangkat, sedangkan dengan komunikasi, tidak masalah apa yang terhubung di ujung lain, sejauh menyangkut komputer host.
Tentu saja, ini menjadi batas yang lebih berbahaya sepanjang waktu. Hal-hal seperti PCI dan ISA adalah bus yang tidak dapat disangkal; I2C, SPI, USB bisa dibilang bus; sedangkan RS232, RS485, dan ethernet jelas merupakan antarmuka komunikasi. Tapi kemudian ada hal-hal seperti CAN bus dan 1553, yang pasti tentang memindahkan data, tetapi dengan cara yang sangat terlibat.
sumber
Tidak ada satu cara untuk mengirim data, ada banyak cara untuk berkomunikasi tergantung pada jarak, kecepatan data, lingkungan, aplikasi ...
Lapisan terendah adalah lapisan fisik , yang sebenarnya menggerakkan bit di sekitar.
SPI dan I²C adalah untuk jarak pendek di dalam perangkat, di mana tidak ada banyak suara yang dapat mengganggu transmisi.
Untuk komunikasi yang tidak terlalu cepat jarak jauh hingga beberapa puluh meter komunikasi serial melalui RS-232 adalah pilihan yang baik.
Jika ada lebih banyak noise atau sinyal diferensial jarak yang lebih panjang digunakan, misalnya dalam RS-485. Untuk pengiriman data yang lebih cepat ada Ethernet, yang menjadi semakin populer.
Lalu ada juga berbagai standar nirkabel.
Di atas lapisan fisik ada lebih banyak lapisan yang mengatur bagaimana data dikirim, untuk mendeteksi dan memperbaiki kesalahan dalam transmisi, perutean dalam jaringan, dan banyak hal lainnya. Sebagai contoh, protokol internet adalah tumpukan yang agak rumit dari beberapa lapisan, biasanya di atas protokol Ethernet.
sumber
UART serial sederhana dapat digunakan (satu baris Tx dan satu Rx tanpa jam diskrit) dan dapat dengan mudah disesuaikan untuk melintasi antara berbagai potensi (bahkan sirkuit primer dan sekunder) dengan optoisolator atau isolator magnetik .
Sejauh protokol berjalan, apa pun dengan byte perintah yang ditentukan dan semacam skema checksum akan bekerja dengan baik. Sebenarnya tidak ada protokol standar yang mencakup semua jenis komunikasi. I2C memiliki standar pensinyalan (mendefinisikan pengalamatan, berhenti, mulai, dll.) Tetapi protokol dari apa yang sebenarnya dikomunikasikan sepenuhnya terserah pengembang.
PMBus , misalnya, adalah protokol komunikasi catu daya yang menggunakan I2C sebagai media fisiknya.
sumber
Sebenarnya tidak ada protokol "umum", yang akhirnya Anda gunakan sangat bergantung pada aplikasi. Agar kami dapat memberikan jawaban yang lebih baik, kami perlu memahami persyaratan Anda sedikit lebih baik. Anda menyebutkan bahwa Anda ingin memiliki pengontrol mikro terpisah yang berbicara satu sama lain sebagai subsistem.
Beberapa pertanyaan tentang aplikasi ini:
Jika Anda menjawab TIDAK untuk pertanyaan 1:
Jika hanya ada 2 mikrokontroler di proyek ini, Anda pasti dapat menggunakan UART di antara mereka. Jika keduanya perlu memulai komunikasi, gunakan kontrol aliran, jika tidak sepele untuk mengirim data dalam satu arah. Sebagian besar harus "cukup cepat" mengingat Anda memilih salah satu dari angka baud yang lebih tinggi. I2C dan SPI biasanya hanya baik untuk arsitektur master / slave.
Jika Anda menjawab YA (lebih dari 2 pengendali) untuk pertanyaan 1:
Jadi sekarang Anda membutuhkan sesuatu yang lebih skalabel di mana Anda dapat menjatuhkan perangkat yang dapat dialamatkan ke bus umum. Jawaban untuk pertanyaan tindak lanjut ini akan membantu Anda memutuskan antara I2C dan SPI (master-slave) atau sesuatu seperti CAN (multi-master).
Kontroler mikro Anda kemungkinan besar memiliki periferal UART, yang lainnya (terutama CAN) mungkin hanya tersedia pada chip yang lebih tinggi. Dalam kedua kasus tersebut, harus ada banyak dokumentasi tentang cara menggunakan periferal ini untuk memindahkan byte.
sumber
Sebagaimana dicatat oleh @Jon, satu masalah dalam memilih antarmuka komunikasi adalah apakah satu entitas akan selalu bertanggung jawab untuk memulai komunikasi, atau apakah lebih dari satu entitas mungkin begitu bertanggung jawab. Masalah terkait adalah apakah satu entitas akan selalu siap untuk menerima komunikasi yang tidak diminta. SPI sering digunakan dalam aplikasi di mana satu sisi akan selalu siap untuk menerima komunikasi. Sesuatu seperti register geser 74HC595, misalnya, tidak pernah "sibuk". Sementara SPI baik untuk komunikasi antara mikrokontroler dan perangkat keras yang seharusnya dikendalikan oleh mikro, namun sebenarnya tidak baik untuk komunikasi antara dua mikrokontroler. Ketika dua prosesor dengan perangkat keras I2C menggunakannya untuk berkomunikasi, perangkat lunak dapat memakan waktu selama yang diinginkan (dalam batasan yang sangat murah hati) untuk menangani apa yang terjadi, tanpa menyebabkan kehilangan data. Jika prosesor mengambil 100 mikrodetik untuk memproses setiap byte yang masuk, itu akan sangat membatasi throughput, tetapi pengirim akan memperlambat cukup untuk penerima untuk menjaga. Satu-satunya cara yang umumnya dapat terjadi dengan SPI adalah jika seseorang memiliki kawat terpisah untuk berjabat tangan.
I2C benar-benar protokol yang luar biasa. Keterbatasan terbesar yang menghentikannya dari menjadi protokol yang paling sempurna yang bisa dibayangkan adalah
Secara pribadi, saya ingin melihat vendor kontrol mendukung varian tiga-kawat SPI yang termasuk berjabat tangan. Saya tidak mengetahui adanya pengontrol yang melakukannya.
sumber
Tanpa urutan tertentu, instance lapisan fisik paling populer untuk 2 CPU dalam kotak yang sama tampaknya:
Instance layer fisik ini (serta instance layer fisik lainnya untuk 2 CPU dalam kotak terpisah) biasanya menyediakan aliran byte ke perangkat lunak yang mengimplementasikan level yang lebih tinggi dari sistem komunikasi.
Pemrogram pintar menulis perangkat lunak sedemikian rupa sehingga ketika orang perangkat keras memutuskan untuk merobek satu instance layer fisik dan menggantinya dengan instance layer fisik yang sama sekali berbeda, mereka hanya perlu menulis ulang beberapa fungsi untuk memberi makan aliran output byte mereka ke perangkat keras dan membaca kembali aliran byte dari perangkat keras, dan semua hal protokol tingkat tinggi terus bekerja tidak berubah.
Protokol untuk mengirim informasi dari satu CPU ke CPU lain hampir selalu melibatkan menafsirkan aliran byte sebagai serangkaian paket:
Beberapa orang tampaknya menikmati membuat protokol yang sepenuhnya baru, kustom, tidak kompatibel dengan mencampur-dan-mencocokkan (2) salah satu dari banyak jenis struktur header dengan (3a) salah satu dari banyak jenis data bersambung dengan (3b) salah satu dari banyak jenis lolos dari data bersambung dengan (4) salah satu dari banyak jenis trailer.
Beberapa protokol paling sederhana untuk merangkum data ke dalam sebuah paket meliputi:
Protokol yang sedikit lebih rumit untuk merangkum data ke dalam sebuah paket meliputi:
Ada daftar panjang protokol di
Anda dapat menikmati membaca "Protokol Desain Cerita Rakyat" oleh Radia Perlman yang menjelaskan bagaimana desain protokol bisa salah.
sumber
Tidak ada protokol 'umum' tunggal. Pilihan dapat (misalnya) bergantung pada:
Dalam banyak kasus, Anda harus menghilangkan lapisan fisik (level sinyal) dari lapisan tautan data (+/- cara data dikodekan) (periksa model OSI, turunkan lapisan 2 ..4). Lapisan phyiscal yang memungkinkan misalnya:
Anda dapat menggunakan satu baris untuk membawa data dan info jam, atau membaginya menjadi beberapa baris. Yang terakhir dulu populer, tetapi saat ini kebanyakan protokol baru / cepat cenderung menggunakan satu baris (atau sepasang garis yang bertindak sebagai satu).
Ada banyak cara untuk menyandikan data dan jam pada suatu garis. RS232 secara tradisional menggunakan NRZ, ada pengkodean Machester, dan berbagai format menggunakan pada harddisk dengan nama penasaran baris 2.7 RLL.
Singkatnya: ada banyak trilyun cara untuk melakukan komunikasi antar sistem. Dan saya bahkan belum menyebutkan konektor atau aspek tingkat yang lebih tinggi seperti deteksi dan pemulihan kesalahan, pengodean data, kompresi, dan enkripsi ...
sumber