Apakah SPI secara signifikan lebih cepat daripada bit-banging?

8

Saya punya proyek berdasarkan pic 18f4550. Untuk menulis ke register geser '595, apakah ada keuntungan berbeda menggunakan spi daripada pin io biasa? Saya mendengar spi lebih cepat, tetapi saya tidak yakin bagaimana caranya. Apakah ia menggunakan jam yang berbeda dan lebih cepat daripada sisa chip, atau apakah itu lebih efisien? Saya dapat bit-byte byte melalui pin io biasa dalam sejumlah kecil instruksi. Apakah spi menggunakan lebih sedikit daya pemrosesan? Saya akan sering bergeser keluar selama perhitungan yang cukup intens, jadi saya ingin sebanyak mungkin siklus didedikasikan untuk proses saya dan tidak bergeser keluar.

Alasan utama saya untuk tidak ingin menggunakan spi adalah tata letak saya saat ini akan membuatnya sedikit lebih sulit untuk mengakses pin yang diperlukan karena saya sudah menggunakan beberapa dari mereka untuk hal-hal lain dan harus mengacak-acak hal-hal di sekitar. Saya ingin mengetahui manfaat apa yang ada sebelum saya mulai merobek semuanya dan memindahkannya.

captncraig
sumber
5
Anda dapat melakukan SPI dengan bit-banging.
starblue

Jawaban:

17

Dengan asumsi Anda membandingkan "mesin" serial periferal atau sinkron di mikro untuk menghasilkan urutan yang sama melalui "bit-banging", maka ya, itu cenderung agak lebih cepat, tetapi yang lebih penting prosesor dapat menyerahkan seluruh byte ke perangkat untuk mengirim dan kemudian melakukan hal-hal lain ketika sedang dikirim. Dalam kasus bit-banging, prosesor cenderung diikat selama transmisi (meskipun mikro cenderung menjadi master dan sebagian besar perangkat sepenuhnya statis, Anda mungkin dapat mentolerir jeda mid-byte untuk melayani interupsi atau bahkan polling hal-hal - ADC serial antarmuka-jam dan tugas interval sampel menjadi contoh pengecualian).

Pada MCU yang lebih mampu, bahkan mungkin untuk memprogram pengontrol DMA untuk melakukan transfer multi-byte dari memori melalui mesin SPI tanpa perhatian lebih lanjut dari prosesor, terutama jika hanya data dalam satu arah yang penting.

Tetapi banyak proyek mikro-controller akhirnya sangat dioptimalkan untuk tugas mereka; jika Anda dapat mengampuni siklus dan mentolerir pengurangan kecepatan, maka menyulitkan perangkat lunak Anda agar dapat menggunakan GPIO apa pun yang membuat tata letak fisik lebih bersih dengan cara apa pun bukanlah pilihan yang tidak biasa.

Chris Stratton
sumber
Ya ini ^. Seperti yang disebutkan Chris, keuntungan terbesar menggunakan periferal perangkat keras adalah Anda dapat menyerahkan byte data dari stream ke periferal dan diberi tahu melalui interupsi jika sudah selesai dipindahkan dan siap untuk byte lain. Ini membebaskan penggunaan CPU Anda untuk hal-hal lain saat byte sedang bergeser - yang bisa menjadi waktu seumur hidup dalam siklus mesin mengingat tingkat baud dari protokol serial ini.
Jon L
3
Bukan seumur hidup untuk SPI. Jika Anda berbicara tentang kecepatan, maka Anda mungkin menjalankan SPI pada 10MHz, yang hanya 10 instruksi PIC pada kecepatan penuh. Itu bukan usia. Cukup waktu yang cukup untuk menyiapkan byte berikutnya. Hampir tidak cukup waktu untuk melakukan gangguan.
Rocketmagnet
2
Mungkin adil untuk mengatakan banyak tergantung pada baud rate yang dimaksudkan / diperlukan, yang belum dinyatakan. Namun, seperti yang saya tunjukkan, jika mikro adalah master, mungkin bebas terlambat mengirim byte berikutnya, asalkan aplikasi dapat mentolerir ketidakteraturan / pengurangan throughput.
Chris Stratton
1
@ Roket, saya berdiri dikoreksi. SPI jauh lebih cepat dari yang saya kira - saya kira saya menyamakannya dengan protokol serial yang lebih lambat seperti UART (di mana 9600 baud adalah ~ 10 kHz).
Jon L
1
Perhatikan juga bahwa master SPI relatif mudah digigit. Budak SPI mungkin agak lebih sulit karena pemilihan chip & transisi jam perlu ditentukan waktunya secara khusus dan ditangani (seperti pin interupsi eksternal). Saya sering menggunakan gaya master bit SPI dalam proyek saya, terutama jika saya tidak membutuhkan kinerja tinggi tetapi menginginkan papan yang bersih (juga bagus untuk etsa rumah). Perhatikan juga bahwa ini adalah praktik umum untuk melakukan yang sebaliknya: menggeser data ke register geser (HC595 dll) menggunakan SPI dan GPIO (latch pin).
Hans
10

