Apa yang terjadi jika saya menghilangkan resistor pullup pada saluran I2C?

33

Baru saja saya menyadari bahwa data I 2 C dan garis jam (SDA dan SCL) harus memiliki resistor pullup.

Yah, saya telah membangun beberapa jam menggunakan DS1307 RTC (lihat lembar data ) menurut skema di bawah ini. Perhatikan bahwa saya telah menghilangkan kedua resistor pullup.

Skematis jam saya tanpa resistor pullup pada jalur I2C

Kedua jam bekerja dengan baik, salah satunya bekerja selama lebih dari 3 bulan sekarang. Bagaimana mungkin? Bagaimanapun, saya ingin tahu:

  1. Apa yang terjadi ketika pullup I 2 C dihilangkan?

  2. Apakah kekurangan pullups mungkin merusak salah satu dari dua IC di papan saya?

Saya mencari jawaban yang membahas kasus spesifik saya menghubungkan ATmega328P ke DS1307 RTC seperti dalam skema yang saya berikan, tetapi jika pertanyaannya tidak terlalu luas, akan sangat membantu untuk mengetahui apa yang terjadi ketika pullup dihilangkan secara umum , yaitu, dalam skenario lain dari operasi I 2 C.

PS. Saya memang mencari di internet untuk menemukan jawabannya, tetapi bisa saja menemukan artikel tentang penentuan dimensi penarikan.

Pembaruan: Saya menggunakan Arduino IDE 1.03 dan firmware saya menangani RTC menggunakan lib DS1307RTC Arduino (melalui fungsinya RTC.read()dan RTC.write()). Lib itu pada gilirannya digunakan Wire.huntuk berbicara dengan RTC.

Pembaruan 2: Di bawah ini adalah serangkaian pemotretan lingkup yang saya ambil untuk membantu menjelaskan bagaimana I 2 C bekerja tanpa pullup eksternal.

Tembakan ruang lingkup 1 Tembakan ruang lingkup 2

Perbarui 3 (setelah I 2 C pullups ditambahkan): Di bawah ini adalah serangkaian tembakan lingkup yang saya ambil setelah menambahkan resistor pullup yang tepat (4K7) ke garis I 2 C (di papan yang sama). Waktu naik turun dari sekitar 5 μs menjadi 290 ns. I 2 C jauh lebih bahagia sekarang.

Tembakan lingkup 3 Tembakan lingkup 4

Ricardo
sumber
2
Apakah kode Anda menonaktifkan pullup pada pin tersebut?
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Tidak disebutkan secara langsung ke pin SDA dan SCD (18 & 19) dalam kode saya. Saya menangani RTC menggunakan lib DS1307RTC lib Arduino dan fungsinya RTC.read () dan RTC.write ().
Ricardo
Lib itu pada gilirannya menggunakan Wire.h untuk berbicara dengan RTC.
Ricardo
3
Ya, pasti menggunakan pullup internal. Perhatikan kurva bukan tepi yang tajam.
Ignacio Vazquez-Abrams

Jawaban:

28

1) Apa yang terjadi ketika penarikan I2C dihilangkan?

Tidak akan ada komunikasi di bus I 2 C. Sama sekali. MCU tidak akan dapat menghasilkan kondisi awal I 2 C. MCU tidak akan dapat mengirimkan alamat I 2 C.

Ingin tahu mengapa ia bekerja selama 3 bulan? Baca terus.

2) Kurangnya pullup kemungkinan akan merusak salah satu dari dua IC di papan saya?

Mungkin tidak. Dalam kasus khusus ini (MCU, RTC, tidak ada yang lain), pasti tidak.

3) Mengapa MCU dapat berkomunikasi dengan perangkat slave I 2 C? I 2 C membutuhkan resistor pull-up. Tetapi mereka tidak termasuk dalam skema.

