Untuk yang tidak sabar, Anda dapat melewati latar belakang.
Latar Belakang
Saya memprogram satu set mikrokontroler yang berkomunikasi dengan SPI. Ada satu tuan dan n
budak yang berbagi bus. Tidak ada chip yang dipilih. (Ini bukan desain yang buruk, tetapi n
besar dan tidak ada cukup ruang untuk n
jalur tambahan).
Karena itu merupakan tanggung jawab para budak untuk menjaga MISO mereka dalam impedansi tinggi dan paling banyak dari mereka berbicara. Ini dilakukan dengan merespons hanya ketika id mereka disurvei.
Sekarang kami ingin memiliki fase penemuan awal di mana master menemukan budak dengan id apa yang melekat padanya. Untuk membuat hidup lebih mudah (pada beberapa aspek), kami ingin memiliki id yang unik (dan karena itu misalnya 32 bit). Ini membuat mustahil bagi master untuk hanya mengumpulkan id satu per satu dan melihat siapa yang merespons (ada terlalu banyak kemungkinan).
Untuk mengatasi masalah ini, saya membuat variasi pencarian biner di mana budak secara kolektif merespons dan master dapat dengan cepat menemukan id minimum. Budak dengan id itu diberitahu untuk tidak berpartisipasi lagi dan algoritme berulang. (Detail tidak penting).
Tapi ada satu masalah. Respons kolektif harus logis ATAU (atau logis DAN) dari semua respons. Saya telah diberitahu bahwa saluran dapat dikonfigurasi sedemikian rupa sehingga bus MISO dapat bertindak sebagai OR logis. Yang saya tahu adalah:
- Atur MISO pada master sebagai Pull-up dan
- Atur MISO pada setiap budak sebagai Open-drain.
Saya sudah mencoba ini, tetapi bahkan dengan satu pun budak, konfigurasi ini tidak berfungsi (osiloskop menunjukkan nol konstan di telepon). Jika saya mengkonfigurasi MISO pada master sebagai input impedansi tinggi, saya dapat melihat dengan osiloskop bahwa tegangan turun menjadi setengah di mana bit output dari dua budak berbeda (pada dasarnya saya menganggap hubung singkat).
Catatan: mengkonfigurasi MISO pada master sebagai impedansi tinggi dan budak masing-masing sebagai push-pull, saya dapat berbicara dengan masing-masing secara individual bahkan jika ada banyak dari mereka di bus yang sama. Maksudku, aku ragu itu masalah garis itu sendiri.
Pertanyaan
Pertanyaan saya adalah, jika ini memungkinkan, dan jika demikian, bagaimana saya bisa mengkonfigurasi pin input dan output dari master dan slave sehingga garis MISO yang dibagikan akan bertindak sebagai logis OR (atau logis DAN)?
Edit
Ternyata itu menjadi OR dengan logika negatif-benar (pada dasarnya AND).
Masalah dengan slave tunggal diselesaikan dengan menulis 1 ke pin pull-up pada master. Sebelumnya memiliki keadaan awal 0.
Edit 2
Ternyata budak ST mengabaikan konfigurasi GPIO saya dari MISO sebagai saluran terbuka dan memaksanya tinggi ketika ada yang ditulis. Saya memutuskan untuk membungkam SPI dan mengeluarkan MISO dalam kasus khusus ini secara manual.