Serial Peripheral Interface (SPI) pada AVR

Gambar 1 - SPI AVR (www.atmel.com)

Gambar 1 – SPI AVR (www.atmel.com)

Melanjutkan dari sekian banyak komunikasi Serial yang ada pada AVR, artikel ini merupakan salah satu artikel yang paling di tunggu, yaitu Serial Peripheral Interface (SPI) pada AVR. sebelum membaca artikel ini, kami menyarankan Anda untuk membaca dulu tentang tutorial dasar dari SPI.

Hal yang mendasar pada Serial Periperal Interface

Serial Peripheral Interface (SPI) adalah salah satu protocol komunikasi serial yang sering digunakan karena sangat mudah dan sederhana. Faktanya, komunikasi SPI lebih mudah jika dibandingkan dengan komunikasi USART ataupun UART.

Sejak SPI diakui oleh dunia sebagai stAndar protocol komunikasi, SPI tersedia dan digunakan pada  berbagai macam mikrokontroler, seperti: 8051, ARM, PIC, AVR, dll. Hal ini menyebabkan kita dapat menghubungkan dua mikrokontroler dari arsitektur yang berbeda.

SPI banyak diaplikasikan seperti:

  1. Transmisi kabel data, (meski pilihan pertama adalah USART, tapi tidak ada salahnya jika menggunakan SPI karena lebih mudah)
  2. Transmisi wireless (nirkabel ) seperti pada Zigby, 2,4 GHz transmission, dll.
  3. Pemrograman AVR (upload file **.hex ke mikrokontroler) juga menggunakan SPI transfer.
  4. Perangakat komunikasi data dari sensor maupun peripheral device yang lain, seperti: IMU, Joystocik, Kompas, dll.

Keuntungan menggunakan Bus SPI adalah:

SPI menggunakan empat buah pin untuk berkomunikasi yang nantinya akan dijelaskan dibawah, sedangkan perangkat komunikasi lainnya menggunakan dua/tiga pin seperti I2C, TWI, USART, dll. Berikut adalah Keuntungan menggunakan Bus SPI:

  1. Sangat mudah dalam interfacenya (setup/inisialisasi dan pengiriman data lebih mudah dibandingkan dengan USART atau I2C).
  2. Komunikasi Full duplex.
  3. Konsumsi daya yang rendah dibanding dengan I2C dan masih banyak lagi.

Disamping itu, SPI juga memiliki kelemahan antara lain: Butuh sambungan atau koneksi yang lebih banyak, jadi lebih memakan pin dari mikrokontroler.

Master dan Slave dalam SPI

Dalam Komunikasi SPI, dua atau lebih  device yang terhubung yang salah satunya akan bertindak sebagai Master dan yang lainnya akan bertindak sebagai Slave.

Master Device adalah device yang memulai sambungan dan melakukan control transmisi data. Saat kedua device sudah terkoneksi, master dapat meminta request data baik mengirim data ataupun menerima data. Seperti pada penjelasan di atas, hal ini dinamakan koneksi FULL DUPLEX ,yaitu master device dapat mengirim data dan juga slave device juga dapat mengirim data pada saat yang bersamaan.

Pada penjelasan sebelumnya SPI menggunakan empat pin untuk berkomunikasi , berikut ini penjelasan bagaimana PIN dari SPI. SPI biasanya menggunakan empat pin untuk berkomunikasi. Yaitu MOSI, MISO, SCK dan  SS.

  1. MOSI berarti Master Output Slave Input, dimana pin ini digunakan sebagai Master mengirim data dan Slave sebagai penerima data.
  2. MISO berarti Master Input Slave Output, dimana pin ini digunakan sebagai Master bertindak sebagai penerima data dan Slave sebagai pengirim data.
  3. SCK, SPI Clock Line yang berarti clock yang digunakan untuk berkomunikasi (Komunikasi synchronous)
  4. SS artinya Slave Select. Jika SS bernilai 0 atau low maka Device bertindak sebagai slave dan jika bernilai 1 atau high maka device bertindak sebagai Master.

Di atas adalah penjelasan singkat dari SPI, mari kita beralih ke SPI pada AVR.

SPI pada AVR

SPI pada AVR merupakan salah satu peripheral sederhana dalam programingnya. AVR memiliki arsitektur 8 bit mikrokontroler, sehingga SPI pada AVR juga 8 bit. Bahkan Biasanya Bus SPI juga mempunyai nilai 8 bit. Pada AVR, port SPI berada pada PORT B baik untuk yang mempunyai kaki 28 ataupun 40.

Berikut PORT yang digunakan oleh SPI yang diambil dari datasheet :

