3.21. Dasar-dasar SPI

SPI (Serial Peripheral Interface) adalah bus serial sinkron yang dirancang untuk tautan jarak pendek berkecepatan tinggi antara satu kontroler dan satu atau lebih perangkat periferal pada papan yang sama. Ini adalah antarmuka standar untuk kartu SD, layar, memori flash, ADC dan DAC, serta berbagai macam sensor.

Di mana UART tidak memiliki clock bersama dan memulihkan waktu dari jalur data itu sendiri, SPI menjalankan kabel clock bersama kabel data. Kontroler menggerakkan clock pada kecepatan yang diinginkannya, dan setiap perangkat lain di bus mengambil sampel data secara sinkron dengan clock tersebut. Tidak ada tebak-tebakan laju baud dan tidak ada overhead framing -- hanya tepi clock dan bit.

3.21.1. Empat kabel

Bus SPI full-duplex memiliki empat kabel:

  • SCK (serial clock). Digerakkan oleh kontroler. Setiap bit di-clock masuk atau keluar pada tepi sinyal ini.

  • MOSI (controller out, peripheral in). Jalur output kontroler; periferal mengambil sampel bit darinya.

  • MISO (controller in, peripheral out). Jalur output periferal; kontroler mengambil sampel bit darinya.

  • CS (chip select), terkadang disebut SS (peripheral select). Jalur terpisah per periferal. Kontroler menarik CS ke rendah untuk memulai transaksi dan tinggi lagi untuk mengakhirinya; periferal mana pun yang CS-nya tidak aktif mengabaikan bus sepenuhnya dan berhenti menggerakkan output MISO-nya.

Four signal traces stacked: CS at top, SCK below it, then MOSI and MISO. CS starts high (idle), drops low to begin the transaction, then SCK clocks out eight pulses while MOSI and MISO carry one byte of data each, then CS returns high.

Satu byte SPI: CS turun rendah untuk memilih periferal, SCK meng-clock delapan bit, dan MOSI serta MISO mentransfer satu byte masing-masing dalam arah berlawanan.

Setiap tepi clock memindahkan satu bit di setiap arah pada waktu yang sama. Satu pulsa SCK secara bersamaan mengirimkan satu bit di MOSI dan menerima satu bit di MISO -- SPI bersifat full-duplex pada level kabel. Perangkat lunak tidak harus menggunakan kedua arah: transaksi hanya-tulis dan hanya-baca adalah hal yang umum, dengan jalur yang tidak digunakan baik diabaikan atau dijaga tetap tinggi.

3.21.2. Polaritas dan fase clock

Dua bit konfigurasi menentukan tepi clock mana yang memindahkan data:

  • Polaritas clock (polarity, terkadang CPOL) -- keadaan idle SCK. 0 berarti clock idle rendah dan berdenyut tinggi; 1 berarti clock idle tinggi dan berdenyut rendah.

  • Fase clock (phase, terkadang CPHA) -- tepi mana yang mengambil sampel data. 0 mengambil sampel pada tepi pertama setiap pulsa clock (tepi terdepan); 1 mengambil sampel pada tepi kedua (tepi trailing).

Bersama-sama ini memberikan empat mode, yang secara konvensional disebut Mode 0 hingga Mode 3. Mode 0 (polarity=0, phase=0) adalah yang paling umum dan merupakan default yang aman untuk perangkat yang tidak dikenal.

Aturan krusial adalah bahwa kedua ujung harus menyepakati mode tersebut. Mode yang tidak cocok menghasilkan data yang tidak valid meskipun jalur clock dan data terhubung dengan benar; jika perangkat mengembalikan nilai yang tidak masuk akal pada transaksi pertama, mode adalah hal pertama yang harus diperiksa.

3.21.3. Beberapa periferal

Beberapa periferal dapat berbagi jalur SCK, MOSI, dan MISO yang sama selama masing-masing memiliki jalur CS sendiri yang digerakkan oleh kontroler:

  • Semua periferal melihat clock dan data yang sama, tetapi masing-masing memantau CS miliknya sendiri. Dengan CS tidak aktif (tinggi), periferal sepenuhnya mengabaikan SCK dan MOSI serta membiarkan MISO dalam keadaan impedansi tinggi sehingga tidak bersaing dengan perangkat lain untuk jalur tersebut.

  • Kontroler mengaktifkan tepat satu CS pada satu waktu, menjalankan transaksi, dan menonaktifkan CS untuk melepaskan bus.

Sebuah mikrokontroler dengan satu blok SPI hardware dapat berkomunikasi dengan periferal sebanyak pin GPIO bebas yang tersedia untuk jalur CS -- tidak ada pengalamatan di bus itu sendiri.

3.21.4. Kekuatan dan kelemahan

Kekuatan dan kelemahan SPI keduanya berasal dari desainnya:

  • Cepat. Puluhan megahertz dapat dicapai pada jalur pendek dengan translasi level sederhana. Pembaca kartu SD dan layar SPI menggunakan ini.

  • Sederhana pada level kabel. Tidak ada pengalamatan, tidak ada pengakuan, tidak ada kondisi start/stop khusus -- hanya bit pada kabel yang disinkronkan dengan clock.

  • Boros pin. Tiga jalur bersama ditambah satu CS per periferal. Sebuah papan dengan lima perangkat SPI menggunakan delapan pin (tiga + lima).

  • Jarak pendek. SPI mengasumsikan tepi yang bersih dan cepat, yang berarti jalur pendek pada papan yang sama. Untuk tautan yang lebih panjang, I2C atau salah satu bus berframe adalah pilihan yang lebih baik.