Mungkin, Anda memiliki pull-up internal yang diaktifkan pada ATmega. Dari apa yang saya baca 1 , ATmega memiliki pull-up internal 20kΩ, yang dapat diaktifkan atau dinonaktifkan dari firmware. 20kΩ terlalu lemah untuk I 2 C pull-up. Tetapi jika bus memiliki kapasitansi rendah (fisik kecil) dan komunikasi cukup lambat, maka 20kΩ masih dapat membuat bus bekerja. Namun, ini bukan desain yang andal, dibandingkan dengan menggunakan resistor pull-up diskrit.

1 Bukan pria ATmega sendiri.

pembaruan: Sebagai respons I 2 C bentuk gelombang, yang ditambahkan ke OP
Bentuk gelombang dalam OP memiliki konstanta waktu naik yang sangat lama. Inilah bentuk gelombang I 2 C yang biasanya

masukkan deskripsi gambar di sini

PIC18F4550, Vcc = + 5V, tarik 2.2kΩ. Bentuk gelombang menunjukkan SCL. Waktu naik di SDA hampir sama. Ukuran fisik bus adalah moderat: 2 perangkat budak, panjang PCB ≈100mm.

Nick Alexeev
sumber
Terima kasih atas jawaban anda! Ya, ATmega memiliki pullup yang harus diaktifkan dalam kasus saya. Saya akan memeriksa kode dan libs yang saya gunakan dan juga meletakkan papan melalui lingkup. Saya harap itu akan membersihkan sedikit hal.
Ricardo
1
Anda mungkin ingin mengecek dengan lembar data perangkat budak Anda terlebih dahulu. Jika saya ingat benar, pullup pada ATMega dapat berkisar antara 30k-60k (tergantung Vcc, suhu, dan sejumlah faktor lainnya; Anda tidak dapat benar-benar bergantung pada mereka untuk ketahanan yang andal). Anda ingin memastikan Anda mengirimkan arus yang cukup ke budak untuk memastikan logika yang tepat 1. Jika hambatan terlalu besar, perangkat budak Anda tidak akan mendapatkan arus yang cukup dan Anda akan berada di tempat yang sama dengan saat Anda berada di tempat yang sama. sekarang.
audiFanatic
4
@audiFanatic +1. BTW, IMO, termasuk resistor pull-up ke papan breakout dan menginstalnya secara default adalah kesalahan. Bayangkan apa yang terjadi jika seseorang memiliki beberapa papan pelarian pada satu bus I2C. Setiap pull-up biasanya 2.2kΩ atau lebih. Resistor pull-up pada semua papan keluar muncul secara paralel. Pull-up kombinasi menjadi terlalu kaku untuk I2C. [Lebih lanjut tentang masalah potensial ini di sini dan di sini .]
Nick Alexeev
2
@ Ricardo Itu bukan bus I2C bahagia pada tembakan lingkup Anda [set tembakan lingkup pertama di OP]. Saya telah menambahkan cakupan shot untuk jawaban saya juga.
Nick Alexeev
3
Artikel ini memiliki beberapa bentuk gelombang sinyal i2c baik dan buruk: dsscircuits.com/index.php/articles/…
ford
16

Perpustakaan yang Anda gunakan, dan perpustakaan itu tergantung pada (Kawat), memungkinkan pull-up internal ATMega. Ini adalah pull-up yang lemah, dan dalam penggunaan normal, menambah semua pull-up eksternal (dua resistor secara paralel). Karena resistansi yang relatif tinggi dari 20k hingga 70k, mereka tidak menyebabkan banyak jika ada masalah dengan yang eksternal digunakan.

Apa yang terjadi ketika pullup I2C dihilangkan?

Sekarang tanpa resistor eksternal, pull-up internal yang lemah adalah satu-satunya yang mendorong garis tinggi. Tergantung pada tata letak papan Anda, kecepatan jalur i2c Anda, seberapa sering Anda mengaksesnya, interferensi eksternal, dll, mereka mungkin berfungsi, mereka mungkin tidak. Anda beruntung. Anda memang memiliki pull-up, tidak hanya yang Anda harapkan.

