Protokol SPI pada Arduino Contoh dan Tutorial

SPI adalah protokol komunikasi serial sinkron, artinya dia menggunakan sinyal clock untuk sinkronasi saat transfer data, SPI biasa digunakan pada perangkat seperti SD card, RFID dan 2,4 Ghz wireless transmitter/reciever. salah satu keunggulan yang dimiliki SPI adalah transfer data tanpa ada intrupsi(gangguan). perangkat yang berkomunikasi via SPI adalah controller dan peripheral, controller bertugas sebagai pemberi instruksi untuk peripheral, biasanya adalah mikrokontroller, sedangkan peripheral adalah perangkat yang menerima instruksi dari controller,  biasanya adalah sensor, display atau chip memory. Dengan menggunakan protokol SPI, controller bisa mengatur beberapa peripheral.

Komponen protokol komunikasi SPI

  • Signal Clock

Sinyal clock mengsinkronkan output data yang dikirim dari controller dan diterima oleh peripheral. satu bit data ditransfer setiap clock cycle, dengan begitu kecepatan transfer data bergantung pada frekuensi sinyal clock. sinyal clock dihasilkan oleh controller,dan bisa dimodifikasi dengan mengatur parameter yang disebut clock polarity (CPOL) dan clock phase (CPHA), Kedua parameter ini mempengaruhi hubungan antara jalur chip select (CS), data (COPI/CIPO), dan Serial Clock (SCK). ada 4 mode clock yang bisa dibuat dengan mengatur parameter clock polarity dan clock phase.

Mode 1 :CPOL = 0 , CPHA = 0

Transmisi dimulasi saat pin CS menjadi low, lalu sinyal clock akan dihasilkan oleh controller kondisi idle nya 0 (LOW), sinyal clock akan tetap berada pada kondisi idle selama 1 clock, kemudian berubah kondisi dari LOW ke HIGH (rising edge) pada clock selanjutnya, pada keadaan itulah sampling bit dilakukan. sampling data dilakukan saat rising edge sinyal clock dan shifting data dilakukan saat falling edge sinyal clock.

Mode 2 :CPOL = 0 , CPHA = 1

Transmisi dimulai saat pin CS menjadi low, sinyal clock akan dihasilkan oleh controller kondisi idle nya 0 (LOW), kemudian sinyal clock langsung berubah kondisi dari LOW ke HIGH (rising edge) pada clock pertama, sampling data dilakukan saat falling edge(Transisi dari HIGH ke LOW) sinyal clock dan shifting data dilakukan saat falling edge sinyal clock.

Mode 3 :CPOL = 1 , CPHA = 0

Transmisi data dimulai saat pin CS menjadi LOW,  sinyal clock akan dihasilkan oleh controller kondisi idle nya 1 (HIGH),  lalu sinyal clock akan tetap berada pada kondisi idle selama 1 clock, kemudian berubah kondisi dari HIGH ke LOW (falling edge) pada clock selanjutnya, pada keadaan itulah sampling bit dilakukan. sampling data dilakukan saat falling edge sinyal clock dan shifting data dilakukan saat rising edge sinyal clock.

Mode 4 :CPOL = 1 , CPHA = 1

Transmisi data dimulai saat pin CS menjadi LOW, sinyal clock akan dihasilkan oleh controller kondisi idle nya 1 (HIGH), lalu sinyal clock langsung berubah kondisi dari HIGH ke LOW (falling edge) pada clock pertama, sampling data dilakukan saat rising edge(Transisi dari HIGH ke LOW) sinyal clock dan shifting data dilakukan saat falling edge sinyal clock.

  • Chip Select (CS)

Komunikasi SPI memungkinkan untuk transfer data beberapa peripheral dengan satu controller, controller tidak bisa menerima data dari semua peripheral secara bersamaan, itu akan menyebabkan data yang dikirim menjadi berantakan, oleh sebab itu, Controller harus memilih dengan peripheral mana ia akan berkomunikasi, komunikasi-nya dilakukan secara bergiliran antara peripheral satu dengan yang lain. pin chip select (CS) bisa mengaktifkan dan menonaktifkan komunikasi antara controller dan peripheral dengan memberi sinyal HIGH atau LOW pada CS, pin ini bersifat active low sehingga komunikasi akan aktif saat sinyal LOW dan non-aktif saat sinyal HIGH.

  • POCI dan PICO

Komunikasi SPI bersifat full duplex artinya data yang dikirim oleh controller dan data yang diterima oleh controller berada pada jalur yang berbeda. Controller mengirim data ke peripheral bit per bit secara serial melalui jalur PICO (Peripheral In Controller Out). data yang dikirim dari controler biasanya dimulai dari bit yang paling besar/Most Significant Bit (MSB). Peripheral juga bisa mengirim data ke controller melalui jalur POCI (Peripheral Out Controller In). Data yang dikirim dikirim dari peripheral biasanya dimulai dari bit paling kecil/Least Significant Bit (LSB)

