Serial Peripheral Interface (SPI) NUC140

Pendahuluan: Apa yang salah dengan UART?

Serial Peripheral Interface (SPI) adalah sebuah bus antarmuka yang biasanya digunakan untuk mengirimkan data antara mikrokontroler dan periferal seperti shift registers, sensor, dan SD cards. Menggunakan jalur clock dan data terpisah, termasuk jalur pilih atau select untuk piranti yang diajak berkomunikasi.

Lantas apakah ada masalah dengan komunikasi serial UART yang selama ini dikenal dan digunakan? Begini… Segala sesuatu bekerja dengan baik-baik saja hingga di saat dibutuhkan bit-bit START maupun STOP  yang lebih banyak untuk setiap byte yang dikirimkan dan perangkat keras yang kompleks dibutuhkan untk mengirim dan menerima data.

Dan sebagaimana diketahui, jika kedua sisi (penerima dan pengirim) tidak memiliki kecepatan yang sama, maka data yang diterima berubah menjadi ‘sampah’! Hal ini dikarenakan penerima mencuplik setiap bit pada waktu yang benar-benar tepat (lihat panah pada gambar)! Salah waktu mencuplik, salah mendapatkan bit-bitnya.

01

Solusinya adalah dengan sinkronisasi

Satu alasan mengapa SPI menjadi begitu populer adalah perangkat keras penerima dapat hanya berupa register geser sederhana. Tentunya ini menjadi solusi yang sangat sederhana (dan sekaligus murah), dibandingkan dengan rangkaian untuk komunikasi serial UART (Universal Asynchronous Receiver or Transmitter). Perhatikan ilustrasi menerima data pada gambar berikut…

02

Nampak adanya tiga jalur komunikasi: SCK (jalur detak yang berasal dari master, sehingga SPI digolongkan sebagai komunikasi ter-sinkron), MOSI (Master-Out Slave-In, jalur data dari master ke slave) dan MISO (Master-In Slave-Out, jalur data dari slave ke master). Ada satu lagi jalur yang harus dihubungkan, yaitu GND, hanya tidak digambarkan pada ilustrasi tersebut.

Masih ada satu lagi jalur yaitu SS atau Slave Select, yang digunakan untuk memilih piranti SPI mana yang akan dituju untuk pengiriman data dari master, mengingat bisa lebih dari piranti SPI yang terhubung pada satu port SPI. Perhatikan ilustrasi berikut (dalam hal ini SS-nya bersifat active-low)…

03

Multiple Slave

Sedangkan untuk koneksi beberapa piranti sekaligus (multiple slave) pada satu jalur SPI ditunjukkan pada dua gambar berikut.

Master menggunakan beberapa pin atau jalur SS untuk mengakses piranti SPI tertentu.

Master menggunakan beberapa pin atau jalur SS untuk mengakses piranti SPI tertentu.

Master mengakses piranti SPI hanya dengan satu jalur SS, namun rangkaian daisy-chain untuk MOSI dan MISO-nya.

Master mengakses piranti SPI hanya dengan satu jalur SS, namun rangkaian daisy-chain untuk MOSI dan MISO-nya.

Fitur antarmuka SPI pada NUC140

  • Frekuensi detak atau clock SPI-nya mencapai 20 MHz dengan mode master dan 10 MHz pada mode slave.
  • Bisa dihubungkan hingga 8 (delapan) piranti untuk satu jalur SPI-nya (terdapat 4 jalur SPI di NUC140: SPI0, SPI1, SPI2 dan SPI3).
  • Mendukung transfer I/O dua-kanal.
  • Automatic slave select.
  • Polaritas clock dan pewaktuan transfer (transfer timing) bisa diatur.
  • SPI0:
    • SPI0CS/GPC0 : pin 45
    • SPI0CLK/GPC1 : pin 44
    • SPI0DI(MISO)/GPC2 : pin 43
    • SPI0DO(MOSI)/GPC3 : pin 42
  • SPI1:
    • SPI1CS/GPC8 : pin 61
    • SPI1CLK/GPC9 : pin 60
    • SPI1DI(MISO)/GPC10 : pin 59
    • SPI1DO(MOSI)/GPC11 : pin 58
  • SPI2:
    • SPI2CS/GPD0 : pin 81
    • SPI2CLK/GPD1 : pin 82
    • SPI2DI(MISO)/GPD2 : pin 83
    • SPI2DO(MOSI)/GPD3 : pin 84
  • SPI3:
    • SPI3CS/GPD8 : pin 13
    • SPI3CLK/GPD9 : pin 14
    • SPI3DI(MISO)/GPD10 : pin 15
    • SPI3DO(MOSI)/GPD11 : pin 16

Pin SPI pada NUC140 Learning Board

Untuk penggunaan jalur SPI pada NUC140 Learning Board mengikuti tabel berikut.

Pemetaan pin SPI pada NUC140 Learning Board

Pemetaan pin SPI pada NUC140 Learning Board

Terlihat bahwa masing-masing jalur SPI sudah digunakan untuk piranti I2S Codec (SPI0), SD/MMC (SPI1), EEPROM (SPI2) dan penggerak LCD (SPI3). Untuk melakukan inisialisasi modul SPI, misalnya untuk aplikasi yang menggunakan LCD bisa menggunakan cuplikan atau potongan program berikut (CooCox IDE):

  • CLK_SetModuleClock(SPI3_MODULE, CLK_CLKSEL1_SPI3_S_HCLK, MODULE_NoMsk);
  • CLK_EnableModuleClock(SPI3_MODULE);

Adapun parameter yang digunakan pada fungsi CLK_SetModuleClock() adalah:

  • uint32_t u32ModuleIdx,
  • uint32_t u32ClkSrc, dan
  • uint32_t u32ClkDiv.

Dengan berbagai macam kombinasi untuk SPI0 s/d SPI3 sebagai berikut:

  • SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk;
  • SPI0_MODULE, CLK_CLKSEL1_SPI0_S_PLL, MODULE_NoMsk;
  • SPI1_MODULE, CLK_CLKSEL1_SPI1_S_HCLK, MODULE_NoMsk;
  • SPI1_MODULE, CLK_CLKSEL1_SPI1_S_PLL, MODULE_NoMsk;
  • SPI2_MODULE, CLK_CLKSEL1_SPI2_S_HCLK, MODULE_NoMsk;
  • SPI2_MODULE, CLK_CLKSEL1_SPI2_S_PLL, MODULE_NoMsk;
  • SPI3_MODULE, CLK_CLKSEL1_SPI3_S_HCLK, MODULE_NoMsk;
  • SPI3_MODULE, CLK_CLKSEL1_SPI3_S_PLL, MODULE_NoMsk;

Sedangkan untuk fungsi CLK_EnableModuleClock(), parameternya bisa diisi dengan:

  • SPI0_MODULE
  • SPI1_MODULE
  • SPI2_MODULE
  • SPI3_MODULE

Contoh untuk setup SPI3 multi-function pin:

  • SYS->GPD_MFP = (SYS->GPD_MFP & ~(SYS_GPD_MFP_PD8_Msk | SYS_GPD_MFP_PD9_Msk | SYS_GPD_MFP_PD10_Msk | SYS_GPD_MFP_PD11_Msk)) | (SYS_GPD_MFP_PD8_SPI3_SS0 | SYS_GPD_MFP_PD9_SPI3_CLK | SYS_GPD_MFP_PD10_SPI3_MISO0 | SYS_GPD_MFP_PD11_SPI3_MOSI0);

terima kasih!

Advertisements
This entry was posted in learning board, nuc140, spi and tagged , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s