- Apa itu Protokol Komunikasi SPI?
- Bagaimana Protokol SPI Berfungsi?
- Perbezaan antara Komunikasi I2C dan SPI
- SPI dengan PIC16F877A menggunakan XC8 Compiler:
- Penjelasan Fail Header SPI:
- Penjelasan program utama:
- Simulasi PIC dengan debugger SPI:
PIC Microcontrollers adalah platform hebat yang disediakan oleh microchip untuk projek terbenam; sifatnya yang serba boleh membolehkannya mencari jalan ke dalam banyak aplikasi dan masih banyak berkembang. Sekiranya anda mengikuti tutorial PIC kami, maka anda akan menyedari bahawa kami telah merangkumi pelbagai tutorial mengenai mikrokontroler PIC bermula dari asasnya. Dalam aliran yang sama, kami terus mempelajari protokol komunikasi yang tersedia dengan PIC dan cara menggunakannya. Kami telah menutup I2C dengan PIC Microcontroller.
Dalam sistem aplikasi tertanam yang luas, tidak ada pengawal mikro yang dapat melakukan semua aktiviti dengan sendirinya. Pada tahap tertentu ia perlu berkomunikasi dengan peranti lain untuk berkongsi maklumat, terdapat banyak jenis protokol komunikasi untuk berkongsi maklumat ini, tetapi yang paling kerap digunakan adalah USART, IIC, SPI dan CAN. Setiap protokol komunikasi mempunyai kelebihan dan kekurangannya sendiri. Mari fokus pada Protokol SPI buat masa ini kerana 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 biasa yang digunakan untuk mengirim data antara dua mikrokontroler atau untuk membaca / menulis data dari sensor ke mikrokontroler. Ia juga digunakan untuk berkomunikasi dengan kad SD, shift register, Display Controller dan banyak lagi.
Bagaimana Protokol SPI Berfungsi?
Komunikasi SPI adalah komunikasi segerak, yang bermaksud ia berfungsi dengan bantuan isyarat jam yang dikongsi antara dua peranti yang bertukar data. Juga komunikasi dupleks penuh kerana dapat mengirim dan menerima data menggunakan bas yang terpisah. The komunikasi SPI memerlukan 5 wayar untuk beroperasi. Litar komunikasi SPI sederhana antara tuan dan hamba ditunjukkan di bawah
Lima wayar yang diperlukan untuk komunikasi tersebut ialah SCK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) dan SS (Slave Select). Komunikasi SPI selalu berlaku hanya antara tuan dan hamba. Seorang tuan boleh mempunyai beberapa hamba yang terhubung dengannya. Master bertanggungjawab menghasilkan denyutan jam dan perkara yang sama dikongsi dengan semua hamba. Juga semua komunikasi boleh dimulakan hanya oleh tuan.
Pin SCK (aka jam bersiri SCL) berkongsi isyarat jam yang dihasilkan oleh tuan dengan hamba. Pin MOSI (aka SDA –Serial Data Out) digunakan untuk menghantar data dari master ke selve. Pin MISO (aka SDI - Serial Data In) digunakan untuk mendapatkan data dari salve kepada master. Anda juga boleh mengikuti tanda panah pada gambar di atas untuk memahami pergerakan data / isyarat. Akhirnya pin SS (aka CS –Chip select) digunakan apabila terdapat lebih daripada satu modul hamba yang disambungkan ke master. Ini boleh digunakan untuk memilih hamba yang diperlukan. Litar sampel di mana lebih daripada satu hamba dihubungkan dengan induk untuk komunikasi SPI ditunjukkan dalam litar di bawah.
Perbezaan antara Komunikasi I2C dan SPI
Kami telah mempelajari komunikasi I2C dengan PIC dan oleh itu kami mesti mengetahui cara kerja I2C dan di mana kami boleh menggunakannya seperti I2C dapat digunakan untuk menghubungkan modul RTC. Tetapi sekarang, mengapa kita memerlukan protokol SPI ketika kita sudah mempunyai I2C. Sebabnya ialah komunikasi I2C dan SPI adalah kelebihan dengan caranya sendiri dan oleh itu khusus untuk aplikasi.
Sejauh mana komunikasi I2C boleh dianggap mempunyai kelebihan berbanding komunikasi SPI kerana I2C menggunakan bilangan pin yang lebih sedikit dan menjadi sangat berguna apabila terdapat sebilangan besar hamba yang dihubungkan ke bas. Tetapi kelemahan I2C adalah ia mempunyai bas yang sama untuk menghantar dan menerima data dan oleh karenanya agak lambat. Oleh itu, ini hanya berdasarkan aplikasi untuk memutuskan antara protokol SPI dan I2C untuk projek anda.
SPI dengan PIC16F877A menggunakan XC8 Compiler:
Cukup asas, sekarang mari kita pelajari bagaimana kita dapat menggunakan komunikasi SPI pada mikrokontroler PIC16F877A menggunakan pengkompil MPLABX IDE dan XC8. Sebelum kita mulai menjelaskan bahawa tutorial ini hanya membincangkan SPI di PIC16F877a menggunakan penyusun XC8, prosesnya akan sama untuk mikrokontroler lain tetapi sedikit perubahan mungkin diperlukan. Ingat juga bahawa untuk mikrokontroler lanjutan seperti siri PIC18F pengkompil itu sendiri mungkin mempunyai beberapa perpustakaan terpasang untuk menggunakan ciri SPI, tetapi untuk PIC16F877A tidak ada yang serupa jadi mari kita bina sendiri. Perpustakaan yang dijelaskan di sini akan diberikan sebagai fail tajuk untuk dimuat di bahagian bawah yang dapat digunakan untuk PIC16F877A untuk berkomunikasi dengan peranti SPI lain.
Dalam tutorial ini kita akan menulis program kecil yang menggunakan komunikasi SPI untuk menulis dan membaca data dari bas SPI. Kami kemudian akan mengesahkan yang sama menggunakan simulasi Proteus. Semua kod yang berkaitan dengan daftar SPI akan dibuat di dalam fail tajuk bernama PIC16f877a_SPI.h. Dengan cara ini kita dapat menggunakan fail tajuk ini dalam semua projek yang akan datang yang memerlukan komunikasi SPI. Dan di dalam program utama kita hanya akan menggunakan fungsi dari fail tajuk. Kod lengkap bersama dengan fail tajuk boleh dimuat turun dari sini.
Penjelasan Fail Header SPI:
Di dalam fail header kita harus menginisialisasi komunikasi SPI untuk PIC16F877a. Seperti biasa, tempat terbaik untuk memulakan adalah lembaran data PIC16F877A. Daftar yang mengawal komunikasi SPI untuk PIC16F8777a adalah SSPSTAT dan Daftar SSPCON. Anda boleh mengenainya di halaman 74 dan 75 lembar data.
Terdapat banyak pilihan parameter yang harus dipilih semasa memulakan komunikasi SPI. Pilihan yang paling biasa digunakan ialah frekuensi jam akan ditetapkan ke Fosc / 4 dan akan dilakukan di tengah dan jam akan ditetapkan pada keadaan rendah pada keadaan ideal. Oleh itu, kami juga menggunakan konfigurasi yang sama untuk fail tajuk kami, anda boleh mengubahnya dengan mudah dengan menukar bit masing-masing.
SPI_Initialize_Master ()
Fungsi inisialisasi SPI Master digunakan untuk memulakan komunikasi SPI sebagai master. Di dalam fungsi ini kita menetapkan pin masing-masing RC5 dan RC3 sebagai pin output. Kemudian kami mengkonfigurasi SSPTAT dan daftar SSPCON untuk menghidupkan komunikasi SPI
batal SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // ms 74/234 SSPCON = 0b00100000; // ms 75/234 TRISC3 = 0; // Set sebagai output untuk memasuki mod hamba }
SPI_Initialize_Slave ()
Fungsi ini digunakan untuk mengatur mikrokontroler berfungsi dalam mod hamba untuk komunikasi SPI. Semasa mod hamba, pin RC5 harus ditetapkan sebagai output dan pin RC3 harus ditetapkan sebagai input. SSPSTAT dan SSPCON ditetapkan dengan cara yang sama untuk hamba dan tuannya.
batal SPI_Initialize_Slave () { TRISC5 = 0; // Pin SDO harus dinyatakan sebagai output SSPSTAT = 0b00000000; // ms 74/234 SSPCON = 0b00100000; // ms 75/234 TRISC3 = 1; // Tetapkan sebagai keluar untuk mod master }
SPI_Write (char masuk)
Fungsi Tulis SPI digunakan untuk menulis data ke dalam bas SPI. Ia mendapat maklumat dari pengguna melalui pemboleh ubah yang masuk dan kemudian menggunakannya untuk meneruskan ke daftar Penyangga. SSPBUF akan dihapus dalam denyutan Jam berturut-turut dan data akan dihantar ke bas sedikit demi sedikit.
batal SPI_Write (char masuk) { SSPBUF = masuk; // Tuliskan data yang diberikan pengguna ke dalam buffer }
SPI_Ready2Read ()
Fungsi SPI siap dibaca digunakan untuk memeriksa apakah data dalam bas SPI diterima sepenuhnya dan apakah dapat dibaca. Daftar SSPSTAT memiliki sedikit disebut BF yang akan ditetapkan setelah data diterima sepenuhnya, jadi kami memeriksa apakah bit ini diset jika tidak disetel maka kita harus menunggu sehingga ia siap untuk membaca apa-apa dari bas SPI.
SPI_Ready2Read yang tidak ditandatangani () { if (SSPSTAT & 0b00000001) kembali 1; lain pulangkan 0; }
SPI_Baca ()
SPI Read digunakan untuk membaca data dari bas SPI ke mikrokontroler. Data yang terdapat dalam bas SPI akan disimpan di SSPBUF, kita harus menunggu sehingga data lengkap disimpan di Buffer dan kemudian kita dapat membacanya menjadi pemboleh ubah. Kami memeriksa bit BPS register SSPSTAT sebelum membaca buffer untuk memastikan penerimaan data selesai.
char SPI_Read () // Baca data yang diterima { while (! SSPSTATbits.BF); // Tahan sehingga bit BF ditetapkan, untuk memastikan data lengkap dibaca kembali (SSPBUF); // kembalikan data yang dibaca }
Penjelasan program utama:
Fungsi yang dijelaskan di bahagian di atas akan berada di file header dan mereka dapat dipanggil ke file c utama. Oleh itu, mari tulis program kecil untuk memeriksa sama ada komunikasi SPI berfungsi. Kami hanya akan menulis beberapa data ke dalam bas SPI dan menggunakan simulasi proteus untuk memeriksa sama ada data yang sama diterima dalam debugger SPI.
Seperti biasa mulakan program dengan menetapkan bit konfigurasi dan kemudian sangat penting untuk menambahkan fail header yang baru kami terangkan ke dalam program seperti yang ditunjukkan di bawah
#sertakan
Sekiranya anda telah membuka program dari fail zip yang dimuat turun di atas maka secara lalai fail header akan ada di dalam direktori fail header dari fail projek anda. Jika tidak, anda perlu menambahkan fail tajuk secara manual di dalam projek anda, setelah menambahkan fail projek anda akan kelihatan seperti di bawah
Di dalam fail utama kita harus menginisialisasi PIC sebagai Master untuk komunikasi SPI dan kemudian di dalam loop sementara yang tidak terhingga kita akan menuliskan nilai tiga hex secara rawak ke dalam bas SPI untuk memeriksa sama ada kita menerima yang sama semasa simulasi.
batal utama () { SPI_Initialize_Master (); sementara (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Perhatikan bahawa nilai rawak yang digunakan dalam program ini adalah 0A, 0F dan 15 dan mereka adalah nilai hex jadi kita harus melihat yang sama semasa simulasi. Itu sahaja kodnya sudah selesai, ini hanyalah contoh tetapi kita dapat menggunakan metodologi yang sama untuk berkomunikasi dengan MCU lain atau dengan modul sensor lain yang beroperasi pada protokol SPI.
Simulasi PIC dengan debugger SPI:
Setelah program kita siap, kita dapat menyusunnya dan kemudian meneruskan simulasi. Proteus mempunyai ciri berguna yang disebut SPI debugger , yang dapat digunakan untuk memantau data melalui bas SPI. Oleh itu, kami menggunakan yang sama dan membina litar seperti yang ditunjukkan di bawah.
Oleh kerana hanya terdapat satu perangkat SPI dalam simulasi, kami tidak menggunakan pin SS dan bila tidak digunakan, ia harus dibumikan seperti yang ditunjukkan di atas. Muatkan fail hex ke dalam mikrokontroler PIC16F877A dan klik pada butang main untuk mensimulasikan program kami. Setelah simulasi bermula, anda akan mendapat tetingkap pop timbul yang memaparkan data dalam bas SPI seperti gambar di bawah
Mari kita perhatikan lebih dekat data yang masuk dan periksa sama ada data yang kami tulis dalam program kami.
Data diterima dalam urutan yang sama seperti yang kami tulis dalam program kami dan yang sama diserlahkan untuk anda. Anda juga boleh mencuba mensimulasikan program untuk berkomunikasi dengan dua mikrokontroler PIC menggunakan protokol SPI. Anda harus memprogram satu PIC sebagai tuan dan yang lain sebagai hamba. Semua fail tajuk yang diperlukan untuk tujuan ini sudah diberikan dalam fail tajuk.
Ini hanya sekilas dari apa yang SPI dapat lakukan, ia juga dapat membaca dan menulis data ke pelbagai peranti. Kami akan membahas lebih lanjut mengenai SPI dalam tutorial kami yang akan datang dengan menghubungkan pelbagai modul yang berfungsi dengan protokol SPI.
Harap anda memahami projek dan mengetahui sesuatu yang berguna daripadanya. Sekiranya anda mempunyai keraguan, hantarkannya di bahagian komen di bawah atau gunakan forum untuk bantuan teknikal.
Kod Utama yang lengkap telah diberikan di bawah; anda boleh memuat turun fail tajuk dengan semua kod dari sini