9. Akses SPI (Serial Peripheral Interface) Pada AVR ATMEGA 16/32/8535
9. Akses SPI (Serial Peripheral Interface) Pada AVR ATMEGA 16/32/8535

Pengantar

SPI merupakan antarmuka bus yang diprakarsai oleh Motorola Corp. SPI menggunakan 4 pin untuk komunikasi:

  • SDI (Serial Data Input) --> untuk menerima data dari slave
  • SDO (Serial Data Output) --> untuk mengirim data ke slave
  • SCLK (Serial Clock) --> untuk sinkronisasi transfer data (hanya dihasilkan master)
  • CS (Chip Select) --> untuk memilih slave (hanya master yang bisa)

SPI memiliki register geser 8-bit yang digunakan untuk mengirim dan menerima data. Saat master mengirim data, maka master meletakkan data di register geser dan master membangkitkan clock yang dibutuhkan. Saat master membaca data, maka slave meletakkan data di register geser dan master membangkitkan clock yang dibutuhkan. SPI adalah komunikasi full duplex (data yang berada pada register geser master dan slave dapat ditukar pada saat yang sama).

Berikut ini fitur-fitur antarmuka SPI :

  • Full-Duplex, Transfer data Sinkron 3 kabel
  • Dapat beroperasi sebagai Master atau Slave
  • Transfer data à bisa LSB atau MSB dahulu yang dikirim
  • Terdapat 7 macam Laju kecepatan bit (Bit Rate) yang bisa diprogram
  • Terdapat Flag interupsi pada akhir transmisi data
  • Terdapat Flag untuk proteksi terjadinya penulisan data saat transfer data sedang berlangsung
  • Terdapat fitur “membangunkan” dari mode Idle
  • Kecepatan ganda (CK/2) saat mode master

ATMEGA16/32/8535 memiliki modul SPI bawaan. MCU ini dapat bertindak sebagai master dan slave. Pin komunikasi SPI pada AVR adalah:

  • MISO (Master In Slave Out)
  • MOSI (Master Out Slave In)
  • SCK (Shift Clock)
  • SS (Slave Select)
Pinout ATMEGA 16 sama dengan ATMEGA8535 dan ATMEGA32

.

.


Register-Register SPI

Terdapat 3 register di dalam SPI:

  • SPCR (SPI Control Register)
  • SPSR (SPI Status Register)
  • SPDR (SPI Data Register)

.

SPI Control Register – SPCR

  • Bit 7 – SPIE: SPI Interrupt Enable. Saat bit ini  = ‘1’, bit – I pada register SREG dan bit SPIF=‘1’  pada register SPSR maka interupsi SPI diaktifkan. Jika bit ini = ‘0’ maka interupsi SPI tidak aktif.
  • Bit 6 – SPE: SPI Enable. Saat bit SPE = ‘1’ maka SPI aktif. Jika sebaliknya maka SPI tidak aktif.
  • Bit 5 – DORD: Data Order. Saat bit DORD = ‘1’ maka bit LSB dikirim dahulu. Jika sebaliknya maka MSB dikirim dahulu.
  • Bit 4 – MSTR: Master/Slave Select. Atur bit ini  = ‘1’ untuk mode Master dan atur bit ini = ‘0’ untuk mode Slave.
  • Bit 3 – CPOL: Clock Polarity. Jika bit CPOL = ‘1’ maka SCK high saat kondisi idle. Jika bit CPOL = ‘0’ maka SCK low saat kondisi idle.

.

  • Bit 2 – CPHA: Clock Phase. Jika bit CPHA = ‘1’ maka sampling data terjadi pada tepi akhir clock SCK. Jika bit CPHA = ‘0’ maka sampling data terjadi pada tepi awal clock SCK.

.

  • Bits 1, 0 – SPR1, SPR0: SPI Clock Rate Select 1 and 0. Bit-bit ini digunakan untuk mengatur frekuensi clock SCK.

