Sinyal I2C dan daya jarak jauh (kabel 10 meter)

9

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.

pengguna3503519
sumber
3
Apakah Anda memeriksa bahwa daya pada sisi penerima cukup baik? Tidak ada gangguan, tidak ada droop ... Kabel CAT5 cukup tipis, itulah mengapa PoE menggunakan daya> 40 V.
Vladimir Cravero
4
Di sinilah Anda membutuhkan osiloskop. Segala sesuatu yang lain akan menjadi tebakan (berpendidikan).
pipa
1
Saya tidak akan memutar SDA atau SCL dengan GND karena Anda tidak ingin ada kapasitansi di antara mereka. Saya akan memutar + 12V dengan GND karena Anda ingin kapasitansi di antara mereka. Apa (pengembalian) arus yang dimiliki + 12V? (Anda mungkin memiliki pentalan darat)
Huisman
5
GND terhubung hanya pada satu ujung kabel? Kecuali saya salah paham, itu kedengarannya tidak benar.
mkeith
1
Apakah maksud Anda kabel UTP ? Saya yakin ini dapat digunakan untuk protokol lebih dari sekedar FTP;)
Andrew Morton

Jawaban:

15

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.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Wesley Lee
sumber
1
Jawaban bagus, ini persis apa yang harus dilakukan, tetapi tentu saja itu mungkin perubahan radikal untuk OP.
Jack Creasey
Maksud saya, mereka super mudah diimplementasikan (jika dibandingkan dengan pindah ke RS-485, CAN, dll), tapi ya dibandingkan dengan mengubah beberapa resistor itu adalah perubahan radikal.
Wesley Lee
1
Masalah @JackCreasey OP bukan hanya kapasitansi kabel, mereka tampaknya menderita kebisingan pada jalur 12V yang telah mereka tambahkan. Menurunkan pull-up resistor memberikan beberapa kekebalan kebisingan tambahan, tetapi mereka tidak dapat terus menurunkan resistansi itu tanpa batas.
Dmitry Grigoryev
@DmitryGrigoryev Karena OP tidak memberikan detail, saya tidak yakin bagaimana Anda bisa menyarankan bahwa kebisingan sedang disuntikkan. Saya setuju Anda tidak bisa terus menurunkan penghentian / pullup .... tetapi OP terlalu besar dengan 10: 1.
Jack Creasey
9

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.

pipa
sumber
10 kΩbukankah itu besar untuk bus I2C pada 10 kHz? (Atau haruskah itu 100 kHz OP?)
Huisman
@ Huisman Dua poin bagus. 10 kOhm tidak akan membuat saya khawatir pada 10 kHz pada PCB normal tapi mungkin itu tidak cukup melalui kabel. Dan 10 kHz tidak biasa tetapi tidak gila, kurasa.
pipa
7
10k Ohm sangat besar untuk I2C pada jarak apa pun. Itu adalah masalah utama OP.
Jack Creasey
1
Saya kira lebih baik untuk membagi resistor dan menggunakan satu di setiap ujungnya. 2 pullup-resistor @ 4.7kΩ, satu di setiap ujung, harus menjadi pilihan yang lebih baik daripada satu pullup-resistor 2.2kΩ.
12431234123412341234123
Saya akan mencoba menurunkan resistor, itu saja yang membuat saya masuk akal setelah semua komentar itu.
user3503519
5

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:

  1. Kapasitansi kabel
  2. Bertujuan tegangan dan tingkat rasa Rx.
  3. Kecepatan

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.

Jack Creasey
sumber
2
Saya setuju, kabel CAT5 dapat diasumsikan memiliki sekitar 50pF per meter sehingga 10 meter melebihi batas kapasitansi 400pF dari spesifikasi I2C. Dan mencapai 400kHz I2C clock tidak dapat dicapai dengan kapasitansi 400pF dengan menggunakan arus pull-up 3mA dari resistor. Untungnya, memperlambat kecepatan akan membantu - kecuali jika perangkat memiliki batasan kecepatan clock minimum. Kita tidak tahu perangkat apa ini dan apa voltase bus I2C tetapi memang pullup harus disesuaikan untuk memberikan setidaknya 3mA dan jika perangkat mengizinkan dan menyetujui bus level tegangan rendah maka bahkan lebih.
Justme
Ya saya akan menguji dengan itu, tetapi pertanyaan saya adalah mengapa itu bekerja jika tidak ada daya pada kabel itu?
user3503519
Sepasang kabel mengambang tidak memiliki kapasitansi yang sama dengan pasangan sinyal Anda saat pasangan kabel dihubungkan ke ground. Untuk konfigurasi Anda, +12 dan Gnd pada dasarnya sama… .mereka memiliki kapasitansi pada kabel sinyal yang memengaruhi risetime Anda. .
Jack Creasey
2

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

Jason Treon
sumber
0

The Sparkfun I2C breakout papan adalah solusi yang bagus bahwa fitur:

PCA9615 buffer
I2C Supply voltage range 2.3-5.5V
Differential Supply voltage range 3-5.5V
draws 16µA of current
Extends I2C bus up to 100 feet
Data rate up to 400kHz
2x Qwiic Connectors

masukkan deskripsi gambar di sini

gatorback
sumber
-1

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.

pengguna3503519
sumber
1
Itu gila. Jenis perangkat keras apa yang Anda gunakan di sini? Mungkin ada sesuatu yang salah konfigurasi.
pipa
1
Di satu sisi itu ESP32 dengan micropython, di sisi lain adalah atmega8 diprogram dengan arduino IDE. Saya akhirnya tidak menganggap itu sebagai komunikasi yang aman, jadi akan beralih ke serial (RS232), karena saya mengujinya berfungsi dengan baik pada rentang tersebut
user3503519
1
Jika saya jadi Anda, saya juga akan melihat RS-485 yang akan menjadi lebih kuat dan lebih sederhana. Kekurangannya adalah membutuhkan lebih banyak kabel sinyal tetapi Anda sudah memiliki banyak kabel CAT5.
pipa
1
Yah, saya tidak melihat bagaimana akan langsung mengimplementasikan RS-485 pada prosesor atmega atau ESP 32 tanpa konverter & perangkat keras tambahan sehingga RS-232 adalah pilihan terbaik di sini. Hanya satu level TTL shifter yang akan digunakan.
user3503519