Apa bus serial tertanam paling populer? [Tutup]

8

Saya merancang perangkat yang disematkan yang ingin saya operasikan dengan periferal pihak ketiga melalui bus serial. Haruskah saya memilih SPI, I²C, atau bus lain?

Periferal akan menjadi bandwidth yang cukup rendah (beberapa sensor yang berkomunikasi melalui bus, disurvei secara berkala) dan kemungkinan besar berada dalam jarak satu meter atau kurang dari pengontrol. Satu-satunya tugas pengontrol adalah mengumpulkan data sensor, mengemasnya dengan beberapa cara, dan kemudian mengirimkannya ke modul nirkabel melalui bus lain (meskipun bus sensor berpotensi digunakan kembali untuk ini juga).

pfyon
sumber
3
Tergantung periferal mana yang ingin Anda operasikan, pada voltase apa, pada kecepatan apa dan pada jarak berapa.
Toby Jaffey
1
Saya menambahkan rincian lebih lanjut ke pertanyaan
pfyon
1
Saya tidak percaya UART sama sekali tidak disebutkan ... Saya hanya mengatakan.
vicatcu
Koreksi saya jika saya salah, tetapi saya tidak berpikir UART adalah bus. Saya pikir itu hanya komunikasi serial antara dua perangkat.
pfyon
Jadi bus bukan untuk komunikasi serial antara dua perangkat? Apakah Anda mengabaikannya karena kadang-kadang hanya digunakan point-to-point? PCIe, SATA, HT semuanya umumnya point-to-point. Apapun, sebagian besar perangkat UART dapat digunakan untuk RS-422, RS-485, atau LIN yang multi-drop.
Nick T

Jawaban:

12

Jika Anda tidak yakin, dan persyaratan Anda tidak jelas, saya akan memilih I²C.

Perbedaan utama antara SPI dan I²C adalah bahwa SPI membutuhkan jalur pemilihan chip untuk setiap perangkat. I²C menyiarkan alamat periferal pada awal komunikasi, sehingga tidak perlu jalur pilih-chip. Garis pilih chip menjadi rumit setelah beberapa yang pertama.

Di sisi lain, SPI mungkin lebih mudah diimplementasikan dan didebug. Ini bisa menjadi pemenang jika Anda hanya ingin terhubung ke beberapa perangkat.

Saya akan mengesampingkan USB kecuali jika Anda memerlukan kecepatan data tinggi pada jarak yang relatif jauh (m daripada cm). Saya juga mengesampingkan RS-232 kecuali itu masih 1976 dan perangkat Anda memerlukan sinyal besar untuk membedakan sedikit dari kebisingan.

Anda mungkin mempertimbangkan Dallas 1-wire, tapi saya curiga itu tidak biasa seperti I²C, dan bus "1-kawat" yang membutuhkan 2 kabel untuk beroperasi selalu terasa agak mencurigakan bagi saya.

pingswept
sumber
1
Saya pikir jika Anda memiliki pengontrol yang sangat sederhana dan Anda perlu menggunakan bit-banging (pada dasarnya mengoperasikan jam secara manual), akan lebih mudah untuk mengimplementasikan SPI pada 4 port GPIO yang tersisa.
Wouter Simons
1
Saya pikir Anda benar tentang hal itu menjadi lebih mudah untuk bitbang SPI daripada I2C. Saya berharap itu tidak akan turun menggedor sekalipun.
pfyon
3
+1 untuk mencurigakan dari sistem 2 kawat yang dipasarkan sebagai "1-kawat".
semaj
Dan untuk membuatnya lebih buruk, banyak chip yang menerapkan sistem 1-kawat (+ ground) membutuhkan pin ketiga - Vcc - karena mereka tidak dapat beroperasi dengan daya parasit! Ketika saya memikirkan bus 1-kawat, saya membayangkan beberapa pemasangan kapasitif ditambah, dengan penyearah jembatan terbatas saat ini, dan beberapa kode garis self-clocking; bukan 2 atau 3 kabel.
Kevin Vermeer
"1-wire" seharusnya disebut "1-data-wire", karena lebih dari itu. Kabel tambahan adalah GND dan (kadang-kadang) saluran listrik yang stabil.
Johan
3