SPI Status Register – SPSR

  • Bit 7 – SPIF: SPI Interrupt Flag. Flag ini diset = ‘1’ saat transfer data serial selesai. Juga dapat diset = ‘1’ saat kaki SS dijadikan = ‘0’ pada mode Master. Bit ini dapat membangkitkan interupsi saat bit SPIE pada register SPCR dan bit – I pada register SREG (interupsi global) diaktifkan.
  • Bit 6 – WCOL: Write COLlision flag. Bit ini diset = ‘1’ jika terjadi penulisan data pada Register Data SPI (SPDR) saat transfer data sedang berlangsung.
  • Bit 5..1 – Res: Reserved Bits.
  • Bit 0 – SPI2X: Double SPI Speed Bit. Saat bit ini diset = ‘1’ maka frekuensi SCK digandakan.

SPI Data Register – SPDR

Register ini adalah register baca/tulis yang digunakan untuk mengirim data antara file register dan register geser SPI. Penulisan data pada register SPDR akan mentrigger transmisi data. Pembacaan data dari register SPDR menyebabkan buffer penerima pada register geser (Shift Register Receive buffer) dibaca.


Mode SPI Pada ATMEGA16/32/8535

Mode Master

  • Master menulis data pada register SPDR, penulisan ini dapat mentrigger transmisi data
  • Data 8-bit (1 byte) mulai bergerser menuju slave dan setelah menyelesaikan pergeseran byte ini, pembangkit clock SPI berhenti dan bit SPIF diset = ‘1’.

Mode Slave

  • Antarmuka SPI sebagai slave akan tetap dalam kondisi “sleep” selama pin SS slave diset = ‘1’ oleh master
  • Slave hanya aktif saat pin SS diset = ‘0’ oleh master. Selama operasi penulisan, Data pada slave akan bergeser menuju master bersamaan dengan masuknya clock SCK dari master
  • Bit SPIF bernilai ‘1’ setelah selesai proses pergeseran byte ini.

Pin SS SPI Pada ATMEGA16/32/8535

Kegunaan Pin SS Pada Mode Master

  • Pada mode ini pin SS digunakan sebagai pin GPIO
  • Untuk memilih piranti slave, atur pin SS sebagai output
  • Perhatikan, jika pin SS diatur sebagai input maka untuk pin SS harus diset ‘1’ atau pull-up pada mode master
  • Jika pin SS telah diset sebagai input pada mode master dan diset ‘0’ oleh rangkaian eksternal, maka sistem SPI mengenali ini sebagai master lain yang memilih SPI sebagai slave karena pin SS ini active low
  • Kondisi ini akan membuat bit MSTR pada register SPCR = ‘0’ dan SPI akan menjadi mode Slave

Kegunaan Pin SS Pada Mode Slave

  • Pada mode ini, pin SS selalu diatur sebagai input
  • Saat pin SS low maka antarmuka SPI aktif
  • Dan jika pin SS diset = ‘1’ oleh master, maka SPI di-reset dan tidak menerima data yang masuk

Pemrograman SPI Master & Slave

Master

  1. Initialization steps
  2. Write steps
  3. Read steps

.

1. SPI Master Initialization steps

  • Jadikan pin MOSI, SCK, dan SS sebagai pin output
  • Jadiklan pin MISO sebagai pin input
  • Atur pin SS High atau pull-up
  • Aktifkan SPI mode master dengan mengatur bit SPE & MSTR pada register SPCR = ‘1’
  • Atur kombinasi bit kecepatan clock SPI (SPR0, SPR1 dan SPI2X) untuk menentukan frekuensi SCK

.

2. SPI Master Write steps

  • Salin data yang akan dikirim pada regiter SPDR
  • Tunggu sampai pengiriman data selesai. Misal periksa flag SPIF sampai menjadi High
  • Saat flag SPIF High, baca SPDR menggunakan buffer pengosongan (flush)
  • Flag SPIF akan dijadikan Low oleh Hardware saat MCU menjalankan interupsi yang sesuai (ISR SPI)
  • Alternatif untuk menjadikan flag SPIF Low adalah dengan cara membaca register SPSR dengan nilai SPIF = ‘1’ kemudian mengakses register SPDR