Cara Kerja

  • Controller memberikan sinyal LOW dari pin CS dimana itu akan mengaktifkan komunikasi dengan peripheral
  • Controller mengeluarkan sinyal clock dari pin SCLK
  • Controller mengirim data satu bit setiap satu clock ke peripheral melalui pin PICO, data yang dikirim dimulai dari most significant bit (MSB).
  • Jika perlu respon dari peripheral, peripheral akan mengirim data satu bit setiap 1 clock ke ke controller melalui pin POCI, data yang dikirim peripheral dimulai dari less significant bit (LSB)

Jenis Rangkaian SPI

Komunikasi SPI selain bisa menghubungkan satu controller dan peripheral bisa juga menghubungkan satu controller dengan beberapa peripheral (multiple peripheral), ada dua jenis rangkaian SPI multiple peripheral yang bisa digunakan yaitu rangkaian independent peripheral dan rangkaian daisy chain.

  • Independent peripheral

Pada rangkaian ini, controller memerlukan pin CS sebanyak peripheral yang akan terhubung, setiap pin CS pada controller disabungkan ke pin CS pada peripheral, rangkaian nya bisa dilihat pada gambar di bawah.

Ketika controller akan berkomunikasi dengan salah satu peripheral, controller akan mengirim sinyal LOW melalui pin CS (sesuai peripheral yang akan diajak berkomunikasi), sinyal LOW ini akan memberitahu peripheral bahwa controller akan mengirimkan data, data dikirim melalui pin PICO dan pada saat yang sama, pin SCLK menghasilkan sinyal clock. Jika controller memerlukan respon dari peripheral, pin SCLK akan terus menghasilkan sinyal clock dan peripheral akan mengirim data ke controller melalui pin POCI,  controller akan tetap mengirim sinyal LOW sampai komunikasi data selesai. 

  • Konfigurasi daisy chain

Pada rangkaian ini, controller hanya membutuhkan satu pin CS untuk berkomunikasi dengan semua peripheral, rangkaian nya bisa dilihat pada gambar dibawah

Controller akan mengirim sinyal LOW dari pin CS, dan akan mengaktifkan komunikasi dengan semua peripheral, kemudian controller mulai mengirim data ke peripheral pertama melalui pin PICO, disaat yang sama pin SCLK mulai penghasilkan sinyal clock, data yang dikirim oleh controller akan diterima oleh satu per satu peripheral secara berurutan sampai ke peripheral terakhir, sehingga controller perlu menghasilkan sinyal clock yang cukup sampai semua data diterima oleh periprahal terakhir. controller akan tetap mengirim sinyal LOW sampai komunikasi data selesai.

Langkah-Langkah Transmisi Data

1.UART transmitter menerima data dalam bentuk parallel dari data bus

2. UART Transmitter menambahkan start bit, parity bit dan stop bit pada data frame dan membuat sebuah paket data.

3. Seluruh paket data dikirim secara serial dari transmitter UART ke receiver UART. Reciever UART membaca paket data pada frekuensi baudrate yang sudah ditentukan.

4. Reciever UART membuang start bit, parity bit dan stop bit dari data frame

5. Reciever UART mengubah data serial kembali menjadi data parallel dan mengirimkan nya ke data bus receiver.

Kelebihan dan Kekurangan

Kelebihan Protokol Komunikasi UART :

  • Hanya menggunakan 2 kabel.
  • Tidak membutuhkan sinyal clock
  • Mempunyai parity bit untuk mengecek error pengiriman data
  • Struktur data peket bisa diubah selama kedua UART sudah di atur untuk itu
  • Metode komunikasi yang banyak digunakan

Kekurangan :

  • Jumlah bit yang bisa dikirimkan setiap paketnya hanya 9 bit
  • Tidak bisa digunakan untuk berkomunikasi dengan banyak komponen dalam satu saluran
  • Toleransi baudrate maksimal 10%

Fungsi-Fungsi Komunikasi SPI pada Arduino

untuk menggunakan komunikasi SPI di arduino kita memerlukan library “#include <SPI.h>. Berikut ditambah dengan fungsi sering untuk malakukan transmisi data dengan protokol komunikasi SPI :

  • SPI Setting 

Pemrograman komunikasi SPI dirangkum kedalam sebuah class berbasis objek yang dinamakan SPI Setting Kelas `SPISettings` digunakan untuk mengatur parameter-parameter yang diperlukan untuk konfigurasi komunikasi SPI, seperti kecepatan transfer data (clock frequency), bit order, dan mode SPI (atau pola sinkronisasi). Biasanya, objek `SPISettings` diinisialisasi dengan parameter berikut:

1. **Kecepatan Transfer (Clock Frequency)**: Ini menentukan seberapa cepat data akan dikirimkan melalui jalur SPI. Kecepatan transfer diukur dalam Hertz (Hz). Semakin tinggi kecepatan transfer, semakin cepat data dapat dikirimkan, tetapi ini juga dapat tergantung pada kemampuan perangkat keras dan jarak fisik antara perangkat-perangkat yang terlibat.

2. **Bit Order**: Bit order menentukan urutan pengiriman bit dalam satu byte data. Ada dua pilihan umum: MSB (Most Significant Bit) dan LSB (Least Significant Bit). Dalam modus MSB, bit paling signifikan dikirim terlebih dahulu, sementara dalam modus LSB, bit paling tidak signifikan dikirim terlebih dahulu.

