Apakah ada perbedaan antara menggunakan modul SPI bawaan dan bit-banging?

25

Apakah ada perbedaan di antara keduanya, atau hanya masalah abstraksi? Intuisi saya mengatakan tidak ada perbedaan tetapi saya ingin salah.

Skaevola
sumber
1
Tergantung seberapa baik Anda dalam menggedor-gedor. Lihat code.google.com/p/fastspi dan waitingforbigo.com :-)
Robert Atkins

Jawaban:

33

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.

Dietrich Epp
sumber
11

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.

Amoch
sumber
Alasan kewarasan adalah sampah. Seringkali mengatur perangkat keras SPI untuk konfigurasi yang Anda perlukan membutuhkan lebih banyak waktu membaca lembar data perangkat SPI daripada hanya menulis kode master SPI, dan dengan demikian hanya harus membaca lembar data perangkat budak.
Olin Lathrop
Saya akui saya menjadi sedikit sensasional dengan komentar kewarasan saya, tetapi niat (diakui tidak tertulis) adalah bahwa ketika kompleksitas aplikasi meningkat, demikian juga beban untuk memastikan bahwa sistem secara keseluruhan terus berfungsi dalam timing yang dimaksudkan. Saya telah mengimplementasikannya dengan dua cara dan saya tahu bahwa saya lebih suka menggunakan periferal, bahkan jika saya butuh beberapa menit ekstra untuk membaca lembar data.
Amoch
6

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.

Olin Lathrop
sumber
Pernahkah Anda menemukan implementasi slave mikrokontroler yang dapat berperilaku seperti perangkat SPI perangkat keras biasa (mis. Memungkinkan master untuk memberikan keunggulan pada CS dan membaca status setiap saat, dan menggunakan CS untuk menandai batasan perintah? Kebanyakan implementasi yang saya lihat tidak bahkan melaporkan apakah ada tepi CS antara byte saat ini dan yang sebelumnya
supercat
@supe: Ya, itu masalah. Perangkat keras Slave SPI biasanya mengabaikan data jam dan input dan menjaga jalur data output pada impedansi tinggi ketika chip pilih tidak ditegaskan, tetapi biasanya tidak memberi tahu Anda di mana batas pilih chip berada. Setidaknya dengan perangkat keras PIC SPI yang saya ingat gunakan, Anda harus mengatur interupsi Anda sendiri pada chip yang dipilih untuk itu.
Olin Lathrop
Saya bertanya-tanya apakah Anda tahu implementasi yang layak. Saya rasa tidak. Masalah dengan menggunakan interupsi perangkat keras pada kawat pilih adalah bahwa jika transisi terjadi pada kawat pilih segera setelah byte dikirim, budak mungkin mengalami kesulitan menyelesaikan apakah itu terjadi sebelum atau setelah byte yang dimaksud. Saya merasa bingung bahwa hampir setiap chip memiliki implementasi slave SPI, tetapi tampaknya tidak ada satupun yang benar-benar dapat digunakan seperti perangkat slave perangkat keras tipikal SPI. Situasinya agak seperti port slave prosesor pada PIC dibandingkan dengan 8048.
supercat
Port slave prosesor 8048 memiliki pin alamat; ketika data ditulis secara eksternal ke 8048, 8048 mengunci status pin itu dan membuatnya tersedia untuk kodenya (biasanya byte pertama dari suatu perintah akan ditulis ke satu alamat, dan parameter atau data ke yang lain). Pembacaan satu alamat akan menghasilkan apa pun yang dimasukkan oleh kode 8048 di sana, tetapi beberapa bit yang dibaca dari alamat lain dihasilkan oleh perangkat keras 8048 untuk menunjukkan apakah sudah siap untuk membaca atau menulis data.
supercat
1 untuk menunjukkan perbedaan antara sedikit-membenturkan master (mudah) dan budak (jauh lebih sulit).
tcrosley
1

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.

rDg
sumber
0

Jika Anda bit-bang SPI, Anda tidak dapat menggunakan interupsi SSP untuk menangani komunikasi. Ini tidak begitu penting bagi SPI untuk banyak kegunaan

Scott Seidman
sumber
1
Tidak ada prosesor spesifik yang disebutkan, jadi "SSP interrupt" adalah istilah yang tidak berarti dalam konteks ini.
Olin Lathrop