SPI_Write function

  • Input argument: data yang akan dikirim

.

3. SPI Master Read steps

  • Dikarenakan penulisan data pada register SPDR membangkitkan clock SCK untuk transmisi maka tulis data sembarang/dummy pada register SPDR
  • Tunggu sampai transmisi data selesai. Misal periksa flag SPIF sampai menjadi High
  • Saat flag SPIF High, baca data yang diterima pada register SPDR

SPI_Read function

  • Return value: data char yang diterima

.

Slave

  1. Initialization steps
  2. Transmit steps
  3. Receive steps

1. SPI Slave Initialization steps

  • Jadikan pin MOSI, SCK, dan SS sebagai pin input
  • Jadiklan pin MISO sebagai pin output
  • Aktifkan SPI mode slave dengan mengatur bit SPE = ‘1’ & MSTR = ‘0’ pada register SPCR

.

2. SPI Slave transmit steps

  • Slave transmit ini memiliki function dan langkah-langkah yang sama dengan SPI Master Write

.

3. SPI Slave Receive steps

  • Tunggu sampai bit SPIF menjadi High
  • Baca data yang diterima dari register SPDR

SPI_Read function

  • Return value: data char yang diterima

Contoh Program SPI

Buat komunikasi SPI menggunakan AVR ATMEGA16 (Master) dan ATMEGA8535 (Slave). Dalam contoh ini master mengirim angka secara terus menerus ke slave. (untuk LCD 16x2 menggunakan mode 4 bit terletak pada PORT D, silahkan dicek pada link di bawah untuk program lengkapnya).

Perlu diingat: Ground dan VCC harus dijadikan satu antara Master dan Slave.

Program Master

.

/*
 * SPI MASTER1.c
 *
 * Created: 28/01/2023 8:47:58
 * Author : DELL
 */ 


#define F_CPU 8000000UL			/* Define CPU Frequency 8MHz */
#include <avr/io.h>			/* Include AVR std. library file */
#include <util/delay.h>			/* Include Delay header file */
#include <stdio.h>			/* Include Std. i/p o/p file */
#include <string.h>			/* Include String header file */
#include "LCD_16x2_H.h"		/* Include LCD header file */
#include "SPI_Master_H_file.h"		/* Include SPI master header file */

int main(void)
{
	uint8_t count;
	char buffer[5];
	
	LCD_Init();
	SPI_Init();
	
	LCD_String_xy(0, 0, "Master Device");
	LCD_String_xy(1, 0, "TX Data:    ");
	SS_Enable;
	count = 0;
	while (1)			/* Send Continuous count */
	{
		SPI_Write(count);
		sprintf(buffer, "%d   ", count);
		LCD_String_xy(1, 9, buffer);
		count++;
		_delay_ms(500);
	}
	
}

Program Slave

.

/*
 * SPI SLAVE1.c
 *
 * Created: 28/01/2023 9:28:19
 * Author : DELL
 */ 


#define F_CPU 8000000UL			/* Define CPU Frequency 8MHz */
#include <avr/io.h>			/* Include AVR std. library file */
#include <util/delay.h>			/* Include Delay header file */
#include <stdio.h>			/* Include std. i/p o/p file */
#include <string.h>			/* Include string header file */
#include "LCD_16x2_H.h"		/* Include LCD header file */
#include "SPI_Slave_H_file.h"		/* Include SPI slave header file */

int main(void)
{
	uint8_t count;
	char buffer[5];
	
	LCD_Init();
	SPI_Init();
	
	LCD_String_xy(0, 0, "Slave Device");
	LCD_String_xy(1, 0, "RX Data:    ");
	while (1)			/* Receive count continuous */
	{
		count = SPI_Receive();
		sprintf(buffer, "%d   ", count);
		LCD_String_xy(1, 9, buffer);
	}

}

Video Demo (Terdapat 2 video):

.


Berikut ini link semua program di atas:

https://drive.google.com/file/d/14qI9VFbCboeFXUGtjRlkPXaGGp9P1sEB/view?usp=sharing

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *