Apakah ada nilai resistansi yang benar untuk resistor pull-up I2C?

72

Lembar data EEPROM 24LC256 menyatakan bahwa:

Bus SDA memerlukan resistor pull-up ke VCC (tipikal 10 kΩ untuk 100 kHz, 2 kΩ untuk 400 kHz dan 1 MHz).

Saya berpikir bahwa setiap resistor dengan nilai kΩ akan melakukan pekerjaan (dan tampaknya EEPROM saya berfungsi dengan baik pada frekuensi yang berbeda dengan resistor 10 kΩ).

Pertanyaan saya adalah:

  • apakah ada nilai yang benar untuk resistor pull-up?
  • Adakah hukum / aturan untuk menentukan nilai ini?
  • bagaimana perbedaan nilai resistansi mempengaruhi bus data I²C?
JonathanD
sumber

Jawaban:

66

Resistan tarikan yang benar untuk bus I 2 C tergantung pada kapasitansi total pada bus dan frekuensi Anda ingin mengoperasikan bus.

Rumus dari lembar data ATmega168 (yang saya yakin berasal dari spesifikasi resmi I 2 C) adalah -

Freq<100kHzRmin=Vcc0.4V3mA,Rmax=1000nsCbus

Freq>100kHzRmin=Vcc0.4V3mA,Rmax=300nsCbus

Microchip 24LC256 menentukan kapasitansi pin maksimum 10pF (yang cukup khas). Hitung jumlah perangkat yang Anda miliki secara paralel di bus dan gunakan rumus di atas untuk menghitung rentang nilai yang akan berfungsi.

Jika Anda mematikan baterai, saya akan menggunakan nilai yang berada di ujung atas kisaran. Jika tidak ada batasan daya pada sumber daya atau masalah disipasi daya di IC, saya akan menggunakan nilai di ujung bawah kisaran.

Saya menjual beberapa kit dengan I 2 C RTC (DS1337). Saya menyertakan resistor 4K7 dalam kit yang sepertinya merupakan kompromi yang masuk akal bagi sebagian besar pengguna.

jluciani
sumber
Biasanya saya akan membayangkan bus menjadi idle (tidak ditegaskan) sebagian besar waktu, jadi untuk aplikasi baterai ada masalah yang lebih penting untuk ditangani daripada mencoba untuk mengoptimalkan pullup I2C begitu saja: P
Nick T
5
Satu-satunya hal yang saya tambahkan adalah buffer di atas kapasitansi dijumlahkan dari perangkat di bus. Jejak itu sendiri serta sambungan solder dari bantalan ke pin juga akan memiliki beberapa impedansi. Pada bus yang lebih panjang, kapasitansi jejak / kabel dapat lebih besar dari kapasitansi pin perangkat. Saat mendesain papan produksi saya biasanya tidak menentukan nilai pull-up akhir sampai saya memiliki prototipe di tangan dan dapat lingkup bus dengan berbagai nilai.
Tandai
14

Masuk akal bahwa frekuensi yang lebih tinggi memerlukan pull-up resistansi yang lebih rendah: resistansi yang lebih rendah akan mengisi / melepaskan kapasitansi kabel lebih cepat, yang menghasilkan tepi yang lebih curam. Dengan pulsa yang lebih luas dari frekuensi yang lebih rendah, tepi yang tidak terlalu curam tidak akan terlalu mempengaruhi bentuk pulsa.

Oleh karena itu spesifikasi I2C memberikan nilai maksimum untuk resistor pull-up sebagai fungsi kapasitansi bus untuk tiga kelas kecepatan:

masukkan deskripsi gambar di sini

Nilai minimum didefinisikan dalam fungsi tegangan bus, dan harus membatasi arus melalui driver.

stevenvh
sumber
3
3 tahun kemudian Texas Instruments menulis catatan aplikasi yang cukup dekat dengan makna jawaban ini.
Nick Alexeev
Artikel EDN: Perhitungan desain untuk komunikasi I2C yang kuat . [Hanya menumpuk bahan referensi.]
Nick Alexeev
11

