I2C hanya berfungsi ketika diselidiki atau dimuat dengan 1Mohm

9

Saya mencoba memecahkan masalah komunikasi antara msp430fr5847 (master) dan sensor slave dengan chip I2C yang tidak diketahui (bagian dari sensor industri)

Saya mengalami masalah dengan kumpulan sensor baru di mana data saya dikembalikan dengan semua nol, namun ketika mencoba memecahkan masalah dengan logika Saleae pro saya (2Mohm, 10pf), atau osiloskop saya (10Mohm, 50pf) sistem bekerja dengan sempurna ketika menyelidiki pin SDA.

Pemecahan masalah lebih lanjut rangkaian bekerja dengan benar jika saya menambahkan resistor 1Mohm antara SDA dan ground, tetapi tidak berfungsi jika hanya menambahkan kapasitor 10pf atau 100pf.

Saya menggunakan resistor menarik 4.7k ke rel 3.3V saya.

Apa yang bisa menyebabkan masalah ini, dan apa yang bisa dilakukan untuk memecahkan masalah tanpa memperbaiki masalah secara tidak sengaja.


EDIT: 19/07/2017 Ini adalah jejak cepat dari sinyal saya.

Hal lain yang saya lupa sebutkan adalah bahwa hanya menyelidik SDA menyebabkan papan untuk bekerja, memeriksa SCL atau jalur interupsi saya tidak membuatnya berfungsi dengan benar.

Jejak lingkup SDA dan SCL


EDIT: 21/07/2017

Plot mengental, tampaknya menghubungkan osiloskop yang berbeda tidak membuat sirkuit berfungsi dengan benar, dan dapat dilihat bahwa satu-satunya perbedaan adalah bahwa ACK tidak sedang dikirim.

Gambar ruang lingkup baru

Pada gambar di atas, jejak biru dan hijau adalah SCL dan SDA saat sirkuit tidak beroperasi dengan benar. Jejak kuning dan merah muda berasal dari ketika saya juga menghubungkan logika Saleae saya ke SDA Pin dan ground tetapi tanpa mencolokkan USB (mencoba untuk menghindari loop tanah).

Untuk menambahkan sedikit lebih banyak latar belakang pada sensor, ini adalah sensor tekanan industri yang kami beli dari pabrikan. Kami sebelumnya telah merancang dan menguji PCB ini dengan sensor pertama kami. Kami baru saja menerima kumpulan baru dan sekarang sedang menghadapi masalah ini. Saya telah melakukan sedikit penyelidikan dan saya sangat curiga (setelah googling kalimat yang terlihat unik dari datasheet) yang secara internal sensor menggunakan ZSC31014 atau serupa, datasheet PDF DI SINI


EDIT: 26/07/2017

Jadi semoga angsuran terakhir dalam memecahkan masalah ini, sesuai jawaban rinci SamGibson saya telah menerapkan perbaikan pengaturan bit alamat yang tinggi untuk menutupi glitching pada akhir bit awal.

Ini sebagian besar berfungsi dengan data yang masuk seperti yang diharapkan, namun sekarang tampak bahwa di dalam perintah baca pertama setelah penulisan (jika itu adalah istilah yang benar untuk sekelompok bit i2c), budak mencoba untuk ACK satu bit lebih awal (dalam posisi bit tulis). Saya dapat mengatakan bahwa itu adalah budak yang menarik garis ke bawah dengan menambahkan resistor kecil (47 ohm) secara seri dengan Garis SDA.

Saya biasanya akan memulai ini sebagai pertanyaan baru tetapi ketika saya melampirkan ruang lingkup yang sama yang tidak berpengaruh dalam pemecahan masalah di atas, masalah ini tampaknya hilang, ini benar-benar tampaknya menjadi masalah batas bahkan jika saya melampirkan probe lingkup, tanpa menghubungkannya ke ruang lingkup masalah terpecahkan, jadi saya berasumsi ini adalah masalah kapasitansi.

Plot masalah tanpa lingkup terlampir

Plot tanpa ruang lingkup

Plot masalah dengan probe lingkup terpasang, tetapi tidak terpasang pada lingkup, mencatat tegangan yang sedikit lebih tinggi ketika budak menarik bit tulis daripada bit ACK.

Dengan cakupan terlampir