Gambar 2 - SPI pins pada 28 pin ATmega8 (maxembedded.com)

Gambar 2 – SPI pins pada 28 pin ATmega8 (maxembedded.com)

Gambar 3 - SPI pins pada 40 pin ATmega16 or 32 (maxembedded.com)

Gambar 3 – SPI pins pada 40 pin ATmega16 or 32 (maxembedded.com)

Penjelasan Deskripsi dari register di AVR

Ada tiga register yang terdapat pada SPI di AVR:

  1. SPCR -> SPI Control Register merupakan register dari Master Device. Berisi Bit inisialisasi dari AVR dan kontrol data dari Master Device .
  2. SPSR -> SPI Status Register merupakan register status dari AVR, digunakan untuk membaca status komunikasi dari Bus SPI.
  3. SPDR -> SPI Data Register merupakan register data dari SPI dimana untuk membaca atau mengirim data yang sebenarnya.
  • SPI Control RegIster (SPCR)

Seperti namanya, SPCR adalah register untuk mengontrol dari SPI. Tedapat Bit dimana kita menemukan Bit untuk mengenable SPI, mengatur Clock atau kecepatan dari SPI, mengatur mode operasi seperti master/slave. Berikut ini adalah isi dari SPCR:

Gambar 4 - SPCR Register (maxembedded.com)

Gambar 4 – SPCR Register (maxembedded.com)

Bit 7: SPIE – SPI Interrupt Enable

SPIE adalah bit yang digunakan untuk mengaktikfkan interupsi dari SPI. Untuk mengaktifkannya, Global interrupt dari AVR harus diaktifkan terlebih dahulu. Set Bit ini pada kondisi high atau 1 untuk mengaktifkan interrupt SPI.

Bit 6: SPE – SPI Enable

SPE adalah Bit yang digunakan untuk mengaktifkan SPI secara keseluruhan. Jika bit ini di-set pada kondisi High atau 1 maka SPI akan aktif dan yang lain akan dimatikan. Saat SPI diaktifkan, port kaki dari AVR masih bisa berfungsi sebagai Input-Output itu sendiri.

Bit 5: DORD – Data Order

Data order adalah mode pengiriman apakah MSB dulu atau LSB dulu. Set Bit ini pada kondisi high atau 1 jika ingin mengirimkan 4 bit yang kecil (LSB) dulu. Namun jika ingin mengirim MSB dulu maka set bit ini pada kondisi low atau 0.

Bit 4: MSTR – Master/Slave Select

Bit ini digunakan untuk menyetting hardware sebagai Master atau sebagai Slave. Jika ingin menyetting sebagai master maka set bit ini pada kondisi High atau 1 (clock dihasilkan dari device lain). Jika bit di set low atau 0 maka device bertindak sebagai slave.

Bit 3: CPOL – Clock Polarity

Bit ini digunakan untuk memilih polaritas clock pada saat kondisi idle. Set bit ini pada kondisi high atau 1 untuk mengaktifkan clock tinggi pada saat idle, dan sebaliknya set bit ini low atau 0 untuk mengaktifkan clock rendah pada saat idle.

Artinya saat Bit CPOL bernilai low maka clock SCK akan bersifat Rising Edge, dan jika pada kondisi high maka SCK akan bersifat Falling Edge. (Rising adalah perubahan pulsa pada saat 0 ke 1, falling sebaliknya adalah kondisi pada saat pulsa berubah dari 1 ke 0).

Gambar 5 - CPOL Functionality (maxembedded.com)

Gambar 5 – CPOL Functionality (maxembedded.com)

Bit 2: CPHA – Clock Phase

Bit inidigunakanuntuk sampling data. Set Bit satuatau high untuk sampling data saat SCK dalam edge yang pertama, set bit 0 atau low untuk sampling data saatsckdalam edge yang kedua.

Gambar 6 - CPHA Functionality (maxembedded.com)

Gambar 6 – CPHA Functionality (maxembedded.com)

Bit 1,0: SPR1, SPR0 – SPI Clock Rate Select

Digunakan untuk memilih pembagi atau prescaller dari clock SPI, dimana FOSC merupakan singkatan dari clock internal atau frekuensi kristal external.

Gambar 7 - Frequency Divider (maxembedded.com)

Gambar 7 – Frequency Divider (maxembedded.com)

  • SPI Status Register (SPSR)

SPSR adalah register dimana terdapat status dari SPI maka Kita bisa membaca status dari Bus SPI dan membaca flag SPI interrupt. Berikut ini adalah daftar Bit yang ada di dalam SPSR:

Gambar 8 - SPSR Register (maxembedded.com)

