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.
Kedua jam bekerja dengan baik, salah satunya bekerja selama lebih dari 3 bulan sekarang. Bagaimana mungkin? Bagaimanapun, saya ingin tahu:
Apa yang terjadi ketika pullup I 2 C dihilangkan?
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.h
untuk 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.
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.
Jawaban:
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.
Mungkin tidak. Dalam kasus khusus ini (MCU, RTC, tidak ada yang lain), pasti tidak.
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
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.
sumber
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.
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.
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.
sumber
You do have pull-ups, just not ones you expected.
- Saya kira Anda berhasil. Terima kasih!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.
sumber
Kemungkinan besar, bus I2C tidak akan berfungsi.
Kemungkinan besar tidak.
sumber
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.
sumber
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.
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.
sumber
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
sumber