Hugoagogo
sumber
1
Apakah Anda memiliki jejak ruang lingkup
Kevin White
1
Sudahkah Anda secara tidak sengaja membalikkan sinyal jam Anda?
Andy alias
6
Konfirmasikan bahwa bus I2C memiliki, dan menggunakan, kabel arde bersama (MSP ke sensor I2C). Diperlukan 3 kabel: SDA, SCL, dan GND, dengan SDA & SCL ditarik ke Vcc (mungkin kabel ke-4) melalui resistor pull-up.
Chris Knudsen
1
@Hugoagogo - Astaga! Baik SDA & SCL tidak normal, dengan cara yang berbeda. Saya berasumsi bahwa jejak adalah dengan sensor gagal baru ? Jika demikian, dapatkah Anda menyediakan jejak dengan sensor lama yang berfungsi ? Mungkin perbedaannya mungkin tidak terlalu besar yaitu Anda memiliki masalah sebelumnya, tetapi itu hanya berhasil. Info latar belakang lainnya mungkin mengungkapkan data yang berguna misalnya Bagaimana Anda tahu ini adalah chip I2C "baru", mengingat chip tersebut "tidak dikenal"? Saya menduga beberapa rekayasa balik dilakukan untuk memungkinkan MSP430 (yang Anda kontrol?) Untuk digunakan dengan sensor (yang tidak Anda kontrol?). Seberapa berbeda dengan konfigurasi "asli"?
SamGibson
1
Ya, saya setuju dengan SamGibson. Saya tidak akan begitu cepat mengatakan bahwa paku adalah kesalahan pengukuran. Saya pikir Anda harus mencoba untuk meneliti sedikit lebih jauh dan mencoba menghilangkannya, jika mereka datang dari pengaturan pengukuran Anda atau menemukan alasan mengapa mereka ada di sana. Bagaimanapun, mereka tampaknya disejajarkan dengan tepi jatuh SCL. Saya juga akan mencoba menghubungkan sensor langsung pada PCB. Itu bisa membantu Anda mengesampingkan masalah yang disebabkan oleh kabel atau jarak sensor dari papan utama.
nickagian

Jawaban:

11

Saya pikir saya sudah menemukan jawabannya. Ternyata ini adalah masalah yang diketahui, tetapi saya hanya menemukan bahwa setelah saya memutuskan di mana masalahnya, dan mencari itu!

Ini adalah proses yang saya lalui, sehingga Anda bisa mengikutinya (dan, jika perlu, Anda bisa menyesuaikan investigasi Anda jika Anda melihat hasil yang berbeda dari asumsi saya). Intinya adalah bahwa tampaknya ada ketidakcocokan antara (setidaknya beberapa) perilaku MSP430 I²C, dan perilaku I²C yang diperlukan oleh perangkat yang Anda curigai sebagai Slave I²C, IDT ZSC31014 . Memiliki lembar data untuk perangkat itu sangat penting untuk memahami hal ini, jadi terima kasih telah menemukannya.

Berita baiknya adalah ada (setidaknya) 2 solusi untuk masalah ini, yang akan saya jelaskan di bagian akhir.

Plot mengental, tampaknya menghubungkan osiloskop yang berbeda tidak membuat sirkuit berfungsi dengan benar, dan dapat dilihat bahwa satu-satunya perbedaan adalah bahwa ACK tidak sedang dikirim.

Jejak baru sangat membantu, terima kasih, meskipun saya menafsirkannya sedikit berbeda.

(Undershoot sinyal SCL, yang membuat saya khawatir pada jejak awal, masih ada pada jejak terbaru. Sangat menarik bahwa undershoot pada SCL tampaknya lebih besar daripada undershoot pada SDA, terutama mengingat skala vertikal yang berbeda antara sinyal SCL dan SDA pada jejak terbaru. Saya masih akan menyarankan untuk menyelidiki bahwa undershoot SCL pada akhirnya, tapi saya tidak percaya itu terkait dengan masalah utama.)

Ada dua "gangguan" di SDA:

  • Glitch tepat sebelum atau sesaat setelah pulsa ACK tidak jarang, ketika Master I²C melepaskan kontrol SDA untuk memungkinkan Slave untuk melakukan ACK dan kemudian Master mungkin kembali drive SDA lagi. Karena itu saya mengabaikan yang itu.

  • Ini adalah kesalahan SDA awal , sebelum denyut SCL pertama, yang lebih tidak biasa. Dari amplitudo kesalahan SDA awal (lihat nanti) dan fakta itu terjadi hanya sebelum pulsa SCL pertama (berlabel 0), tetapi tidak terjadi sebelum pulsa SCL nanti di mana kita akan dapat melihat kesalahan pada SDA (seperti SCL pulsa berlabel 4, 5, 6 atau 7), kita tahu itu bukan artefak pengukuran, atau kopling dari SCL (misalnya).

