Bisakah saya menggunakan kabel I2C lebih dari 2m?


24

Dalam proyek saya saat ini, saya perlu berkomunikasi antara mikrokontroler dan beberapa sensor melalui I2C. Salah satunya adalah sensor suhu, harus ditempatkan pada jarak 2 meter dari mikrokontroler. Saya tidak bisa memilih protokol lain (sensornya ada pada modul dengan konektor / pin / protokol yang diberikan).

Apakah menurut Anda dimungkinkan untuk berkomunikasi dalam konfigurasi ini? Informasi apa yang harus saya cari untuk memastikan itu bisa atau tidak mungkin? Apakah Anda punya saran?

Ini adalah pertama kalinya saya berkomunikasi dengan IC di luar PCB.


5
Silakan tambahkan informasi lebih lanjut. Berapa kecepatan i2c? Resistensi pull-up? Kabel bekas dan kapasitansinya? Apa MCU tuan rumah dan apa sensornya? Tetapi secara umum, I2C bekerja beberapa meter di atas kabel seperti HDMI sehingga harus bekerja ketika semuanya dilakukan dengan benar.
Justme


6
"Saya tidak dapat memilih protokol lain" Anda dapat meletakkan mikrokontroler kedua di dekat sensor, membaca data dan mengirimkannya dengan protokol apa pun yang Anda suka.
FooBar

1
Apakah Anda memiliki kecepatan minimum dalam kbit / detik?
Tiang

2
Jika Anda memperlambat jam, Anda bisa menempuh jarak yang cukup jauh.
tembaga.

Jawaban:


36

I2C tidak dirancang untuk digunakan jarak jauh tapi saya tahu beberapa aplikasi di mana sebenarnya digunakan jarak sekitar 2 meter. Saya juga tahu satu kasus di mana mereka memiliki masalah dengan itu dan itu akhirnya diperbaiki dengan memperbaiki loop tanah saya percaya.

Untuk memastikan bahwa itu akan berfungsi, Anda harus menggunakan extender bus I2C seperti P82B715.

Namun, lembar data PB2B715 mengatakan yang berikut di bagian 8.2:

Untuk kabel twisted pair atau flat, seperti yang digunakan untuk kabel telepon atau Ethernet (Cat5e), kapasitansi tersebut berkisar antara 50 pF hingga 70 pF / meter sehingga secara teori kabel tersebut dapat mencapai panjang 50 m . Dari pengalaman praktis, 30 m telah membuktikan panjang kabel yang aman untuk didorong dengan cara sederhana ini, hingga 100 kHz, dengan nilai yang ditunjukkan. Jarak yang lebih jauh dan kecepatan yang lebih tinggi dimungkinkan tetapi membutuhkan desain yang lebih cermat.

Jadi para ahli (NXP adalah mantan Philips, penemu I2C) mengatakan bahwa 30 meter telah terbukti jarak yang bisa dilakukan. Pengalaman saya mengatakan 2 meter adalah jarak yang bisa dilakukan, dan pengalaman yang dilaporkan kembali kepada saya menunjukkan bahwa bus I2C yang lebih berat tanpa ekstender juga dimungkinkan.

Poin-poin penting untuk mengoperasikan bus I2C pada jarak jauh adalah:

  • Menggunakan kabel kapasitansi rendah (twisted-pair / Ethernet);
  • Membatasi kecepatan bus;
  • Memiliki pull-up yang berukuran benar.

Perhitungan pullup

Texas Instruments memiliki catatan aplikasi yang baik (SLVA689) tentang perhitungan pull-up .

  • (3.6 V1 V) / 20 mA=130 Ω
  • Rmax=tr/(0.8473Cb)trCbCbtrRmax=2950 Ω. Catatan aplikasi TI memiliki grafik sehingga Anda dapat menemukan nilai yang sesuai dengan cepat.
  • Tentu saja nilai untuk pullup adalah nilai yang setara dari semua pullup secara paralel digabungkan. Anda mungkin memiliki pullup di ujung master, slave end, dan slave / master lainnya di bus.
  • Semakin Anda "pada batas", semakin Anda juga perlu memperhitungkan "parasitics" seperti penurunan tegangan pada kabel.

Memiliki pull-up yang berukuran benar? Bagaimana cara menentukan nilai dan peringkat daya?
Quantum0xE7

