- SPI di STM32F103C8
- Pin SPI di Arduino
- Komponen Diperlukan
- Diagram Sirkuit dan Koneksi untuk Tutorial STM32 SPI
- Pemrograman STM32 SPI
- Penjelasan Pemrograman Master STM32 SPI
- Slave Arduino SPI Pemrograman Penjelasan
Dalam tutorial kami sebelumnya, kami telah belajar tentang komunikasi SPI dan I2C antara dua papan Arduino. Dalam tutorial ini kita akan mengganti satu papan Arduino dengan papan Pill Biru yaitu STM32F103C8 dan akan berkomunikasi dengan papan Arduino menggunakan bus SPI. Dalam Contoh STM32 SPI ini, kita akan menggunakan Arduino UNO sebagai Slave dan STM32F103C8 sebagai Master dengan Dua layar LCD 16X2 yang saling menempel secara terpisah. Dua Potensiometer juga dihubungkan dengan STM32 (PA0) dan Arduino (A0) untuk menentukan nilai pengiriman (0 hingga 255) dari master ke slave dan slave ke master dengan memvariasikan potensiometer.
SPI di STM32F103C8
Membandingkan bus SPI di papan Pill Biru Arduino & STM32F103C8, STM32 memiliki 2 bus SPI di dalamnya sedangkan Arduino Uno memiliki satu bus SPI. Arduino Uno memiliki mikrokontroler ATMEGA328 di dalamnya, dan STM32F103C8 memiliki ARM Cortex-M3 yang membuatnya lebih cepat dari Arudino Board.
Untuk mempelajari lebih lanjut tentang komunikasi SPI, lihat artikel kami sebelumnya
- Cara menggunakan SPI di Arduino: Komunikasi antara dua Papan Arduino
- Komunikasi SPI dengan Mikrokontroler PIC PIC16F877A
- Komunikasi SPI melalui Bit Banging
- Detektor Kebocoran Tangki Air Panas Raspberry Pi menggunakan Modul SPI
- ESP32 Real Time Clock menggunakan Modul DS3231
Pin STM32 SPI STM32F103C8
SPI Line1 | Pin di STM32F103C8 |
MOSI1 | PA7 atau PB5 |
MISO1 | PA6 atau PB4 |
SCK1 | PA5 atau PB3 |
SS1 | PA4 atau PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Pin SPI di Arduino
Jalur SPI |
Pin di Arduino |
MOSI |
11 atau ICSP-4 |
SUP KEDELAI JEPANG |
12 atau ICSP-1 |
SCK |
13 atau ICSP-3 |
SS |
10 |
Komponen Diperlukan
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Potensiometer 10k - 4
- Papan tempat memotong roti
- Menghubungkan Kabel
Diagram Sirkuit dan Koneksi untuk Tutorial STM32 SPI
Tabel Di Bawah ini menunjukkan Pin Terhubung untuk komunikasi STM32 SPI dengan Arduino.
Pin SPI |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
SUP KEDELAI JEPANG |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Tabel di bawah ini menunjukkan pin yang terhubung untuk Dua LCD (16x2) dengan STM32F103C8 dan Arduino secara terpisah.
Pin LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Ke PIN Pusat Potensiometer untuk kontras LCD |
Ke PIN Pusat Potensiometer untuk kontras LCD |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
SEBUAH |
+ 5V |
+ 5V |
K |
GND |
GND |
Penting:
- Jangan lupa untuk menghubungkan Arduino GND dan STM32F103C8 GND secara bersamaan.
Pemrograman STM32 SPI
Pemrogramannya mirip dengan kode Arduino. Sama
Dalam Contoh STM32 SPI ini, kita akan menggunakan Arduino UNO sebagai Slave dan STM32F103C8 sebagai Master dengan Dua layar LCD 16X2 yang saling menempel secara terpisah. Dua Potensiometer juga dihubungkan dengan STM32 (PA0) dan Arduino (A0) untuk menentukan nilai pengiriman (0 hingga 255) dari master ke slave dan slave ke master dengan memvariasikan potensiometer.
Input analog diambil pada STM32F10C8 pin PA0 (0 hingga 3.3V) dengan memutar potensiometer. Kemudian nilai input ini diubah menjadi nilai Analog to Digital (0 hingga 4096) dan nilai digital ini selanjutnya dipetakan ke (0 hingga 255) karena kami hanya dapat mengirim data 8-bit (byte) melalui komunikasi SPI sekaligus.
Demikian pula di sisi Slave kami mengambil nilai input analog pada Arduino pin A0 dari (0 hingga 5V) dengan menggunakan potensiometer. Dan lagi nilai input ini diubah menjadi nilai Analog to Digital (0 hingga 1023) dan nilai digital ini selanjutnya dipetakan ke (0 hingga 255)
Tutorial ini memiliki dua program satu untuk master STM32 dan lainnya untuk slave Arduino. Program lengkap untuk kedua sisi diberikan di akhir proyek ini dengan Video demonstrasi.
Penjelasan Pemrograman Master STM32 SPI
1. Pertama-tama kita perlu menyertakan perpustakaan SPI untuk menggunakan fungsi komunikasi SPI dan perpustakaan LCD untuk menggunakan fungsi LCD. Tentukan juga pin LCD untuk LCD 16x2. Pelajari lebih lanjut tentang antarmuka LCD dengan STM32 di sini.
#include
2. Dalam penyiapan batal ()
- Mulai Komunikasi Serial dengan Baud Rate 9600.
Serial.begin (9600);
- Selanjutnya mulai komunikasi SPI
SPI. Mulai ();
- Kemudian atur Pembagi jam untuk komunikasi SPI. Saya telah mengatur pembatas 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Selanjutnya atur pin SS TINGGI karena kami tidak memulai transfer apa pun ke slave arduino.
digitalWrite (SS, HIGH);
3. Dalam lingkaran kosong ()
- Sebelum mengirim nilai apa pun ke slave, kita perlu LOW nilai slave pilih untuk mulai mentransfer ke slave dari master.
digitalWrite (SS, LOW);
- Selanjutnya baca nilai analog dari POT master STM32F10C8 yang dipasang pada pin PA0.
int pot = analogRead (PA0);
Kemudian ubah nilai ini menjadi satu byte (0 hingga 255).
byte MasterSend = peta (pot, 0,4096,0,255);
- Inilah langkah penting, dalam pernyataan berikut kami mengirim nilai POT yang dikonversi yang disimpan dalam variabel Mastersend ke slave Arduino, dan juga menerima nilai dari slave Arduino dan menyimpannya dalam variabel mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Selanjutnya tampilkan nilai yang diterima dari slave arduino dengan jeda 500 mikrodetik dan kemudian terus terima dan tampilkan nilainya.
Serial.println ("Slave Arduino to Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (penundaan MasterReceive (500); digitalWrite (SS, HIGH);
Catatan: Kami menggunakan serial.println () untuk melihat hasil di Serial Motor dari Arduino IDE.
Slave Arduino SPI Pemrograman Penjelasan
1. Sama seperti master, pertama-tama kita perlu menyertakan library SPI untuk menggunakan fungsi komunikasi I2C dan library LCD untuk menggunakan fungsi LCD. Tentukan juga pin LCD untuk LCD 16x2.
#include
2. Dalam penyiapan batal ()
- Kami Memulai Komunikasi Serial dengan Baud Rate 9600.
Serial.begin (9600);
- Pernyataan di bawah ini menetapkan MISO sebagai OUTPUT (Harus Mengirim data ke Master IN). Jadi data dikirim melalui MISO dari Slave Arduino.
pinMode (MISO, OUTPUT);
- Sekarang Nyalakan SPI dalam Mode Slave dengan menggunakan SPI Control Register
SPCR - = _BV (SPE);
- Kemudian nyalakan interupsi untuk komunikasi SPI. Jika data diterima dari master maka Interrupt Service Routine dipanggil dan nilai yang diterima diambil dari SPDR (SPI Data Register)
SPI.attachInterrupt ();
- Nilai dari master diambil dari SPDR dan disimpan dalam variabel yang diterima Slaver . Ini terjadi dalam mengikuti fungsi Rutin Interupsi.
ISR (SPI_STC_vect) {Slavereceived = SPDR; diterima = benar; }
3. Berikutnya di void loop ()
- Baca nilai analog dari POT Slave Arduino yang terpasang pada pin A0.
int pot = analogRead (A0);
- Ubah nilai itu dalam satu byte sebagai 0 menjadi 255.
Slavesend = peta (pot, 0,1023,0,255);
- Langkah penting berikutnya adalah mengirim nilai yang dikonversi ke Master STM32F10C8, jadi letakkan nilai di register SPDR. Register SPDR digunakan untuk mengirim dan menerima nilai.
SPDR = Budak;
- Kemudian tampilkan nilai yang diterima ( SlaveReceive ) dari Master STM32F103C8 pada LCD dengan jeda 500 mikrodetik dan kemudian terus terima dan tampilkan nilai tersebut.
lcd.setCursor (0,0); lcd.print ("Budak: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 ke Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); penundaan (500);
Dengan memutar Potensiometer di satu sisi, Anda dapat melihat nilai yang bervariasi pada LCD di sisi lain:
Jadi seperti inilah komunikasi SPI terjadi di STM32. Sekarang Anda dapat menghubungkan sensor SPI apa pun dengan papan STM32.
Pengkodean lengkap untuk Master STM32 dan Slave Arduino diberikan di bawah ini dengan video demonstrasi