Gambar 8 – SPSR Register (maxembedded.com)

Bit 7: SPIF – SPI Interrupt Flag

SPIF diatur setiap transfer data serial selesai. Interrupt akan diaktifkan jika sudah diset pada bit SPIE (Bit 7 SPCR) dan global interrupt (#SEI). Flag ini akan dihapus jika ISR sudah dieksekusi.

Bit 6: WCOL – Write Collision Flag

Write COLlision flag akan di-set jika data ditulis pada SPI Data Register, ketika ada data yang masuk namun SPI masih dalam kondisi sibuk.

Flag akan di-clear saat membaca data dari SPI Data Register ketika WCOL diatur. Saat kita memberikan perintah transfer data dengan benar, maka kesalahan tidak akan terjadi. Kita akan membahas cara untuk menghindari kesalahan saat transfer data dari Bus SPI.

Bit 5 hingga 1

Bit yang tidak terpakai.

Bit 0: SPI2x – SPI Double Speed Mode

SPI double speed adalah bit yang digunakan untuk mengatur kecepatan (double speed), biasanya akan mengurangi frequensi divider (prescaller pembagi frekuensi). Bit ini  yang akan digunakan untuk menambah speed dari SPI, biasanya digunakan untuk komunikasi yang lebih tinggi kecepatannya. Set bit ini pada kondisi high jika ingin mengaktifkan mode ini.

  • SPI Data Register (SPDR)

SPI Data register adalah register yang digunakan untuk menyimpan data baik yang akan dikirim maupun yang sudah di terima.

Gambar 9 - SPDR Register (maxembedded.com)

Gambar 9 – SPDR Register (maxembedded.com)

Bit ke 7 adalah bit Most Significant Bit (MSB) dan Bit yang ke 0 adalah bit Least Significant Bit (LSB). Sekarang kita bisa sambungkan ke Bit ke 5 SPCR, jika MSB yang dikirim duluan maka Bit 4 hingga 7 dari data registerlah yang akan dikirim pertama, namun jika LSB yang dikirim pertama maka Bit 0 hingga Bit 3 lah yang akan dikirim duluan.

Data Mode

Pada bus SPI, terdapat empat mode komunikasi data, yaitu SPI mode 0, 1, 2 dan 3. Yang membedakan mereka adalah clock dalam pengiriman data. Hal ini sesuai dengan pengaturan register CPOL dan CPHA Bit.

Tabel dibawah ini menjelaskan mode komunikasi dan timing diagram SPI.

Gambar 10 - Data modes (maxembedded.com)

Gambar 10 – Data modes (maxembedded.com)

Slave Select (SS’) PIN

Seperti penjelasan diatas, kode program SPI memang lebih mudah daripada UART, namun inti permasalahnya adalah pada pin SS’ ini. Pin SS’ ini bekerja “active low”,  jadi saat ingin mengaktifkan mode slave maka pin ini di-set pada kondisi Low atau 0 dan sebaliknya jika di-set sebagai master maka pin di-set pada kondisi High atau 1.

Saat pin SS’ sebagai output, pin SS’ juga bisa digunakan sebagai pin input atau output. Pin SS ini sebenarnya mempunyai fungsi yang menarik, namun pertanyaannya mengapa kita harus mengatur pin ini?

Jawabannya adalah, saat kita berkomunikasi dengan banyak macam device dan bekerja pada Bus SPI yang sama, pin SS’ ini digunakan untuk memilih slave device yang akan berkomunikasi dengan kita.

Untuk memahaminya mari kita baca kasus dibawah ini:

  • Saat ada beberapa Slave device dan hanya ada satu master device.

Dalam halini pin SS’ dari slave device terkoneksi ke master device. Karena kita ingin hanya satu slave device yang lebih spesifik untuk menerima data, maka master device akan mengirimkan sinyal low ke Pin SS’ ke mikrokontroler slave device yang spesifik karena Slave Device tersebut yang akan menerima data.

  • Saat ada beberapa master device dan hanya ada satu slave device.

Konfigurasi yang sama juga bisa digunakan di mode seperti inijuga. Namun dalam kondisi ini pin SS’ semua master dikendalikan oleh satu slave device. Slave device memilih master yang akan menerima data dengan memberikan sinyal High atau 1 pada pin SS’ master. Hal Ini juga digunakan untuk system multiplexer dimana pin SS’ dari semua master dikendalikan oleh slave device secara bergantian.

Jika artikel ini bermanfaat buat Anda, mohon untuk di Share because “Sharing is Caring”

Referensi :  maxembedded.com

COMMENTS

Loading Facebook Comments ...