Setelah beberapa membaca / pengujian saya berhasil membuat komunikasi yang stabil antara 2 perangkat menggunakan I2C dengan kabel twisted pair tembaga CAT5 FTP.
- Kabel hijau - SCL
- Kabel putih / hijau - GND
- Kabel biru - SDA
- Kabel putih / biru - GND
GND terhubung hanya pada satu ujung kabel, jam bus I2C pada 10KHz dan saya telah menggunakan resistor pullup 10Kom ke VCC
Ini bekerja dengan baik dan stabil. Ketika saya memutuskan untuk menggunakan 2 pasang kabel lainnya untuk daya (+ 12V), kabel itu berhenti bekerja. Saya menguji + 12V pada satu pasangan GND pada pasangan lainnya, juga + 12V / GND pada pasangan yang sama: hasil yang sama, berhenti bekerja. Seluruh bus I2C berhenti bekerja, perangkat lain yang terhubung dengannya juga.
Bertanya-tanya apakah saya dapat menggunakan kabel yang sama atau pergi ke pilihan paling aman - kabel lain untuk daya.
Jawaban:
Mungkin berlebihan jika bekerja sebelumnya, tetapi pilihannya adalah dengan menggunakan konverter I2C ke Diferensial seperti PCA9615 , LTC4331 , dll. Jika membuat resistor lebih kecil tidak berfungsi atau Anda perlu memperpanjang kabel, pertimbangkan untuk tidak menggunakan I2C secara langsung.
Tidak hanya rentang akan diperpanjang tetapi Anda juga akan memiliki kekebalan kebisingan yang lebih baik.
sumber
Seperti yang saya catat dalam komentar, sulit untuk melakukan debug tanpa jejak osiloskop, tetapi hal pertama yang menonjol dari pertanyaan Anda adalah resistor pull-up 10 kOhm. Ini sangat tinggi untuk I2C, meskipun bisa dengan mudah bekerja dalam banyak kasus.
Saya akan mencoba menurunkannya menjadi 1 kOhm dulu, untuk melihat apakah itu akan mempengaruhi apa pun. Jika itu membantu, Anda dapat secara bertahap membuatnya lebih tinggi, meskipun hal itu akan berdampak pada kenaikan waktu Anda.
sumber
Anda benar-benar harus menjatuhkan resistor pullup Anda pada jarak yang jauh, dan 10m adalah jalan yang panjang dan 10k Ohm sangat tinggi.
Nilai resistor pullup terkait dengan tiga hal:
Coba gunakan salah satu kalkulator yang tersedia dan mulai membaca Anda di sini dengan TI appnote pada nilai pullup atau di sini dengan standar NXP I2C (7.1).
Dalam hal masalah yang Anda alami, harus jelas bahwa menghubungkan pasangan tambahan (12V, Gnd) pada kabel akan mengubah kapasitansi ke kabel sinyal I2C.
sumber
Beberapa catatan:
Mendapatkan nilai tarikan yang tepat sangat penting, terutama untuk SDA. Perangkat yang berbeda dapat menenggelamkan jumlah arus yang berbeda. Saya telah melihat setup yang menghasilkan 1s ekstra dalam data karena resistor pull-up yang terlalu kecil, setelah beralih ke chip sensor yang lebih kecil. Geometri yang lebih kecil berarti itu tidak bisa menarik bus ke nol bersih.
Kecepatan membunuh. Jangka panjang kabel secara efektif merupakan filter LRC low pass. Untuk banyak aplikasi I2C, Anda dapat memperlambat jam tanpa kehilangan apa pun. Jam yang lebih lambat dapat mengimbangi pull-up yang lemah dan kapasitansi yang besar (tetapi bukan pull-up yang terlalu kuat).
Kabel panjang adalah undangan untuk EMI. Saya telah melihat implementasi I2C yang membutuhkan penjepit ferit untuk lulus pengujian kekebalan. Pengakhiran akhir, kabel berpelindung, atau filter dapat membantu.
Waspadai resistensi paralel. Jika Anda memiliki 1k pull-up di master, dan kemudian 1k di masing-masing dari empat perangkat klien di bus, maka Anda memiliki net 200 Ohm. Tidak akan bekerja
sumber
The Sparkfun I2C breakout papan adalah solusi yang bagus bahwa fitur:
sumber
Pertama: Saya ingin berterima kasih kepada komunitas karena mengirim jawaban.
Kedua: Saya telah menemukan solusi berdasarkan jawaban-jawaban itu, inilah yang telah saya lakukan:
Diuji menurunkan resistor pullup ke 4.7K dan 2K. Pada 2K saya mulai menerima tanggapan dari waktu ke waktu, jadi saya turun ke 1K, kemudian saya mulai menerima tanggapan, tetapi sebagian data hilang dari setiap satu dari mereka. Setelah itu saklar pullup resistor pada pin SDA dengan 10K dan semuanya mulai bekerja dengan stabil.
Jadi solusi dalam kasus saya adalah 1K penarikan pada SCL dan 10K pada SDA.
Terima kasih atas waktu Anda.
sumber