Keuntungan menggigit:

  • Kontrol mutlak atas protokol.
  • Jika waktu untuk menjalankan instruksi pada mikrokontroler lebih cepat daripada baudrate SPI, itu bisa lebih cepat, tetapi ini tidak mungkin. Dibutuhkan baudrate SPI kecepatan sangat sangat rendah dengan mikrokontroler kecepatan relatif tinggi.
  • Dapat memiliki latensi yang lebih kecil daripada interupsi SPI.
  • Pilihan pin.

Kerugian dari sedikit-membenturkan:

  • Membutuhkan lebih banyak kode untuk menangani Waktu -Baudrate -Pengambilan sampel yang dapat diandalkan dari bit yang diterima - Batas bingkai proses * Setiap segmen kode di atas menghabiskan waktu yang dapat dihabiskan dengan menjalankan kode lain.

Keuntungan SPI:

  • Mendaftar konfigurasi menangani waktu baudrate, menerima bit sampling, dan memproses bingkai frame
  • Sebagian besar mikrokontroler dengan SPI memiliki vektor interupsi khusus untuk setiap perangkat SPI (Periksa mikro Anda!)
  • Setelah dikonfigurasi, hanya perlu memeriksa apakah buffer SPI TX / RX kosong / penuh dan tulis / baca byte.
  • Jika DMA tersedia, SPI dapat mengirimkan buffer besar data yang berdekatan tanpa gangguan perangkat lunak.

Kerugian SPI:

  • Perangkat tambahan untuk dipelajari dan dikonfigurasikan (Apakah itu benar-benar merugikan?)
  • Membutuhkan pin ekstra atau pin multiplexing
  • Biaya tambahan (cenderung diabaikan dengan mikrokontroler saat ini)
  • Saya memiliki masalah kebisingan dengan SPI, tetapi ada pada papan prototipe pada kecepatan yang relatif tinggi (10MHz)
  • Pilihan pin yang sangat terbatas

Bagi saya, keuntungan bit-banging kecil dibandingkan dengan keunggulan SPI. Kerugian dari bit-banging jauh lebih besar daripada SPI. Tiga alasan utama yang bisa saya lihat untuk memilih bit-banging adalah untuk

  1. Protokol kecepatan rendah khusus
  2. Jika komunikasi berkecepatan rendah dan aplikasi lainnya memiliki persyaratan komputasi yang rendah
  3. Atau jika komunikasi kecepatan rendah dan pilihan pin adalah masalah utama
Joshua
sumber
8

Pada PIC, implementasi bit-bang konvensional gaya SPI memakan waktu sekitar lima siklus per bit; dengan sedikit kerja pada bagian 18Fxx, seseorang dapat memotongnya menjadi sekitar empat (dengan biaya sekitar tiga siklus per byte overhead tambahan). Waktu itu merupakan tambahan untuk setiap waktu yang diperlukan untuk mengambil data (biasanya tiga siklus per byte). Jadi bayangkan sekitar 40-43 siklus per byte. Menggunakan perangkat keras SPI, kecepatan meningkat menjadi dua siklus per bit ditambah beberapa siklus ekstra per byte (beberapa lainnya dapat menangani transfer back-to-back, tetapi PIC yang saya lihat tidak bisa), dan sementara SPI mengirim byte prosesor dapat mengambil yang berikutnya, memungkinkan waktu keseluruhan sekitar 18 siklus / byte - kenaikan kecepatan sekitar 2,5x.

supercat
sumber
0

Untuk bit banging (BB) Anda lupa menyebutkan:

  1. Mengikat prosesor untuk periode komunikasi. (SPI memuat register lalu mengembalikan Anda untuk melakukan sesuatu yang lain)
  2. Background Interrupts dapat secara serius mengganggu kode BB, membuatnya hanya berguna dalam desain berulir tunggal, ingat Anda kode BB harus memberikan perhatian 100% untuk berurusan dengan protokol.
bob
sumber