Ketika Nick B mengomentari jawaban lain, berhati-hatilah terhadap kemungkinan chip ekstender bus atau apa pun yang memanaskan sensor suhu beberapa derajat.
Peter Cordes

14

Anda umumnya dibatasi oleh kapasitansi bus maksimum 400 pF.

Ini seharusnya bekerja dengan baik jika Anda menurunkan frekuensi Anda menjadi sekitar 1 kHz dan memberikan decoupling catu daya di sebelah sensor.

Jika Anda membutuhkan sesuatu yang lebih kuat maka Anda dapat menggunakan pengonversi I2C diferensial pada kedua ujungnya seperti PCA9615 .


Saya samar-samar mengingat beberapa sensor yang memiliki frekuensi I2C minimum (tidak yakin mengapa).
Michael

14

Anda bisa, tetapi tidak disarankan.

Bus berbeda untuk tujuan berbeda

I2C, seperti SPI, dirancang untuk komunikasi di dalam dewan atau kelompok dewan (pikirkan Raspberry Pi dan topinya atau arduino dan perisainya). Ini dapat bekerja pada jarak yang lebih jauh (lihat jawaban lain) tetapi tidak boleh digunakan dalam kasus-kasus itu, hanya karena bukan itu yang dirancang, dioptimalkan dan memenuhi syarat untuk.

Risiko yang Anda ambil adalah bahwa Anda mungkin tidak dapat menambahkan lebih banyak sensor di masa depan, atau bahwa sistem Anda tidak akan berfungsi di mana-mana, atau akan gagal dalam keadaan tertentu.

Apa yang seharusnya Anda cari adalah bus lapangan, sesuatu seperti 1-kawat, CAN, RS-485, ethernet, dll.

Sistem nirkabel seperti bluetooth atau zigbee juga bisa menjadi pilihan.


9

Seperti dicatat oleh @filo, I2C umumnya dibatasi oleh kapasitansi bus. Namun, ada cara untuk mengatasi ini:

  1. Gunakan ekstender bus. The P82B96 atau PCA9600 berdua akan pilihan yang baik dalam kasus Anda.
  2. Jika Anda memerlukan kecepatan lebih tinggi atau kabel yang sangat panjang, Anda dapat menggunakan transceiver I2C diferensial seperti PCA9600 . Namun, ini akan membuat sirkuit Anda jauh lebih rumit, dan Anda memerlukan IC di kedua ujung kabel.

Lihatlah AN10658 dan AN11084 dari NXP untuk informasi lebih lanjut.


1
Ini akan berfungsi baik dengan extender bus, seperti yang dikatakan beberapa orang lain. Sesuatu yang tidak segera jelas untuk diperhatikan adalah bahwa ekstender bus di ujung sensor dapat menghilangkan panas yang cukup untuk menaikkan sensor suhu membaca beberapa derajat jika sensor dan extender bus berdekatan.
Nick B

4

Saya suka jawaban filo dan Caleb.

Opsi lain menggunakan satu atau beberapa DS28E17 1-Wire-to-I2C Master Bridges di masing-masing sensor dan memasang bus sebagai Onewire. Ini bagus untuk bus> 100m dan cocok untuk aplikasi larik sensor throughput rendah karena suhu terdistribusi dan manajemen baterai.


Pikiran yang menarik, meskipun mungkin memperkenalkan overhead perangkat lunak tambahan jika master tidak memiliki antarmuka 1-Wire.
Caleb Reister

Ini sebagian besar pilihan jika Anda memiliki host Linux, karena memiliki tumpukan driver penuh untuk aksi ini. Pada Raspberry Pi, Anda hanya perlu menghubungkan GPIO4 ke input 1W dari DS28E17 melalui kabel 100m itu (ditambah tentu saja GND), edit config.txt dan Anda selesai. Ini sepenuhnya transparan, terlihat seperti I²C lokal. Lebih lambat.
Janka

Terima kasih. Saya sangat terkejut bahwa 1-Wire dapat melakukan jarak seperti itu. Saya kira itu masuk akal, karena resistor lebih kecil.
Domen

Onewire tidak bergantung pada timing edge yang naik tetapi sebaliknya, semua timing bit dilakukan sehubungan dengan edge edge, yang secara aktif digerakkan. Itu sebabnya ia kurang rentan terhadap pemuatan kapasitif tinggi. Beberapa nF ok.
Janka
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.