Karena Anda mengatakan bahwa itu akan menjadi bandwidth rendah saya akan mengalokasikan cukup IO untuk menangani SPI dan I2C. Saya juga akan jika mungkin memiliki saluran CS tambahan sehingga Anda dapat menjalankan beberapa perangkat SPI. Juga jangan lupa melihat bagaimana Anda akan memberi daya pada perangkat. Jika Anda kehabisan baterai untuk mendapatkan masa pakai maksimum, Anda perlu menempatkan perangkat dalam mode daya rendah atau menghilangkan daya saat tidak digunakan. Juga gunakan Anda pengendali modul pengontrol serial jika memungkinkan banyak pengontrol akan mux SPI, I2C dan serial. Jika Anda dapat dan memisahkan nirkabel dari sensor ini membuatnya lebih mudah untuk mematikan perangkat saat tidak digunakan. Juga beberapa sensor memiliki garis yang akan memberitahu pengontrol kapan mereka perlu diservis sehingga Anda juga ingin memiliki IO tambahan yang masuk ke pin idealnya Anda dapat menghasilkan interupsi.

Rex Logan
sumber
2

Pertanyaannya adalah sedikit masalah karena masalah definisi.

Komunikasi serial pada dasarnya adalah apa yang Anda butuhkan jika Anda ingin berkomunikasi dengan beberapa perangkat eksternal tanpa menggunakan beberapa port pada controller Anda. Pada dasarnya setiap metode komunikasi serial membutuhkan jam dan konfigurasi tentang cara menangani koneksi data.

SPI adalah bus 4 kawat. I2C adalah bus 2 kawat.

Masing-masing memiliki karakteristik berbeda. Apa yang perlu Anda jawab adalah seberapa cepat komunikasi Anda perlu, seberapa andalnya komunikasi itu, pilihan apa yang ditawarkan mikrokontroler Anda, dll.

Ini wikipedia artikel dan ini situs referensi menjelaskan lebih jelas daripada yang saya bisa, juga mengikuti referensi untuk belajar lebih banyak lagi!

Wouter Simons
sumber
2

Pada dasarnya, Anda harus memilih antara I2C dan SPI.

Terlepas dari bus mana yang Anda gunakan, Anda harus mempertimbangkan tingkat tegangan sensor Anda dan periferal pihak ketiga. Anda dapat melakukan ini dengan membuat konverter Anda sendiri dengan dua MOSFET (Hanya berjalan satu arah - Ambil / tidak ada perubahan atau turun / tidak ada perubahan; hanya masalah jika Anda perlu menjalankan sensor Anda pada 3.3 dan antarmuka dengan 1.8 dan 5V master). Lihat AN10441 NXP [PDF]. Ini juga akan berfungsi untuk SPI (Hanya menghapus pullups). Anda perlu menambahkan garis ke konektor Anda untuk membuat tegangan referensi (jika Anda belum melakukannya.)

Satu kelemahan dari I2C adalah Anda terbatas pada jam paling lambat di bus. Jika satu sensor hanya mampu 100kHz dan Anda ingin berbicara dengan memori Anda pada 400kHz atau 1MHz (keduanya kecepatan valid), perilaku sensor Anda yang lebih lambat tidak ditentukan. Jika Anda menggunakan SPI, jalur pilih chip berarti bahwa sensor yang lebih lambat bahkan tidak akan mendengarkan apa yang ada di bus, dan Anda dapat menjalankan kecepatan yang berbeda untuk sensor yang berbeda.

Kevin Vermeer
sumber
1

Saya akan menggunakan I2C. Pastikan Anda bisa mendapatkan modul nirkabel yang dapat berkomunikasi melalui I2C jika Anda ingin memilikinya di bus yang sama dengan sensor Anda. Sebagian besar perangkat komunikasi yang saya lihat menggunakan SPI bukan I2C.

mjh2007
sumber