Kurangnya pullup cenderung merusak salah satu dari dua IC di papan saya?

Bahkan tanpa internal pull-up, kurangnya pull-up tidak akan merusak IC. Bentuk internal perangkat i2c, SCl dan garis SDA seperti transistor NPN. Mereka adalah Open Collector , yang pada dasarnya dikendalikan / diaktifkan dioda.

Namun, hal terakhir yang perlu diperhatikan, ketika internal pull-up diaktifkan, ketika ATMega Anda berada pada 5v, dan perangkat i2c adalah perangkat hanya 3.3v, dapat menyebabkan masalah. Atau jika Anda memiliki pull-up internal, dan resistor eksternal terhubung ke tegangan 3.3V atau lainnya, juga dapat menyebabkan masalah. Pada dasarnya, ini adalah bug yang sengaja diabaikan di perpustakaan Wire.

Pejalan kaki
sumber
4
+1 - You do have pull-ups, just not ones you expected.- Saya kira Anda berhasil. Terima kasih!
Ricardo
Asal tahu saja, saya telah menambahkan beberapa bidikan lingkup untuk membantu memperjelas apa yang terjadi dengan pengaturan saya.
Ricardo
2
@ Ricardo ya, melihat itu, pada 33khz. Sepertiga dari kecepatan spec ied i2c terendah, dan sinyalnya masih sangat buruk. Pada 100khz atau 400khz, Anda tidak akan memiliki komunikasi yang berfungsi. Hebatnya, banyak perangkat i2c bekerja di sebagian kecil dari kecepatan maks. Ingat saja, pullup internal bisa mencapai 70k ohm, resistor i2c tipikal adalah 4.7k
Passerby
8

Secara umum Anda harus memiliki resistor pullup untuk rangkaian antarmuka I 2 C. Jika antarmuka benar-benar spec I 2 C penuh pada kedua ujung kabel maka garis sinyal tanpa resistor tidak akan pernah bisa pergi ke level tinggi. Mereka mungkin tetap rendah atau pergi ke tingkat menengah yang ditentukan oleh arus bocor di bagian-bagian di setiap ujung. Alasan untuk ini adalah karena benar I 2 C adalah bus saluran terbuka.

Beberapa perangkat mungkin memiliki resistor pull-chip pada kisaran 20K hingga 100K ohm hanya untuk menahan pin antarmuka pada tingkat tidak aktif yang tinggi ketika antarmuka I 2 C pada bagian tersebut tidak digunakan. Untuk antarmuka yang sederhana dan pendek, resistor pullup ini mungkin cukup untuk menyediakan arus yang diperlukan untuk menarik garis tinggi ketika jam dan / atau data sedang diisyaratkan.

Sulit untuk mengatakan dari skema Anda tetapi dalam beberapa kasus I 2 C antarmuka diimplementasikan menggunakan pin port I / O tujuan umum dan kemudian sedikit menggedor perangkat lunak. Kadang-kadang implementer mungkin tidak mengoperasikan pin I / O dalam konfigurasi ini menggunakan metodologi drain terbuka dan ini mungkin memainkan faktor mengapa antarmuka tanpa resistor pullup tampaknya berfungsi.

Pada akhirnya, Anda mungkin berhutang pada diri sendiri untuk memeriksa pensinyalan pada salah satu jam Anda sebelumnya menggunakan osiloskop untuk melihat apakah angka 1 dan 0 pada antarmuka bekerja dalam level tegangan tertentu. Maka Anda akan tahu pasti apakah Anda hanya sangat beruntung dengan implementasi itu atau jika salah satu faktor yang saya sebutkan di atas berperan.

Michael Karas
sumber
4

Apa yang terjadi ketika penarikan I2C dihentikan?

Kemungkinan besar, bus I2C tidak akan berfungsi.