(Untuk referensi kemudian, kesalahan SDA awal terlihat seperti setidaknya 2V dalam jejak terbaru, sehingga dengan Vdd pada 3.6V dari komentar sebelumnya, yang membuat amplitudo kesalahan SDA setidaknya (2 / 3.6) = 0,55 x Vdd. Bandingkan dengan ambang batas tingkat logika I2C yang relevan dibahas nanti.)

Mengabaikan perbedaan ACK, saya percaya saya melihat perbedaan lain antara dua set jejak di screenshot kedua. Amplitudo kesalahan SDA awal itu tampak sedikit berbeda, membandingkan jejak SDA atas berlabel C1(kuning-ish?) Dan jejak SDA ke-2 berlabel M3(biru). Saya sekarang percaya bahwa perbedaan amplitudo dari kesalahan SDA awal, adalah apa yang dapat menyebabkan masalah Anda muncul atau menghilang, seperti yang saya jelaskan di bawah ini.

Bahkan lebih banyak resolusi secara khusus tentang kesalahan akan membantu (itu adalah salah satu masalah dalam mencoba mengatasi masalah "jarak jauh" - Saya tidak dapat mengoperasikan lingkup 'sendiri!). Saya akan berasumsi bahwa ketika Anda memperbesar, sepertinya awal dari logika I²C normal "1" (yaitu kurva RC di tepi naik, terutama jika Anda sementara membuat pull-up lebih lemah misalnya 10k) kecuali itu tidak t mencapai tegangan positif penuh sebelum didorong ke logika "0" lagi. Itulah yang ditampilkan di halaman web lain yang ditautkan nanti. Jika Anda melihat bentuk berbeda untuk kesalahan Anda, maka analisis saya nanti mungkin tidak berlaku.

Master I²C mengendalikan bus pada titik kesalahan itu, antara I²C Start dan pulsa clock SCL pertama (yang telah Anda beri label "0" meskipun MSbit). Itu membuat saya curiga terhadap perilaku MSP430, meskipun dengan SCL rendah pada saat itu, kesalahan SDA seharusnya tidak mempengaruhi perangkat yang sesuai dengan I²C, karena mereka akan menunggu SCL untuk naik tinggi sebelum mereka selanjutnya membaca keadaan SDA.

Jadi, apakah I²C Slave benar - benar sesuai dengan I²C? Ternyata, ZSC31014 adalah " cerewet " dan kurang toleran daripada beberapa perangkat I²C lainnya, tepat pada saat saya percaya MSP430 menghasilkan kesalahan itu!

The ZSC31014 datasheet daftar 3 daerah di mana mereka mengakui perilaku I²C perangkat adalah "berbeda". Anda mungkin juga dipengaruhi oleh dua yang pertama dalam daftar ini di waktu lain (itu bukan bagian dari analisis ini), tetapi itu adalah poin ketiga yang saya tandai di bawah ini dengan warna merah, yang terkait dengan kesalahan SDA awal:


ekstrak dari lembar data ZSC31014


Amplitudo kesalahan SDA awal itu sangat penting . Jika kesalahan itu tidak naik cukup untuk dikenali oleh ZSC31014 sebagai logika "1" sebelum jatuh lagi, maka Anda OK - perangkat harus melihat ujung yang jatuh pada SDA untuk melanggar "aturan" itu dan hanya dapat a jatuh tepi jika telah diakui sebagai logika "1".

Apa pun yang mempengaruhi amplitudo dari kesalahan SDA itu, seperti beban tambahan 'lingkup atau penganalisa logika pada sinyal SDA, mungkin cukup untuk menghentikan kesalahan yang dikenali oleh ZSC31014 sebagai mencapai logika "1" dan karena itu tidak ada "jatuh" Tepi SDA ", titik ketiga dalam daftar, dapat terjadi (pada hari yang baik, tergantung pada voltase, suhu, dll.). Namun, seperti yang Anda temukan, variasi antara osiloskop yang berbeda sudah cukup untuk berarti bahwa beberapa dari mereka menambah beban yang cukup untuk menghentikan masalah, dan yang lain tidak. Pengaturan ini harus sangat marjinal!

Ini menegaskan kekhawatiran saya bahwa kumpulan sensor Anda yang "berfungsi" sebelumnya, mungkin "hanya" bekerja, karena MSP430 MCU pada pengaturan "yang berfungsi" kemungkinan besar juga akan menghasilkan gangguan SDA. Teori saya tentang perbedaan yang mungkin antara kumpulan sensor, yang dapat menjelaskan perilaku berbeda yang telah Anda laporkan (kumpulan "bekerja" vs. kumpulan "tidak bekerja") dijelaskan selanjutnya.

Menariknya, ZSC31014 berbeda dari standar I²C di area lain yang tidak disebutkan pada daftar dari pabrikan, dan ini bisa menjelaskan mengapa Anda tampaknya melihat perbedaan antara kumpulan sensor.

Ambang logika standar I²C adalah (disederhanakan) - di bawah 0,3 x Vdd untuk logika "0", dan di atas 0,7 x Vdd untuk logika "1" seperti yang ditunjukkan dalam spesifikasi I²C :


ambang batas tingkat logika dari spesifikasi I2C


Namun ZSC31014 memiliki ambang yang berbeda , 0,2 x Vdd dan 0,8 x Vdd, yang berarti bahwa "wilayah tidak terdefinisi" antara ambang tersebut lebih besar daripada perangkat I²C khas:


ambang tingkat logika dari lembar data ZSC31014


Yang lebih besar "wilayah terdefinisi" meningkatkan kemungkinan kesalahan yang memasuki area level tegangan undefined, mana mungkin diakui sebagai logika "1" (ingat, apa pun di atas 0,2 x Vdd bisa diakui oleh ZSC31014 sebagai logika "1" , karena di wilayah yang tidak ditentukan, apa pun diizinkan - hanya di atas 0,8 x Vdd ketika harus diakui sebagai logika "1"). Dan, seperti yang dijelaskan sebelumnya, jika kesalahan diakui oleh ZSC31014 telah mencapai logika "1", maka ketika itu jatuh lagi ke logika "0", Anda telah melanggar "aturan" yang ditandai dengan warna merah untuk perilaku I²C yang diperlukan oleh ZSC31014.

Karena pengenalan level logika dalam wilayah tegangan "tidak terdefinisi" tidak ditentukan, produsen sensor tidak melanggar spesifikasi jika mereka membuat satu batch yang mengenali logika "1" hanya ketika mencapai 0,7 x Vdd, tetapi membuat batch lain yang mengenali logika "1" serendah 0,4 x Vdd, misalnya. Batch kedua hipotetis akan lebih cenderung melihat kesalahan SDA sebagai tepi SDA jatuh, melanggar titik ketiga dalam daftar mereka, namun tidak melanggar spesifikasi mereka.

(Banyak masalah yang telah saya kerjakan, selama bertahun-tahun, adalah seperti ini: Ada dua perangkat, yang tidak satu pun yang secara individual melanggar spesifikasi yang memiliki celah - tetapi satu rewel dan kurang toleran, pada titik di mana satu lagi perlu perangkat yang terhubung menjadi lebih toleran karena yang perilaku jelas! masing-masing kedua perangkat baik-baik saja berinteraksi dengan mayoritas perangkat lain, tetapi tidak dapat diandalkan (atau benar-benar gagal) ketika terhubung satu sama lain.)

Jadi apa yang bisa kamu lakukan? Saya memikirkan dua opsi:

  • Jangan gunakan MSP430 - gunakan MCU lain yang tidak membuat kesalahan SDA awal. Namun saya berharap Anda telah menginvestasikan banyak waktu dalam perangkat lunak dan tidak ingin port kode ke MCU lain, jika itu bisa dihindari.

  • "Bit-bang" protokol I²C pada MSP430, alih-alih menggunakan modul perangkat keras I²C bawaannya. Dengan begitu, Anda memegang kendali penuh atas sinyal I²C dan dapat mencegah terjadinya kesalahan itu. Namun, itu jelas merupakan pekerjaan untuk membuat rutinitas I²C Anda sendiri, men-debug-nya, dan kode yang dihasilkan mungkin lebih besar daripada ketika menggunakan modul perangkat keras MSP430 I²C, yang dengan sendirinya bisa menjadi masalah jika Anda kekurangan ruang Flash.

Kemudian saya pergi mencari masalah MSP430 I²C, dan saya menemukan bahwa kombinasi MSP430 + ZSC31014 ini adalah masalah yang diketahui, karena kesalahan SDA awal dari MSP430! Lihat utas ini di forum TI E2E MSP430:

Forum TI E2E: pulsa kesalahan MSP430 I2C menyebabkan masalah bagi chip periferal I2C

Solusi yang disebutkan di sana, adalah mengubah alamat ZSC31014 I²C sehingga SDA tinggi pada saat kesalahan positif dapat terjadi, dan karena SDA dibuat tinggi maka, tidak ada kesalahan aktual pada SDA:

Solusi kami adalah mengonfigurasi chip ZSC agar memiliki alamat dengan set bit 6 (mis. Kami sekarang menggunakan 0x42) - ini mengubah pulsa kesalahan menjadi bit "tinggi" bersih yang bagus untuk durasi bit alamat 6, yang menghilangkan dari ujung jatuh bermasalah.

Solusi yang sama secara efektif adalah kebalikan dari saran di lembar data ZSC31014, di kotak merah yang saya tandai. Mereka mengatakan kesalahan SDA harus dicegah jika bit pertama (yang merupakan MSbit) dari alamat ZSC31014 I²C adalah 0 - jadi jangan buat MSbit dari alamat I²C menjadi "0", jadikan "1" sebagai gantinya yaitu atur bit 6 di alamat I²C 7-bit!

Karena utas forum TI E2E dan lembar data ZSC31014 keduanya berfokus pada alamat I²C, maka mungkin kesalahan SDA tidak terjadi, atau tidak menjadi masalah jika itu terjadi, selama pengiriman data lain di bus. Anda perlu menyelidiki itu.

Oleh karena itu, mengabaikan solusi pertama menggunakan MCU yang berbeda, dua solusi (lebih praktis) adalah:

  • Bit-bang MSP430 I²C bus dengan menulis kode Anda sendiri, sehingga Anda tidak membuat kesalahan itu di SDA, atau
  • Ubah alamat ZSC31014 I²C sehingga bit 6 dari alamat 7-bitnya ditetapkan, yang berarti bahwa SDA sudah tinggi ketika kesalahan akan terjadi, jadi tidak ada kesalahan yang sebenarnya terjadi pada SDA ketika ZSC31014 ditangani (dengan asumsi bahwa kesalahan SDA baik tidak terjadi setelah I²C lainnya Memulai acara selama transfer data, atau jika ada yang terjadi, bahwa ZSC31014 tidak mendapatkan "kesal").

Semoga itu bisa membantu!

SamGibson
sumber
2
Ini adalah jawaban yang luar biasa dan sangat membantu, sebelum saya tandai sebagai diterima apakah ada cara saya bisa memberi Anda lebih banyak perwakilan untuk tetap menggunakannya melalui pemecahan masalah. Saya juga akan memperbarui pertanyaan saya dengan solusi saya ketika saya menyelesaikannya.
Hugoagogo
1
@Hugo - Itu pemikiran yang sangat baik :-) Saya percaya itu bisa dilakukan dengan menawarkan hadiah di mana alasan hadiahnya adalah " Hadiah yang Ada ". Saya bukan ahli dalam proses, jadi saya tidak bisa mengatakan lebih dari itu. Tentu saja saya akan senang memiliki perwakilan ekstra (perlu beberapa jam untuk melakukan analisis dan penulisan ;-)) tetapi jika Anda tidak ingin menggunakan hadiah, atau tidak dapat mengetahui prosesnya , maka jangan khawatir, itu semua adalah karma positif :-) Semoga jawaban saya berhasil!
SamGibson
@Hugo - Saya tidak tahu apakah Anda mendapat pemberitahuan tentang pembaruan untuk jawaban, tetapi hanya FYI, saya telah menambahkan paragraf tentang SCL dan undershoot-nya (masih berupa teka-teki, tapi saya ragu ini terkait dengan masalah utama) dan saya ' Saya telah memperkirakan amplitudo "kesalahan SDA awal" dalam jejak lingkup terbaru sebagai setidaknya 0,55 x Vdd, yang jauh ke daerah tegangan "tidak terdefinisi", di mana sensor yang berbeda (atau kumpulan sensor yang berbeda ;-)) dapat mengobati itu sebagai logika "1" atau tidak, tanpa melanggar spesifikasinya. Saya akan offline sebentar lagi, jadi sekali lagi, semoga berhasil!
SamGibson
1
Thankyou lagi untuk bantuan saya akan memiliki pergi dengan karunia pada hari Senin ketika saya di (Sebagai catatan saya tidak mendapatkan pemberitahuan update jawaban).
Hugoagogo
apakah saya bisa membuat Anda mempertimbangkan satu pembaruan terakhir untuk pertanyaan itu.
Hugoagogo