3. **Mode SPI**: Mode SPI menentukan bagaimana sinkronisasi antara perangkat pengirim dan penerima dilakukan. Ada empat mode SPI yang umumnya digunakan, yaitu:

   – Mode 0: Sinkronisasi terjadi dengan sisi naik clock (rising edge) dan data dibaca pada sisi turun clock (falling edge).

   – Mode 1: Sinkronisasi terjadi dengan sisi turun clock (falling edge) dan data dibaca pada sisi naik clock (rising edge).

   – Mode 2: Sinkronisasi terjadi dengan sisi naik clock (rising edge) dan data ditulis pada sisi turun clock (falling edge). 

   – Mode 3: Sinkronisasi terjadi dengan sisi turun clock (falling edge) dan data ditulis pada sisi naik clock (rising edge).

  • SPI.begin()

Fungsi ini digunakan untuk menginisialisasi dan memulai komunikasi menggunakan protokol Serial Peripheral Interface (SPI) pada papan Arduino. Sebelum Kita dapat berkomunikasi dengan perangkat eksternal menggunakan SPI. Cukup dengan memanggil sintax “SPI.begin()” maka transfer data dengan protokol SPI akan aktif 

  • SPI.beginTransaction()

Fungsi `SPI.beginTransaction()`digunakan untuk memulai sebuah sesi komunikasi menggunakan protokol Serial Peripheral Interface (SPI). Ketika Kita ingin berkomunikasi dengan perangkat eksternal menggunakan SPI, Kita harus memulai sesi komunikasi sebelum mengirim atau menerima data. Fungsi ini memungkinkan Kita untuk mengatur parameter komunikasi seperti kecepatan transfer, bit order, dan mode SPI sebelum memulai pengiriman data. biasanya paramater dari fungsi ini diisi dengan object SPI Setting, dengan begitu pengaturan yang sudah kita tulis pada class SPI setting bisa diterapkan. contoh

				
					#include<SPI.h>

voidsetup() {
  // Inisialisasi komunikasi SPI dengan kecepatan 1 MHz, bit order MSB, dan mode 0
  SPISettings settings(1000000, MSBFIRST, SPI_MODE0);

  // Memulai komunikasi SPI dengan pengaturan yang telah ditentukan
  SPI.begin();
  SPI.beginTransaction(settings);
}

				
			
  • SPI.transfer()

Fungsi ini digunakan untuk mentransfer satu byte data melalui komunikasi SPI antara perangkat mikrokontroler dan perangkat eksternal yang terhubung melalui SPI. SPI.transfer()` mengirimkan byte data melalui SPI dan secara bersamaan menerima byte data dari perangkat eksternal yang terhubung. Fungsi ini mengirimkan byte data secara sinkron, yaitu dengan mengirimkan satu bit pada setiap langkah siklus clock SPI. Contoh penggunaan :

				
					#include<SPI.h>

voidsetup() {
  // Memulai komunikasi SPI
  SPI.begin();
}

voidloop() {
  // Kirim byte data dan terima hasil dari perangkat eksternal
  unsigned int sendData = 0x55;  // Data yang akan dikirim (hexadecimal)
  unsigned int receivedData = SPI.transfer(sendData);

  // Lakukan operasi dengan data yang diterima

  delay(1000);
}

				
			

Dalam contoh di atas, setelah memanggil `SPI.begin()`, kita menggunakan `SPI.transfer(sendData)` untuk mengirim byte data `sendData` melalui SPI dan secara bersamaan menerima byte data dari perangkat eksternal. Byte data yang diterima disimpan dalam variabel `receivedData`, yang dapat digunakan untuk melakukan operasi lebih lanjut. Penting untuk diingat bahwa saat menggunakan `SPI.transfer()`, pengiriman dan penerimaan data terjadi dalam satu langkah, sehingga perangkat eksternal juga harus memahami urutan pengiriman dan penerimaan data dalam satu siklus SPI.

  • SPI.endTransaction()

Fungsi ini digunakan untuk mengakhiri sesi komunikasi yang telah dimulai sebelumnya dengan menggunakan fungsi `SPI.beginTransaction()`. Ketika Kita ingin menghentikan sesi komunikasi SPI setelah selesai melakukan operasi pengiriman atau penerimaan data, Kita harus memanggil fungsi `SPI.endTransaction()`. 

  • SPI.end()

Fungsi ini digunakan untuk menghentikan dan membersihkan konfigurasi komunikasi Serial Peripheral Interface (SPI) yang telah diinisialisasi sebelumnya menggunakan fungsi `SPI.begin()`. Ketika Kita telah selesai dengan operasi komunikasi menggunakan SPI, Kita harus memanggil fungsi `SPI.end()` untuk menghentikan komunikasi dan membersihkan pengaturan SPI.

Sekian saja teori dasar komunikasi data menggunakan protokol SPI pada Arduino, nantinya saya akan buat contoh penggunaan nyata menggunakan arduino pada artikel lain. Semoga bermanfaat

Tinggalkan komentar