Kurangnya pullup cenderung merusak salah satu dari dua IC di papan saya?

Kemungkinan besar tidak.

Foton
sumber
3

Saluran I2C Anda tidak akan berfungsi sama sekali. Jika saya tidak salah, I2C hanya menegaskan sinyal rendah, tetapi tidak mengembalikannya ke keadaan tinggi, itulah sebabnya Anda memerlukan resistor tersebut.

Kurangnya pull-up seharusnya tidak merusak IC.

Funkyguy
sumber
Pin I2C adalah saluran terbuka.
Matt Young
1

I2C adalah protokol TTL-logika; sehingga data dan garis waktu Anda terbuka. Dengan kata lain, perangkat keras I2C hanya dapat membuat garis-garis ini rendah; mereka dibiarkan mengambang ketika bukan nol. Di situlah resistor pull-up masuk. Ini adalah diagram yang disederhanakan, tetapi bekerja dengan saya sebentar.

skema

mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab


Seperti yang dapat Anda lihat; resistor pull-up diperlukan untuk memastikan logika 1 terlihat pada output ketika logika TTL tidak menggerakkan output rendah. Logika TTL tidak dapat mengarahkan garis-garis tinggi seperti yang telah saya sebutkan. Jika ini tidak ada, output akan dibiarkan mengambang dan tidak dapat diprediksi apa yang Anda lihat di output (untuk semua yang Anda tahu, microwave Anda atau gangguan fungsi usus dari rekan kerja Anda yang disebabkan oleh beruang bergetah bebas gula tertentu dapat menyebabkan nilai berfluktuasi).

Sekarang, jika Anda menerapkan I2C dalam perangkat lunak dengan mikrokontroler, ini kemungkinan tidak akan terlalu menjadi masalah karena kemungkinan besar akan menggunakan logika CMOS, yang dapat mendorong output baik tinggi atau rendah.

audiFanatic
sumber
1
Senang itu membantu.
audiFanatic
2
Apakah perangkat menggunakan logika TTL atau CMOS tidak masalah - TTL normal dan output CMOS normal akan menarik sinyal naik dan turun. Sinyal I2C adalah open-collector TTL, atau (lebih mungkin) open-drain CMOS - dalam kedua kasus, transistor yang akan menarik sinyal tinggi hilang dari tahap output sumber, sehingga resistor pull-up diperlukan untuk tarik sinyalnya tinggi. Ada kemungkinan bahwa mikrokontroler memiliki internal pull-up pada pint tersebut.
Peter Bennett
3
-1 Seperti yang dikatakan Peter Bennett, banyak jawaban ini salah. Memanggil sinyal TTL "saluran terbuka" adalah hadiahnya.
Joe Hass
Perhatikan bahwa ada keuntungan melakukan I2C dengan TTL, yaitu Anda sering tidak membutuhkan penerjemah level untuk menangani komponen dengan voltase pasokan berbeda yang terpasang pada bus yang sama. Cukup dengan mengatur tegangan pullup ke tegangan input penerimaan tertinggi dari chip tegangan terendah sudah cukup banyak dengan tahapan input TTL . Pada CMOS, itu tidak akan berhasil.
Ben Voigt
@ BenVoigt: Tidak - memanggil "memerlukan resistor pull-up" konfigurasi "TTL" salah, karena pengaturan ini dapat dibuat dengan CMOS atau TTL, dan DS1307 adalah bagian CMOS. Lembar data Maxim dengan jelas menyatakan bahwa output adalah saluran terbuka, dan diagram blok menunjukkan FET untuk satu output.
Peter Bennett
0

Ketika saya menggigit bang I2C dengan mikro sebagai master yang memasok jam maka saya sudah bisa menggerakkan SCL tanpa pullup.

Namun, SDA tidak perlu OC dengan pullup sehingga perangkat slave dapat menarik ke bawah dan merespons dengan benar.

Salam

Wayne
sumber