- Apa itu Protokol Komunikasi SPI?
- Bagaimana Protokol SPI Bekerja?
- Perbedaan antara Komunikasi I2C dan SPI
- SPI dengan PIC16F877A menggunakan XC8 Compiler:
- Penjelasan File Header SPI:
- Penjelasan Program Utama:
- Mensimulasikan PIC dengan SPI debugger:
PIC Microcontrollers adalah platform yang kuat yang disediakan oleh microchip untuk proyek tertanam; sifatnya yang serba guna telah memungkinkannya menemukan jalan ke dalam banyak aplikasi dan belum berkembang pesat. Jika Anda telah mengikuti tutorial PIC kami maka Anda akan memperhatikan bahwa kami telah membahas berbagai tutorial tentang mikrokontroler PIC mulai dari yang paling dasar. Dalam aliran yang sama kami melanjutkan untuk mempelajari protokol komunikasi yang tersedia dengan PIC dan cara menggunakannya. Kami telah membahas I2C dengan Mikrokontroler PIC.
Dalam sistem aplikasi tertanam yang luas, tidak ada mikrokontroler yang dapat melakukan semua aktivitas dengan sendirinya. Pada beberapa tahap waktu itu harus berkomunikasi dengan perangkat lain untuk berbagi informasi, ada banyak jenis protokol komunikasi untuk berbagi informasi ini, tetapi yang paling banyak digunakan adalah USART, IIC, SPI dan CAN. Setiap protokol komunikasi memiliki kelebihan dan kekurangannya masing-masing. Mari fokus pada Protokol SPI untuk saat ini karena itulah yang akan kita pelajari dalam tutorial ini.
Apa itu Protokol Komunikasi SPI?
Istilah SPI adalah singkatan dari " Serial Peripheral Interface ". Ini adalah protokol komunikasi umum yang digunakan untuk mengirim data antara dua mikrokontroler atau untuk membaca / menulis data dari sensor ke mikrokontroler. Ini juga digunakan untuk berkomunikasi dengan kartu SD, register geser, pengontrol tampilan dan banyak lagi.
Bagaimana Protokol SPI Bekerja?
Komunikasi SPI adalah komunikasi sinkron, artinya bekerja dengan bantuan sinyal clock yang dibagi antara dua perangkat yang saling bertukar data. Juga merupakan komunikasi full-duplex karena dapat mengirim dan menerima data menggunakan bus terpisah. The komunikasi SPI membutuhkan 5 kabel untuk beroperasi. Sirkuit komunikasi SPI sederhana antara master dan slave ditampilkan di bawah ini
Lima kabel yang diperlukan untuk komunikasi adalah SCK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) dan SS (Slave Select). Komunikasi SPI selalu terjadi hanya antara tuan dan budak. Seorang master dapat memiliki banyak budak yang terhubung dengannya. Master bertanggung jawab untuk menghasilkan pulsa jam dan hal yang sama dibagikan dengan semua budak. Juga semua komunikasi hanya dapat dimulai oleh master.
Pin SCK (alias jam seri-SCL) berbagi sinyal clock yang dihasilkan oleh master dengan budak. Pin MOSI (alias SDA –Serial Data Out) digunakan untuk mengirim data dari master ke salep. Pin MISO (alias SDI - Serial Data In) digunakan untuk mendapatkan data dari salep ke master. Anda juga bisa mengikuti tanda panah pada gambar di atas untuk memahami pergerakan data / sinyal. Terakhir, pin SS (alias CS –Chip select) digunakan jika ada lebih dari satu modul slave yang terhubung ke master. Ini di dapat digunakan untuk memilih budak yang dibutuhkan. Rangkaian sampel di mana lebih dari satu budak terhubung dengan master untuk komunikasi SPI ditunjukkan pada rangkaian di bawah ini.
Perbedaan antara Komunikasi I2C dan SPI
Kita telah mempelajari komunikasi I2C dengan PIC dan karenanya kita harus terbiasa dengan cara kerja I2C dan di mana kita dapat menggunakannya seperti I2C dapat digunakan untuk antarmuka modul RTC. Tapi sekarang, kenapa kita membutuhkan protokol SPI padahal kita sudah memiliki I2C. Alasannya adalah komunikasi I2C dan SPI merupakan keunggulan dengan caranya sendiri dan karenanya spesifik untuk aplikasi.
Sampai batas tertentu, komunikasi I2C dapat dianggap memiliki beberapa keunggulan dibandingkan komunikasi SPI karena I2C menggunakan jumlah pin yang lebih sedikit dan menjadi sangat berguna ketika ada sejumlah besar budak yang terhubung ke bus. Tetapi kelemahan dari I2C adalah ia memiliki bus yang sama untuk mengirim dan menerima data dan karenanya relatif lambat. Jadi ini murni berdasarkan aplikasi untuk memutuskan antara protokol SPI dan I2C untuk proyek Anda.
SPI dengan PIC16F877A menggunakan XC8 Compiler:
Cukup dasar-dasarnya, sekarang mari kita pelajari bagaimana kita dapat menggunakan komunikasi SPI pada mikrokontroler PIC16F877A menggunakan kompiler MPLABX IDE dan XC8. Sebelum kita mulai menjelaskan bahwa tutorial ini hanya berbicara tentang SPI di PIC16F877a menggunakan kompiler XC8, prosesnya akan sama untuk mikrokontroler lain tetapi mungkin diperlukan sedikit perubahan. Juga ingat bahwa untuk mikrokontroler tingkat lanjut seperti seri PIC18F, kompiler itu sendiri mungkin memiliki beberapa perpustakaan built-in untuk menggunakan fitur SPI, tetapi untuk PIC16F877A tidak ada yang seperti itu, jadi mari kita buat sendiri. Pustaka yang dijelaskan di sini akan diberikan sebagai file header untuk diunduh di bagian bawah yang dapat digunakan untuk PIC16F877A untuk berkomunikasi dengan perangkat SPI lainnya.
Dalam tutorial ini kita akan menulis program kecil yang menggunakan komunikasi SPI untuk menulis dan membaca data dari bus SPI. Kami kemudian akan memverifikasi yang sama menggunakan simulasi Proteus. Semua kode yang terkait dengan register SPI akan dibuat di dalam file header bernama PIC16f877a_SPI.h. Dengan cara ini kita dapat menggunakan file header ini di semua proyek mendatang yang memerlukan komunikasi SPI. Dan di dalam program utama kita hanya akan menggunakan fungsi dari file header. Kode lengkap beserta file header dapat diunduh dari sini.
Penjelasan File Header SPI:
Di dalam file header kita harus menginisialisasi komunikasi SPI untuk PIC16F877a. Seperti biasa, tempat terbaik untuk memulai adalah lembar data PIC16F877A. Register yang mengontrol komunikasi SPI untuk PIC16F8777a adalah SSPSTAT dan SSPCON Register. Anda dapat tentangnya di halaman 74 dan 75 dari lembar data.
Ada banyak opsi parameter yang harus dipilih saat menginisialisasi komunikasi SPI. Opsi yang paling umum digunakan adalah frekuensi clock akan disetel ke Fosc / 4 dan akan dilakukan di tengah dan jam akan disetel serendah mungkin pada kondisi ideal. Jadi kami juga menggunakan konfigurasi yang sama untuk file header kami, Anda dapat dengan mudah mengubahnya dengan mengubah bit masing-masing.
SPI_Initialize_Master ()
Fungsi Master inisialisasi SPI digunakan untuk memulai komunikasi SPI sebagai master. Di dalam fungsi ini kami mengatur pin RC5 dan RC3 masing-masing sebagai pin keluaran. Kemudian kami mengkonfigurasi SSPTAT dan register SSPCON untuk mengaktifkan komunikasi SPI
batal SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // hal 74/234 SSPCON = 0b00100000; // hal 75/234 TRISC3 = 0; // Set sebagai output untuk mode slave }
SPI_Initialize_Slave ()
Fungsi ini digunakan untuk mengatur mikrokontroler agar bekerja dalam mode slave untuk komunikasi SPI. Selama mode slave, pin RC5 harus disetel sebagai output dan pin RC3 harus disetel sebagai input. SSPSTAT dan SSPCON diatur dengan cara yang sama untuk slave dan master.
batal SPI_Initialize_Slave () { TRISC5 = 0; // Pin SDO harus dideklarasikan sebagai output SSPSTAT = 0b00000000; // hal 74/234 SSPCON = 0b00100000; // hal 75/234 TRISC3 = 1; // Atur sebagai keluar untuk mode master }
SPI_Write (karakter masuk)
Fungsi Tulis SPI digunakan untuk menulis data ke dalam bus SPI. Ia mendapatkan informasi dari pengguna melalui variabel yang masuk dan kemudian menggunakannya untuk diteruskan ke register Buffer. SSPBUF akan dihapus dalam pulsa Jam yang berurutan dan data akan dikirim ke bus sedikit demi sedikit.
batal SPI_Write (karakter masuk) { SSPBUF = masuk; // Tulis data yang diberikan pengguna ke buffer }
SPI_Ready2Read ()
Fungsi SPI ready to Read digunakan untuk mengecek apakah data pada bus SPI sudah diterima dengan lengkap dan dapat dibaca. Register SSPSTAT memiliki bit yang disebut BF yang akan disetel setelah data diterima sepenuhnya, jadi kami memeriksa apakah bit ini disetel jika tidak disetel maka kami harus menunggu sampai disetel untuk membaca apa pun dari bus SPI.
unsigned SPI_Ready2Read () { if (SSPSTAT & 0b00000001) return 1; lain kembali 0; }
SPI_Read ()
SPI Read digunakan untuk membaca data dari bus SPI ke mikrokontroler. Data yang ada di bus SPI akan disimpan di SSPBUF, kita harus menunggu sampai data lengkap disimpan di Buffer dan kemudian kita dapat membacanya menjadi variabel. Kami memeriksa bit BF register SSPSTAT sebelum membaca buffer untuk memastikan penerimaan data selesai.
char SPI_Read () // Membaca data yang diterima { while (! SSPSTATbits.BF); // Tahan hingga bit BF disetel, untuk memastikan data lengkap sudah dibaca kembali (SSPBUF); // kembalikan data yang telah dibaca }
Penjelasan Program Utama:
Fungsi yang dijelaskan pada bagian di atas akan ada di file header dan bisa dipanggil ke file c utama. Jadi mari kita tulis program kecil untuk memeriksa apakah komunikasi SPI berfungsi. Kami hanya akan menulis beberapa data ke dalam bus SPI dan menggunakan simulasi proteus untuk memeriksa apakah data yang sama diterima di debugger SPI.
Seperti biasa, mulailah program dengan mengatur bit konfigurasi dan kemudian sangat penting untuk menambahkan file header yang baru saja kami jelaskan ke dalam program seperti yang ditunjukkan di bawah ini
#include
Jika Anda telah membuka program dari file zip yang diunduh di atas maka secara default file header akan ada di dalam direktori file header dari file proyek Anda. Jika tidak, Anda harus menambahkan file header secara manual di dalam proyek Anda, setelah menambahkan file proyek Anda akan terlihat seperti ini di bawah ini
Di dalam file utama kita harus menginisialisasi PIC sebagai Master untuk komunikasi SPI dan kemudian di dalam loop sementara yang tak terbatas kita akan menulis tiga nilai hex acak ke dalam bus SPI untuk memeriksa apakah kita menerima yang sama selama simulasi.
batal main () { SPI_Initialize_Master (); sementara (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Perhatikan bahwa nilai acak yang digunakan dalam program ini adalah 0A, 0F dan 15 dan mereka adalah nilai hex jadi kita akan melihat hal yang sama selama simulasi. Itu saja kode sudah selesai, ini hanya contoh tetapi kita dapat menggunakan metodologi yang sama untuk berkomunikasi dengan MCU lain atau dengan modul sensor lain yang beroperasi pada protokol SPI.
Mensimulasikan PIC dengan SPI debugger:
Sekarang program kita sudah siap, kita dapat mengkompilasinya dan kemudian melanjutkan dengan simulasi. Proteus memiliki fitur praktis yang bagus yang disebut debugger SPI , yang dapat digunakan untuk memantau data melalui bus SPI. Jadi kami menggunakan yang sama dan membangun sirkuit seperti yang ditunjukkan di bawah ini.
Karena hanya ada satu perangkat SPI dalam simulasi, kami tidak menggunakan pin SS dan bila tidak digunakan harus diardekan seperti yang ditunjukkan di atas. Cukup muat file hex ke dalam mikrokontroler PIC16F877A dan klik tombol putar untuk mensimulasikan program kami. Setelah simulasi dimulai, Anda akan mendapatkan jendela pop-up yang menampilkan data di bus SPI seperti yang ditunjukkan di bawah ini
Mari kita lihat lebih dekat data yang masuk dan periksa apakah itu sama dengan yang kita tulis di program kita.
Data diterima dalam urutan yang sama dengan yang kami tulis di program kami dan hal yang sama disorot untuk Anda. Anda juga dapat mencoba mensimulasikan program untuk berkomunikasi dengan dua mikrokontroler PIC menggunakan protokol SPI. Anda harus memprogram satu PIC sebagai master dan yang lainnya sebagai budak. Semua file header yang diperlukan untuk tujuan ini sudah diberikan di file header.
Ini hanya sekilas tentang apa yang dapat dilakukan SPI, ia juga dapat membaca dan menulis data ke banyak perangkat. Kami akan membahas lebih lanjut tentang SPI dalam tutorial kami yang akan datang dengan menghubungkan berbagai modul yang bekerja dengan protokol SPI.
Semoga Anda memahami proyek ini dan belajar sesuatu yang bermanfaat darinya. Jika Anda ragu posting mereka di bagian komentar di bawah atau gunakan forum untuk bantuan teknis.
Kode Utama Lengkap telah diberikan di bawah ini; Anda dapat mengunduh file header dengan semua kode dari sini