Ada rentang nilai yang benar, namun sulit untuk menggambarkan dengan tepat kisaran tersebut. Secara umum, 10k berfungsi.

Output digital memiliki kemampuan yang ditentukan untuk sumber atau tenggelam saat ini. Jika output Anda bisa tenggelam 5 mA dan output terhubung melalui pull-up hingga 5 V dan kemudian diatur ke 0, Anda akan memerlukan minimal 1k resistensi. Jika Anda menggunakan kurang dari 1k, output tidak akan dapat menenggelamkan arus yang cukup untuk menarik pin ke 0V. Jika Anda menggunakan nilai yang lebih besar, seperti 10k, maka pin hanya perlu tenggelam 0,5 mA, yang jauh lebih rendah dari peringkatnya.

Input digital memiliki arus bocor yang ditentukan. Ini agak seperti jumlah arus yang diperlukan untuk "mempertahankan" 0 atau 1 pada input. Jika pull-up resistor Anda terlalu besar, maka itu tidak akan dapat mengatasi kebocoran arus. Jika itu hanya mengatasi arus bocor, maka kebisingan di sirkuit bisa cukup untuk mengubah input.

Saat menggunakan output digital yang dapat tenggelam dan sumber arus ("driver tiang totem", "driver push-pull"), Anda mungkin tergoda untuk tidak menggunakan resistor pull-up atau pull-down. Namun, sangat penting bahwa input CMOS tidak boleh mengambang atau mereka dapat menarik arus berlebih ... dan sangat mudah untuk melupakan bahwa pin MCU dua arah biasanya muncul sebagai input!


I2C dan protokol lain seperti itu menggunakan output "open drain" (atau "open collector"). Alih-alih memiliki output yang dapat menarik ke atas dan ke bawah, dan output drain terbuka hanya dapat menarik ke bawah. Karena itulah diperlukan resistor pull-up eksternal. Sekarang ada batasan tambahan pada kisaran resistor pull-up; nilai pull-up akan membentuk sirkuit RC dengan kapasitansi bus. Nilai terlalu kecil sekali lagi akan mencegah driver output dari tenggelam cukup saat ini untuk menarik pin ke 0. Namun, nilai terlalu besar akan memakan waktu terlalu lama untuk mengisi kapasitansi bus.

Jika ada waktu pengaturan / penahanan yang Anda tidak boleh langgar, itu akan membantu Anda menentukan konstanta waktu RC. Kapasitansi bus sebagian besar ditentukan oleh tata letak PCB, sehingga Anda kemudian dapat memilih nilai R yang bergabung dengan C untuk memberikan nilai yang nyaman dalam waktu pengaturan / tahan untuk input digital Anda.

ajs410
sumber
7

Nilai pull-up rendah (resistansi rendah) dapat meningkatkan tepi transisi sinyal tetapi kadang-kadang bisa terlalu kaku - jika perangkat di bus tidak dapat menenggelamkan arus pull-up Anda mendapatkan logika 'rendah' ​​yang tidak terlalu rendah. , yang dapat menyebabkan kesalahan komunikasi (dan banyak rasa sakit.)

Saya akan pergi dengan perlawanan pull-up tertinggi yang memberi Anda komunikasi yang andal.

Adam Lawrence
sumber
5

Untuk frekuensi rendah nilainya tidak terlalu penting, tetapi untuk frekuensi tinggi dapat memiliki efek penyaringan pada sinyal, dalam kombinasi dengan kapasitansi lain di sirkuit, itulah sebabnya mereka merekomendasikan nilai yang berbeda untuk kecepatan yang berbeda.

endolit
sumber
2

