Raspberry Pi Pico adalah mikrokontroler yang dikembangkan oleh Raspberry Pi Foundation, dilengkapi dengan antarmuka komunikasi yang kuat, termasuk SPI (Serial Peripheral Interface). SPI adalah protokol komunikasi serial yang banyak digunakan untuk menghubungkan mikrokontroler dengan perangkat eksternal seperti sensor, modul display, dan memori eksternal. Artikel ini akan membahas dasar-dasar SPI, cara mengkonfigurasinya pada Raspberry Pi Pico, serta contoh implementasi untuk berkomunikasi dengan perangkat eksternal.
Apa Itu SPI?
SPI (Serial Peripheral Interface) adalah protokol komunikasi sinkron dan full-duplex yang dirancang untuk pertukaran data berkecepatan tinggi antara perangkat master dan slave. Berbeda dengan I2C yang menggunakan dua kabel (SDA dan SCL), SPI menggunakan empat kabel utama.
Perbedaan Utama SPI vs I2C
- I2C: hanya butuh 2 kabel → SDA (data) & SCL (clock).
- SPI: butuh 4 kabel utama, tapi menawarkan kecepatan transfer data lebih tinggi dan komunikasi full-duplex (dua arah secara bersamaan).
Empat Jalur Utama SPI
1. SCLK (Serial Clock)
- Ini adalah sinyal jam (clock) yang dihasilkan oleh master device.
- Digunakan untuk sinkronisasi pengiriman dan penerimaan data antara master dan slave.
- Perangkat slave hanya akan aktif berkomunikasi saat sinyal clock dari master sedang bekerja.
2. MOSI (Master Out Slave In)
- Jalur data keluar dari master dan masuk ke slave.
- Misalnya: jika Raspberry Pi Pico (master) mengirimkan perintah ke sensor (slave), maka perintah itu lewat jalur MOSI.
3. MISO (Master In Slave Out)
- Jalur data keluar dari slave dan masuk ke master.
- Contoh: sensor mengirimkan hasil pengukuran ke Pico lewat MISO.
4. SS / CS (Slave Select / Chip Select)
- Digunakan oleh master untuk memilih slave mana yang aktif.
- Biasanya berupa sinyal LOW (aktif).
- Jika terdapat beberapa slave dalam sistem, masing-masing harus memiliki jalur SS/CS (Slave Select/Chip Select) terpisah, agar master dapat memilih slave yang ingin diakses secara individual.
Tambahan Penting:
- SPI bersifat full-duplex → memungkinkan proses pengiriman dan penerimaan data dilakukan secara bersamaan di kedua arah.
- SPI lebih cepat dari I2C, tetapi menggunakan lebih banyak kabel, terutama jika ada banyak slave.
- Dalam Raspberry Pi Pico, pin SPI bisa dikonfigurasi menggunakan SPI0 atau SPI1, tergantung kebutuhan proyek.
Keunggulan SPI
- Kecepatan tinggi (beberapa Mbps, tergantung perangkat).
- Full-duplex communication (data dapat dikirim dan diterima secara bersamaan).
- Sederhana dan efisien untuk komunikasi point-to-point atau multi-slave.
Keterbatasan SPI
- Membutuhkan lebih banyak pin dibanding I2C.
- Tidak memiliki mekanisme acknowledgment seperti I2C.
- Tidak cocok untuk jaringan dengan banyak perangkat karena setiap slave memerlukan pin CS terpisah.
Contoh Kode Sederhana SPI
Misalnya contoh komunikasi SPI antara Pico dan OLED atau sensor:
from machine import SPI, Pin
spi = SPI(0, baudrate=1000000, polarity=0, phase=0,
sck=Pin(2), mosi=Pin(3), miso=Pin(4))
cs = Pin(5, Pin.OUT)
cs.value(1) # Nonaktifkan chip di awal
cs.value(0) # Aktifkan chip
spi.write(b'\x9F') # Contoh: perintah baca ID (tergantung perangkat)
cs.value(1)
Konfigurasi SPI pada Raspberry Pi Pico
Raspberry Pi Pico memiliki dua antarmuka SPI (SPI0 dan SPI1) yang dapat dikonfigurasi melalui pemrograman MicroPython atau C/C++.
Pin SPI pada Raspberry Pi Pico
Catatan: Pin CS (Chip Select) dapat dipilih bebas karena bersifat software-controlled.
Implementasi SPI dengan MicroPython
MicroPython menyediakan modul `machine` untuk mengkonfigurasi SPI. Berikut contoh inisialisasi SPI0:
from machine import Pin, SPI
# Inisialisasi SPI0 dengan pin default
spi = SPI(0, baudrate=1_000_000, polarity=0, phase=0, bits=8,
firstbit=SPI.MSB, sck=Pin(2), mosi=Pin(3), miso=Pin(4))
cs = Pin(5, Pin.OUT)
cs.value(1) # Slave tidak aktif di awal
# Fungsi transfer data SPI (full-duplex)
def spi_transfer(data_out): # Kirim data ke slave dan baca responsnya
data_in = bytearray(len(data_out))
cs.value(0) # Aktifkan slave
spi.write_readinto(data_out, data_in)
cs.value(1) # Nonaktifkan slave
return data_in # data_in: bytearray kosong untuk menerima data dari slave
# Contoh penggunaan
data_out = bytearray([0x01, 0x02, 0x03])
data_in = spi_transfer(data_out)
print("Data diterima:", list(data_in))
Penjelasan Kode:
1. SPI Inisialisasi
- `baudrate`: Kecepatan komunikasi (1 MHz dalam contoh).
- `polarity` dan `phase`: Mengatur mode SPI (0 atau 1).
- `bits`: Jumlah bit per transfer (biasanya 8).
- `firstbit`: Urutan bit (MSB atau LSB).
2. Chip Select (CS)
- Digunakan untuk memilih slave yang aktif (active-low).
3. spi.write_readinto()
- Mengirim data sekaligus membaca respons dari slave.
Baca juga : Penjelasan Timer dan Delay di Raspberry Pi Pico: Cara Kerja dan Contoh Program
Contoh Aplikasi: Komunikasi dengan Modul SPI (MCP3008 ADC)
MCP3008 memiliki 8 channel analog (CH0-CH7), dan Anda bisa baca semua dengan mengganti parameter pada fungsi read_adc(channel) sesuai kebutuhan. Nilai ADC 10-bit berarti rentangnya 0-1023 (0V hingga 3.3V), jadi Anda bisa konversi ke tegangan (dalam volt) dengan:
tegangan = value * 3.3 / 1023
Berikut ini cara membaca data analog dari sensor menggunakan Raspberry Pi Pico:
Rangkaian Hardware
- Hubungkan MCP3008 ke Raspberry Pi Pico:
- VDD → 3.3V
- VREF → 3.3V
- AGND → GND
- CLK → GP2 (SCK)
- DOUT → GP4 (MISO)
- DIN → GP3 (MOSI)
- CS/SHDN → GP5 (CS)
- CH0 → Sensor (misalnya potensiometer)
Kode MicroPython
from machine import Pin, SPI
import time
# Konfigurasi SPI
spi = SPI(0, baudrate=1_000_000, sck=Pin(2), mosi=Pin(3), miso=Pin(4))
cs = Pin(5, Pin.OUT)
cs.value(1) # Nonaktifkan CS di awal
def read_adc(channel):
cmd = bytearray([0x01, (0x08 + channel) << 4, 0x00])
result = bytearray(3)
cs.value(0)
spi.write_readinto(cmd, result)
cs.value(1)
# Konversi data ADC 10-bit
adc_value = ((result[1] & 0x03) << 8) | result[2]
return adc_value
# Loop membaca channel 0
while True:
value = read_adc(0)
print("Nilai ADC:", value)
time.sleep(1)
Penjelasan:
1. Format Komunikasi MCP3008
- Mengirim 3 byte:
- Byte 1: `0x01` (start bit).
- Byte 2: `(0x08 + channel) << 4` (konfigurasi single-ended + channel).
- Byte 3: `0x00` (dummy byte untuk clocking).
2. Pembacaan Data
- Data diterima dalam 3 byte, dengan nilai 10-bit di byte 2 dan 3.
Optimasi Performa SPI
1. Gunakan Baudrate Tertinggi yang Didukung
- Baudrate adalah kecepatan transfer data.
- Semakin tinggi baudrate, semakin cepat data ditransmisikan.
- Tapi pastikan perangkat slave mendukung baudrate yang dipilih.
2. Minimalkan Delay di Program
- Hindari fungsi sleep() yang tidak perlu.
- Gunakan algoritma efisien agar komunikasi tidak terganggu.
3. Manfaatkan DMA (Direct Memory Access)
- Khususnya saat menggunakan bahasa C/C++, DMA memungkinkan transfer data langsung antar memori dan periferal tanpa beban CPU.
- Cocok untuk aplikasi real-time atau pengiriman data besar.
Troubleshooting Umum SPI
1. Cek Koneksi Pin
- Pastikan koneksi MOSI, MISO, SCLK, dan CS/SS terhubung dengan benar.
- Jangan sampai tertukar antara MOSI ↔ MISO.
2. Periksa Baudrate
- Gunakan baudrate yang sesuai dengan kemampuan slave.
- Jika terlalu tinggi, data bisa korup atau tidak terbaca.
3. Pastikan Mode SPI Cocok
- SPI punya 4 mode (Mode 0 hingga Mode 3) tergantung CPOL (clock polarity) dan CPHA (clock phase).
- Master dan slave harus dalam mode yang sama, jika tidak, data tidak akan sinkron.
4. Cek Level Tegangan
- Raspberry Pi Pico bekerja pada logika 3.3V.
- Jika kamu menggunakan perangkat slave 5V, pastikan memakai logic level shifter agar tidak merusak GPIO.
SPI sangat efisien untuk komunikasi high-speed antara Raspberry Pi Pico dan perangkat eksternal. Dengan memahami konfigurasi dasar dan implementasinya, Anda dapat mengintegrasikan berbagai sensor dan modul dengan mudah. Dengan optimasi yang tepat, SPI dapat menjadi solusi ideal untuk proyek IoT, robotika, dan embedded systems yang membutuhkan transfer data cepat.
Baca juga : Raspberry Pi Pico untuk Edukasi: Kenapa Cocok untuk Belajar Elektronika dan Coding
Siap Untuk Membuat Proyek Impianmu Menjadi Kenyataan?
Klik di sini untuk chat langsung via WhatsApp dan dapatkan dukungan langsung dari tim ahli kami!
0 on: "Pengenalan Dasar SPI: Komunikasi Raspberry Pi Pico dengan Perangkat Eksternal"