Jawaban:
Periferal pengontrol SPI yang sebenarnya dalam MCU seringkali dapat berjalan jauh lebih cepat daripada sedikit membenturkan antarmuka. Tentu saja, itu tergantung pada MCU, tetapi tidak akan mengejutkan saya untuk melihat pengontrol SPI berjalan pada 30+ MHz, sementara bit banging mungkin terbatas sekitar 1 MHz (jika Anda beruntung).
Tetapi ada lebih dari itu. Saat menggedor-gedor, MCU sibuk menggedor-gedornya. Ini menggeser data keluar dan memutar-mutar garis GPIO. Artinya, tidak bisa melakukan hal lain. Saat menggunakan pengontrol SPI, pengontrol sibuk melakukan semua hal itu dan MCU bebas untuk melakukan hal-hal lain.
Jadi dengan kontroler SPI yang sebenarnya, transfer SPI yang sebenarnya jauh lebih cepat dan MCU mendapatkan kembali beberapa siklus yang dapat digunakan untuk melakukan hal-hal lain.
Tidak ada perbedaan dalam hal Anda dapat mencapai hasil yang sama menggunakan kedua metode, tetapi ada beberapa alasan mengapa Anda memilih satu di antara yang lain.
Menggunakan periferal SPI akan membebaskan prosesor dari kehati-hatian dalam menghasilkan waktu untuk sedikit membenturkan pin I / O, memungkinkannya untuk melakukan tugas komputasi lain dan menyederhanakan pemrograman CPU Anda. Karena perangkat diimplementasikan dalam perangkat keras, perangkat akan berjalan lebih cepat dan menggunakan daya lebih sedikit daripada bit banging I / O. Mungkin ada kasus di mana Anda ingin menggigit bang I / O untuk berinteraksi dengan SPI jika aplikasi Anda menuntut Anda memilih prosesor tanpa periferal SPI. Untuk alasan kewarasan, saya sarankan menghindari itu kecuali benar-benar diperlukan.
SPI bersifat sinkron antarmuka yang , dengan master yang mengendalikan jam. Itu berarti jika Anda adalah master, Anda harus memilih kecepatan dan timing jam. Perangkat slave akan memiliki batas atas pada frekuensi jam yang dapat mereka tangani, tetapi biasanya tidak peduli seberapa lambat jam di bawah itu. Lebih khusus, biasanya ada waktu minimum setiap budak perlu melihat jam dalam keadaan tinggi dan rendah sebelum dapat beralih lagi, dan akan ada beberapa pengaturan data minimum dan menahan batas pada garis data yang mengelilingi tepi jam di mana slave membaca baris data.
Karena itu, menerapkan master SPI dalam firmware sangat mudah. Saya sering melakukan ini sebagai kemudahan untuk menggunakan pin tertentu, ketika tidak ada perangkat keras SPI bawaan, atau tidak tersedia untuk tujuan itu dengan alasan apa pun. Melakukan master SPI dalam firmware adalah semudah yang didapat.
Banyak perangkat slave SPI cukup cepat, sehingga seringkali jam minimum dan waktu setup terpenuhi hanya dengan memastikan masing-masing setidaknya satu lebar siklus instruksi. Dalam hal ini, kodenya sangat pendek dan cepat. Dalam beberapa kasus, perangkat slave mungkin memerlukan dua atau tiga siklus instruksi per fase clock, tapi itu juga tidak sulit untuk dijamin. Loop bit SPI tingkat rendah mengharuskan Anda menggeser bit output berikutnya ke posisi, meraih bit input, dan memeriksa penghitung loop. Anda biasanya dapat memenuhi dua atau tiga persyaratan waktu minimum siklus hanya dengan mengatur kapan Anda mengemudi dan mencicipi garis dengan beberapa overhead lainnya dimasukkan di tempat yang tepat. Jika kecepatan penting, Anda dapat menggunakan preprocessor assembler untuk menulis loop yang tidak terbuka. Dengan teknik seperti ini,
Ada beberapa keuntungan untuk melakukan master SPI dalam firmware. Perangkat keras SPI terkadang sedikit ridgid dalam hal bagaimana hal itu dapat dikonfigurasi. Selalu ada masalah tentang apa yang seharusnya terjadi segera ketika slave select dinyatakan. Apakah bit pertama ditulis ke baris data? Bagaimana jika jam mulai rendah dan garis data seharusnya terkunci di tepi jatuh? Terkadang ini penting, kadang tidak. Dengan master SPI firmware, Anda bisa lebih pemaaf dan mungkin menggunakan rutin yang sama untuk berkomunikasi dengan budak yang berbeda. Misalnya, Anda dapat memastikan bahwa jalur data MOSI (Master Out Slave In) stabil di kedua sisi jam. Perangkat keras SPI umumnya tidak akan melakukan itu, sehingga perangkat keras tersebut perlu dikonfigurasi ulang tergantung pada slave mana yang berkomunikasi dengannya saat itu.
Keuntungan lain dari master SPI firmware adalah Anda dapat memilih jumlah bit sewenang-wenang per urutan SPI. Perangkat keras biasanya terbatas pada kelipatan 8 bit. Sebagian besar perangkat dirancang untuk memungkinkan transfer seluruh byte, tetapi seringkali tidak memerlukannya. Sebagai contoh, A / D 10 bit kemungkinan akan mengirim 10 bit data terlebih dahulu, kemudian mengirim 0 atau sampah setelah itu jika Anda terus mencatatnya. Jika menggunakan perangkat keras SPI, Anda akan dipaksa untuk mentransfer 16 bit dan menutupi sampah. Semuanya akan berfungsi dengan baik, tetapi master firmware SPI sebenarnya bisa lebih cepat daripada perangkat keras dalam hal ini karena hanya mengalihkan minimal 10 bit yang diperlukan.
Keuntungan utama dari master perangkat keras SPI adalah bahwa firmware dapat melakukan transfer byte, kemudian pergi dan melakukan sesuatu yang lain. Pencatatan jam kerja biasanya juga bisa lebih cepat daripada yang dapat dicapai oleh loop firmware yang tidak terbuka. Perhatikan bahwa meskipun kedua keuntungan ini bisa menjadi penting dalam keadaan tertentu, mereka sering tidak relevan. Sebagian besar kode SPI yang menggunakan perangkat keras untuk mentransfer byte kemudian segera masuk ke loop menunggu perangkat keras untuk menyelesaikan transfer. Periksa juga persyaratan waktu budak dengan hati-hati. Perangkat SPI umumnya cepat secara keseluruhan, tetapi ada beberapa kasus di mana Anda harus memperlambat perangkat keras agar sesuai dengan kecepatan maksimum yang dapat ditangani oleh budak.
Itu semua dari sudut pandang master. Singkatnya, sering ada sedikit keuntungan menggunakan perangkat keras SPI sebagai master, dan bahkan beberapa keuntungan karena tidak menggunakannya kadang-kadang. Namun, itu semua berbeda untuk budak. Karena master mengendalikan jam, budak harus siap untuk apa pun yang dilakukan master setiap kali master melakukannya. Persyaratan waktu seringkali relatif singkat dibandingkan dengan waktu instruksi, sehingga memiliki perangkat keras yang mengimplementasikan budak SPI biasanya adalah yang Anda inginkan.
Anda dapat melakukan budak SPI dalam firmware, tetapi itu rumit, Anda harus menghitung siklus dan latensi dengan hati-hati, dan Anda biasanya akhirnya menerapkan beberapa subset dari protokol yang Anda tahu menggunakan master khusus Anda. Sebagai contoh, suatu kali saya harus merancang setara digital dari papan pengontrol analog lama (mereka menginginkan fitur tambahan yang tidak dapat dilakukan secara analog, dan mereka menginginkan sesuatu yang lebih kecil, lebih murah untuk diproduksi, dan lebih stabil). Papan ini dihubungkan ke seluruh sistem melalui bus SPI. Papan analog yang lama memiliki D / A dua saluran untuk mengatur nilai kontrol dan dua saluran A / D untuk membaca kembali nilai yang diukur. Menerapkan keduanya dalam satu prosesor itu rumit, dan itu termasuk mencari tahu apa bagian dari perangkat keras D / A dan protokol SPI A / D master yang sebenarnya digunakan. Ini juga melibatkan prosesor yang dapat berjalan secara signifikan lebih cepat daripada clock rate SPI. Pada akhirnya, saya menggunakan tiga interupsi, satu untuk setiap slave select dan satu untuk edge yang meningkat dari garis clock. Yang terakhir perlu menjadi interupsi prioritas tertinggi dalam sistem lain persyaratan latensi tidak dapat dipenuhi.
Bagaimanapun, intinya secara keseluruhan adalah bahwa master firmware SPI mudah, kecil, cepat, dan fleksibel, dan ada sedikit alasan untuk menghindar untuk melakukannya. Di sisi lain, untuk seorang budak Anda benar-benar menginginkan perangkat keras, atau Anda harus bangun dan berpikir sangat hati-hati tentang waktu, latensi, dan sejenisnya.
Tergantung pada apa yang Anda lakukan untuk SPI. Jika minat Anda mendapatkan kecepatan data tertinggi darinya, perangkat keras selalu lebih cepat daripada bitbanging (misalnya chip lengan korteks di masa muda 3 saya dapat mendorong data pada 22Mbps menggunakan dukungan perangkat keras SPI, vs ~ 4,5Mbps dengan bitbanging (itu juga dapat menangani jumlah bit sewenang-wenang per transfer dari 3-16 - berguna saat mengirim data dalam 12 bit untuk pengendali yang dipimpin tertentu!)). Pada AVR 16Mhz, perbedaannya sedikit kurang ekstrim, kecepatan data tertinggi dengan perangkat keras tampaknya tinggi 4 / 5Mbps rendah, sementara bitbanging sekitar 2,3Mbps).
Selain itu, jika Anda menggunakan dukungan perangkat keras, sekali lagi, tergantung pada mikrokontroler yang bersangkutan, Anda memiliki opsi yang tersedia untuk Anda menggunakan pengontrol DMA untuk memindahkan data Anda, membiarkan kode Anda kembali ke hal-hal lain yang berpotensi lebih menarik daripada menjaga data. menulis.
Semua hal di atas tergantung pada apakah atau tidak SPI perangkat keras bahkan pilihan.
Jika Anda bit-bang SPI, Anda tidak dapat menggunakan interupsi SSP untuk menangani komunikasi. Ini tidak begitu penting bagi SPI untuk banyak kegunaan