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.
sumber
Jawaban:
SPI-tanpa-pilih Anda adalah apa yang digunakan Microchip pada chip MCP23017 mereka (dan lainnya). Tidak ada yang salah dengan pendekatan itu.
Ya, apa yang Anda inginkan adalah mungkin, tetapi Anda harus membuat budak menjadi tiriskan. Anda bisa menipu dengan meletakkan dioda (schottky) secara seri dengan setiap output jika Anda tidak bisa membuatnya berperilaku sebagai tiriskan terbuka.
Pendekatan enumerasi Anda sama dengan yang digunakan oleh bus one-wire Dallas untuk enumereation, dan oleh bus CAN untuk arbitrasi.
Tetapi kelemahan serius dari pendekatan Anda adalah bahwa kecepatan sekarang dibatasi oleh waktu naik, didorong oleh resistor pull-up. Ini akan lebih lambat daripada saat digerakkan oleh output push-pull, dan kemungkinan akan membatasi kecepatan di mana Anda dapat mengoperasikan bus.
Jika Anda memiliki dua pin untuk cadangan pada setiap budak, Anda dapat membuat daisy-chain, dan memiliki skema enumerasi berdasarkan tempat mereka di rantai daisy.
sumber
Anda perlu memeriksa berapa resistansi setara pin master i / o dalam mode pull-up.
Biasanya, mode pull-up memiliki resistensi yang sangat tinggi, mungkin 50 kOhms atau lebih tinggi. Ini dimaksudkan untuk menjaga pin dari gangguan karena emi atau kebisingan lainnya, atau untuk menetapkan default untuk sinyal kontrol yang sangat lambat, dan pada saat yang sama tidak membuang terlalu banyak daya untuk melakukan itu.
Seperti yang ditunjukkan Wouter, dalam bus drain terbuka kecepatan dibatasi oleh pull-up resistor. Nilai resistor yang lebih tinggi membuat bus lebih lambat. Nilai khas dalam I2C (yang mendapat 100 atau 400 kHz) adalah 1 hingga 5 kOhms. Anda akan menginginkan resistensi pull-up yang sama untuk mencapai kecepatan yang sama.
Saya pikir Anda perlu menggunakan resistor pull-up eksternal (dari 1 sampai 5 kOhms atau lebih) daripada i / o pin pull-up master untuk membuat skema ini berfungsi.
sumber
Agar kabel dan bus berfungsi, node pada bus harus terbuka-tiriskan, yaitu mereka harus mengirimkan
Selanjutnya, bus harus ditarik ke atas dengan lemah.
Perilaku aneh yang Anda lihat dengan satu master yang tidak mentransmisikan dan satu budak yang mentransmisikan dapat dijelaskan baik oleh master yang menarik dengan kuat atau budak yang menarik ke bawah dengan lemah.
Anda perlu menentukan yang mana di atas yang terjadi.
Masukkan slave ke mode impedansi tinggi dan hubungkan bus ke ground melalui resistor 10k. Jika tegangan saluran tidak berubah secara signifikan, maka master menarik ke atas dengan kuat dan Anda harus memperbaikinya. Jika tidak, lakukan prosedur yang sama dengan slave (kali ini sambungkan resistor ke Vcc); jika tegangan saluran naik secara signifikan, budak menarik ke bawah dengan lemah (perbaiki itu). Jika tidak, cari distorsi ruang-waktu di area sekitar Anda.
sumber
Saya akan menyarankan memiliki pull-up pasif atau pull-down di bus (saya akan menganggap pull-up), dan memiliki budak yang aktif mengemudikan bus (mengemudi tinggi dan mengemudi rendah) ketika mereka memiliki sesuatu untuk dikatakan dan mengapungkannya sebaliknya . Memiliki perintah-alamat permintaan yang mengambil alamat dan mask, dan menginstruksikan setiap budak untuk menghasilkan 00 atau tidak melakukan apa-apa (teruskan hasilnya) berdasarkan apakah ia menyukai alamat dan mask. Jika memungkinkan, minta master secara aktif mengemudikan bus beberapa waktu sebelum budak mulai mengendarainya. Bergantung pada kekuatan pull-up dan apakah master mendorong bus tinggi, sebelum slave dibiarkan menariknya rendah, mungkin perlu untuk membatasi kecepatan bus selama fase pengaturan. Di sisi lain, setelah pengaturan selesai,
sumber