Masalah yang belum saya lihat disebutkan adalah konsumsi daya. Jika seseorang menggunakan pasokan 3,3 volt, resistor 3,3K ke ground akan membuang 1mA arus (daya 3,3mW) setiap kali output rendah. Menggunakan resistor 10K akan mengurangi baik arus dan daya dengan faktor tiga. Jika akan ada banyak komunikasi pada bus I2C, bahwa konsumsi daya mungkin berakhir menjadi bagian yang signifikan dari keseluruhan daya terkuras terutama jika bus dapat duduk rendah untuk waktu yang lama. Sebagai contoh, jika seseorang membaca 100 byte / detik tetapi setelah membaca setiap byte bus dibiarkan dengan perangkat mengeluarkan bit pertama dari byte berikutnya, dan sebagian besar dari byte tersebut memiliki MSB yang jelas, bus dapat menghabiskan 90% dari waktu dengan SCL dan SDA rendah. Bergantung pada apa lagi yang dilakukan sistem, itu dapat secara besar-besaran meningkatkan penarikan daya.

Untuk menghemat daya, mungkin ada baiknya jika resistor "pull-up" terhubung ke pin I / O daripada ke VDD. Walaupun saya belum melihat implementasi perangkat keras I2C menawarkan dukungan untuk ini, memiliki data output master pada pin I / O terpisah yang terhubung ke bus melalui resistor daripada menggunakan driver kolektor terbuka dan resistor pull-up tetap akan menghindari membuang-buang arus saat master ingin menampilkan "0". Selain itu, jika master akan meninggalkan SCK rendah untuk sementara waktu tanpa peduli tentang apa yang ada di SDA, master dapat menonaktifkan pull-up sampai siap untuk beberapa komunikasi lagi. Jika tidak ada perangkat yang perlu menggunakan peregangan jam, master hanya dapat menggunakan output langsung untuk SCK dan tidak repot-repot melakukan pull-up pada kabel itu.

Jika seseorang menggunakan bit-banging software dengan prosesor yang cepat, dan yang ingin mendapatkan kinerja yang baik meskipun kapasitansi bus tinggi, pendekatan di atas dapat dikombinasikan dengan penggunaan built-in lemah prosesor. Saat membaca data, nyalakan pull-up yang sangat kuat, secara singkat, segera setelah setiap ujung jatuh SCK, dan kemudian beralih ke pull-up yang lemah. Pull-up yang kuat akan menarik garis tinggi meskipun memiliki kapasitansi, dan begitu garis ditarik tinggi, pull-up yang lemah akan dapat mempertahankannya tetap tinggi. Bahkan jika suatu perangkat akan mengalami kesulitan menarik garis rendah terhadap pull-up yang kuat, itu akan dapat melakukannya begitu pull-up yang kuat dimatikan.

supercat
sumber
-1

Berikut adalah bentuk gelombang, untuk 400kiloBits / detik (bentuk gelombang 200KHz 101010). RC adalah 4.7K ohm dan 212pF. Nilai RC memungkinkan 2 penyelesaian TAU.

masukkan deskripsi gambar di sini

analogsystemsrf
sumber
Jawaban ini salah. Jam 200 kHz menghasilkan 200 kb / dtk, bukan 400. Hanya ujung-ujungnya yang naik dipengaruhi oleh resistance pull-up. Plotnya terlihat membingungkan, hampir seperti ada semacam modulasi yang terjadi. Kuantitas fisik dan unitnya ditulis dengan ruang (atau ruang tipis) di antaranya. Tau adalah simbol, bukan singkatan.
venny
@venny Ini adalah bentuk gelombang khas untuk bus yang berjalan terlalu cepat untuk waktu penyelesaian. Dengan hanya 2 penyelesaian TAU, tidak ada flat-top untuk bentuk gelombang, maka "semacam modulasi"; Jika ini adalah pola pseudo-acak, variabilitas dari settling akan sangat jelas; baca di "data mata". Akhirnya, clock 200KHz memiliki tinggi untuk 2.5uS kemudian rendah untuk 2.5uS; periode 2.5uS persis 400KHz data yang saya sebutkan.
analogsystemsrf