- SPI dalam STM32F103C8
- Pin SPI di Arduino
- Komponen Diperlukan
- Diagram Litar dan Sambungan untuk Tutorial STM32 SPI
- Pengaturcaraan STM32 SPI
- Penjelasan Pengaturcaraan Master STM32 SPI
- Penjelasan Pengaturcaraan Slave Arduino SPI
Dalam tutorial sebelumnya, kami telah mempelajari komunikasi SPI dan I2C antara dua papan Arduino. Dalam tutorial ini kita akan mengganti satu papan Arduino dengan papan Pill Biru iaitu STM32F103C8 dan akan berkomunikasi dengan papan Arduino menggunakan bas SPI. Dalam Contoh STM32 SPI ini, kami akan menggunakan Arduino UNO sebagai Slave dan STM32F103C8 sebagai Master dengan dua paparan LCD 16X2 yang saling melekat satu sama lain. 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 dalam STM32F103C8
Membandingkan bas SPI di papan Arduino & STM32F103C8 Blue Pill, STM32 mempunyai 2 bas SPI di dalamnya sementara Arduino Uno mempunyai satu bas SPI. Arduino Uno mempunyai mikrokontroler ATMEGA328 di dalamnya, dan STM32F103C8 mempunyai ARM Cortex- M3 yang menjadikannya lebih cepat daripada Arudino Board.
Untuk mengetahui lebih lanjut mengenai komunikasi SPI, rujuk artikel kami sebelumnya
- Cara menggunakan SPI di Arduino: Komunikasi antara dua Papan Arduino
- Komunikasi SPI dengan PIC Microcontroller PIC16F877A
- Komunikasi SPI melalui Bit Banging
- Pengesan Kebocoran Tangki Air Panas Raspberry Pi menggunakan Modul SPI
- Jam Waktu Sebenar ESP32 menggunakan Modul DS3231
Pin STM32 SPI STM32F103C8
Garis SPI1 | Sematkan di STM32F103C8 |
MOSI1 | PA7 atau PB5 |
MISO1 | PA6 atau PB4 |
SCK1 | PA5 atau PB3 |
SS1 | PA4 atau PA15 |
Garis SPI2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Pin SPI di Arduino
Talian SPI |
Sematkan di Arduino |
MOSI |
11 atau ICSP-4 |
MISO |
12 atau ICSP-1 |
SCK |
13 atau ICSP-3 |
SS |
10 |
Komponen Diperlukan
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Potensiometer 10k - 4
- Papan roti
- Wayar Penyambung
Diagram Litar dan Sambungan untuk Tutorial STM32 SPI
Jadual di bawah menunjukkan Pin yang Disambungkan untuk komunikasi STM32 SPI dengan Arduino.
Pin SPI |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Jadual di bawah menunjukkan pin yang disambungkan untuk Two LCD (16x2) dengan STM32F103C8 dan Arduino secara berasingan.
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 |
A |
+ 5V |
+ 5V |
K |
GND |
GND |
Penting:
- Jangan lupa untuk menyambungkan Arduino GND dan STM32F103C8 GND bersama-sama.
Pengaturcaraan STM32 SPI
Pengaturcaraannya serupa dengan kod Arduino. Sama
Dalam Contoh STM32 SPI ini, kami akan menggunakan Arduino UNO sebagai Slave dan STM32F103C8 sebagai Master dengan dua paparan LCD 16X2 yang saling melekat satu sama lain. 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 ditukar menjadi nilai Analog ke Digital (0 hingga 4096) dan nilai digital ini kemudian dipetakan menjadi (0 hingga 255) kerana kami hanya dapat mengirim data 8-bit (bait) melalui komunikasi SPI sekaligus.
Begitu juga di sisi Slave kita mengambil nilai input analog pada Arduino pin A0 dari (0 hingga 5V) dengan menggunakan potensiometer. Dan sekali lagi nilai input ini ditukar menjadi nilai Analog ke Digital (0 hingga 1023) dan nilai digital ini dipetakan lagi menjadi (0 hingga 255)
Tutorial ini mempunyai dua program satu untuk master STM32 dan satu lagi untuk hamba Arduino. Program lengkap untuk kedua-dua belah pihak diberikan pada akhir projek ini dengan Video demonstrasi.
Penjelasan Pengaturcaraan Master STM32 SPI
1. Pertama sekali kita perlu memasukkan perpustakaan SPI untuk menggunakan fungsi komunikasi SPI dan perpustakaan LCD untuk menggunakan fungsi LCD. Tentukan juga pin LCD untuk LCD 16x2. Ketahui lebih lanjut mengenai menghubungkan LCD dengan STM32 di sini.
#sertakan
2. Dalam persediaan tidak sah ()
- Mulakan Komunikasi Bersiri pada Baud Rate 9600.
Serial.begin (9600);
- Seterusnya mulakan komunikasi SPI
SPI.begin ();
- Kemudian tetapkan pembahagi Jam untuk komunikasi SPI. Saya telah menetapkan pembahagi 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Seterusnya tetapkan pin SS TINGGI kerana kami tidak memulakan pemindahan ke slave arduino.
digitalWrite (SS, TINGGI);
3. Dalam gelung kosong ()
- Sebelum mengirim sebarang nilai kepada hamba, kita perlu menurunkan nilai pilih hamba untuk mula memindahkan kepada hamba dari tuan.
digitalWrite (SS, RENDAH);
- Seterusnya baca nilai analog dari STM32F10C8 POT induk yang dilekatkan pada pin PA0.
int pot = analogRead (PA0);
Kemudian tukar nilai ini dari satu bait (0 hingga 255).
byte MasterSend = peta (pot, 0,4096,0,255);
- Inilah langkah penting, dalam pernyataan berikut, kami mengirim nilai POT yang ditukar yang disimpan dalam pemboleh ubah Mastersend kepada hamba Arduino, dan juga menerima nilai dari hamba Arduino dan menyimpannya dalam pemboleh ubah mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Seterusnya paparkan nilai yang diterima dari hamba arduino dengan penundaan 500 mikrodetik dan kemudian terus menerus menerima dan memaparkan nilai.
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 (MasterReceive delay (500); digitalWrite (SS, TINGGI);
Catatan: Kami menggunakan serial.println () untuk melihat hasilnya di Serial Motor dari Arduino IDE.
Penjelasan Pengaturcaraan Slave Arduino SPI
1. Sama seperti master, pertama-tama kita perlu memasukkan perpustakaan SPI untuk menggunakan fungsi komunikasi I2C dan perpustakaan LCD untuk menggunakan fungsi LCD. Tentukan juga pin LCD untuk LCD 16x2.
#sertakan
2. Dalam persediaan tidak sah ()
- Kami Memulakan Komunikasi Bersiri pada Baud Rate 9600.
Serial.begin (9600);
- Pernyataan di bawah menetapkan MISO sebagai OUTPUT (Harus Menghantar data ke Master IN). Jadi data dihantar melalui MISO Slave Arduino.
pinMode (MISO, OUTPUT);
- Sekarang Hidupkan SPI dalam Slave Mode dengan menggunakan SPI Control Register
SPCR - = _BV (SPE);
- Kemudian hidupkan gangguan untuk komunikasi SPI. Sekiranya data diterima dari master, 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 pemboleh ubah Slavereceived . Ini berlaku berikutan fungsi Interrupt Routine.
ISR (SPI_STC_vect) {Slavereceived = SPDR; diterima = benar; }
3. Selanjutnya dalam gelung kosong ()
- Baca nilai analog dari Slave Arduino POT yang dilampirkan pada pin A0.
int pot = analogRead (A0);
- Tukarkan nilai itu dari satu bait sebagai 0 hingga 255.
Slavesend = peta (periuk, 0,1023,0,255);
- Langkah penting seterusnya adalah menghantar nilai yang ditukar ke Master STM32F10C8, jadi letakkan nilainya di daftar SPDR. Daftar SPDR digunakan untuk mengirim dan menerima nilai.
SPDR = Slavesend;
- Kemudian paparkan nilai yang diterima ( SlaveReceive ) dari Master STM32F103C8 pada LCD dengan kelewatan 500 mikrodetik dan kemudian terus menerus menerima dan memaparkan nilai tersebut.
lcd.setCursor (0,0); lcd.print ("Budak: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 to Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); kelewatan (500);
Dengan memutar Potensiometer di satu sisi, anda dapat melihat pelbagai nilai pada LCD di sisi lain:
Jadi ini adalah bagaimana komunikasi SPI berlaku di STM32. Kini anda boleh menghubungkan antara sensor SPI dengan papan STM32.
Pengekodan lengkap untuk Master STM32 dan Slave Arduino diberikan di bawah dengan video demonstrasi