- SPI ใน STM32F103C8
- SPI Pins ใน Arduino
- ส่วนประกอบที่จำเป็น
- แผนภาพวงจรและการเชื่อมต่อสำหรับ STM32 SPI Tutorial
- การเขียนโปรแกรม STM32 SPI
- คำอธิบายการเขียนโปรแกรม Master STM32 SPI
- คำอธิบายการเขียนโปรแกรม Slave Arduino SPI
ในบทช่วยสอนก่อนหน้านี้เราได้เรียนรู้เกี่ยวกับการสื่อสาร SPI และ I2C ระหว่างบอร์ด Arduino สองตัว ในบทช่วยสอนนี้เราจะแทนที่บอร์ด Arduino หนึ่งบอร์ดด้วย Blue Pill board นั่นคือ STM32F103C8 และจะสื่อสารกับบอร์ด Arduino โดยใช้ SPI bus ในตัวอย่าง STM32 SPIนี้เราจะใช้ Arduino UNO เป็น Slave และ STM32F103C8 เป็น Master โดยมีจอ LCD 16X2 สองจอติดกันแยกกัน โพเทนชิโอมิเตอร์สองตัวยังเชื่อมต่อกับ STM32 (PA0) และ Arduino (A0) เพื่อกำหนดค่าการส่ง (0 ถึง 255) จากต้นแบบไปยังทาสและทาสไปยังมาสเตอร์โดยการเปลี่ยนโพเทนชิออมิเตอร์
SPI ใน STM32F103C8
การเปรียบเทียบบัส SPI ในบอร์ด Arduino และ STM32F103C8 Blue Pill นั้น STM32 มีบัส SPI 2 ตัวในขณะที่ Arduino Uno มีบัส SPI หนึ่งตัว Arduino Uno มีไมโครคอนโทรลเลอร์ ATMEGA328 อยู่ในนั้นและ STM32F103C8 มี ARM Cortex-M3 ซึ่งทำให้เร็วกว่า Arudino Board
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการสื่อสาร SPI โปรดดูบทความก่อนหน้าของเรา
- วิธีใช้ SPI ใน Arduino: การสื่อสารระหว่างบอร์ด Arduino สองตัว
- การสื่อสาร SPI กับไมโครคอนโทรลเลอร์ PIC PIC16F877A
- การสื่อสาร SPI ผ่าน Bit Banging
- เครื่องตรวจจับการรั่วของถังน้ำร้อน Raspberry Pi โดยใช้โมดูล SPI
- นาฬิกาเรียลไทม์ ESP32 โดยใช้โมดูล DS3231
หมุด STM32 SPI STM32F103C8
สาย SPI1 | ปักหมุดใน STM32F103C8 |
MOSI1 | PA7 หรือ PB5 |
MISO1 | PA6 หรือ PB4 |
SCK1 | PA5 หรือ PB3 |
SS1 | PA4 หรือ PA15 |
สาย SPI2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI Pins ใน Arduino
สาย SPI |
ปักหมุดใน Arduino |
MOSI |
11 หรือ ICSP-4 |
มิโซะ |
12 หรือ ICSP-1 |
SCK |
13 หรือ ICSP-3 |
SS |
10 |
ส่วนประกอบที่จำเป็น
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- โพเทนชิออมิเตอร์ 10k - 4
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
แผนภาพวงจรและการเชื่อมต่อสำหรับ STM32 SPI Tutorial
ตารางด้านล่างแสดงพินที่เชื่อมต่อสำหรับการสื่อสาร STM32 SPIกับ Arduino
SPI พิน |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
มิโซะ |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
ตารางด้านล่างแสดงให้เห็นหมุดที่เชื่อมต่อสองจอแอลซีดี (16x2) กับ STM32F103C8 และ Arduino แยกต่างหาก
ขา LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
ไปยัง Potentiometer Center PIN สำหรับความคมชัดของ LCD |
ไปยัง Potentiometer Center PIN สำหรับความคมชัดของ LCD |
อาร์เอส |
PB0 |
2 |
RW |
GND |
GND |
จ |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
พีซี 13 |
6 |
D7 |
พีซี 14 |
7 |
ก |
+ 5V |
+ 5V |
เค |
GND |
GND |
สำคัญ:
- อย่าลืมเชื่อมต่อ Arduino GND และ STM32F103C8 GND เข้าด้วยกัน
การเขียนโปรแกรม STM32 SPI
การเขียนโปรแกรมคล้ายกับรหัส Arduino เหมือน
ในตัวอย่าง STM32 SPIนี้เราจะใช้ Arduino UNO เป็น Slave และ STM32F103C8 เป็น Master โดยมีจอ LCD 16X2 สองจอติดกันแยกกัน โพเทนชิโอมิเตอร์สองตัวยังเชื่อมต่อกับ STM32 (PA0) และ Arduino (A0) เพื่อกำหนดค่าการส่ง (0 ถึง 255) จากต้นแบบไปยังทาสและทาสไปยังมาสเตอร์โดยการเปลี่ยนโพเทนชิออมิเตอร์
อินพุตแบบอนาล็อกถ่ายที่ STM32F10C8 พิน PA0 (0 ถึง 3.3V) โดยการหมุนโพเทนชิออมิเตอร์ จากนั้นค่าอินพุตนี้จะถูกแปลงเป็นค่าอนาล็อกเป็นดิจิตอล (0 ถึง 4096) และค่าดิจิทัลนี้จะถูกแมปเพิ่มเติมกับ (0 ถึง 255) เนื่องจากเราสามารถส่งข้อมูล 8 บิต (ไบต์) ผ่านการสื่อสาร SPI ได้ในครั้งเดียว
ในทำนองเดียวกันในด้าน Slave เรารับค่าอินพุตแบบอะนาล็อกที่ขา Arduino A0 จาก (0 ถึง 5V) โดยใช้โพเทนชิออมิเตอร์ และอีกครั้งค่าอินพุตนี้จะถูกแปลงเป็นค่าอนาล็อกเป็นดิจิตอล (0 ถึง 1023) และค่าดิจิทัลนี้จะถูกแมปเพิ่มเติมกับ (0 ถึง 255)
บทช่วยสอนนี้มีสองโปรแกรมหนึ่งสำหรับ Master STM32 และอื่น ๆ สำหรับ Arduino Slave โปรแกรมที่สมบูรณ์แบบ สำหรับทั้งสองฝ่ายจะได้รับในตอนท้ายของโครงการนี้กับที่ วิดีโอสาธิต
คำอธิบายการเขียนโปรแกรม Master STM32 SPI
1. ก่อนอื่นเราต้อง รวมไลบรารี SPI สำหรับการใช้ฟังก์ชันการสื่อสาร SPI และไลบรารี LCD สำหรับการใช้ฟังก์ชัน LCD กำหนดพิน LCD สำหรับ LCD 16x2 ด้วย เรียนรู้เพิ่มเติมเกี่ยวกับการเชื่อมต่อ LCD กับ STM32 ที่นี่
# รวม
2. ในการตั้งค่าเป็นโมฆะ ()
- เริ่มการสื่อสารแบบอนุกรมที่ Baud Rate 9600
Serial.begin (9600);
- จากนั้นเริ่มการสื่อสาร SPI
SPI.begin ();
- จากนั้นตั้งค่าตัวแบ่งนาฬิกาสำหรับการสื่อสาร SPI ฉันได้ตั้งค่าตัวแบ่ง 16
SPI.setClockDivider (SPI_CLOCK_DIV16);
- ถัดไปตั้ง SS พินสูงเนื่องจากเราไม่ได้เริ่มการถ่ายโอนไปยังทาส arduino
digitalWrite (SS, สูง);
3. ในโมฆะลูป ()
- ก่อนที่จะส่งค่าใด ๆ ไปยังทาสเราจำเป็นต้อง LOW ค่าเลือกทาสเพื่อเริ่มถ่ายโอนไปยังทาสจากต้นแบบ
digitalWrite (SS, LOW);
- ถัดไปอ่านค่าอะนาล็อกจาก STM32F10C8 POT ต้นแบบที่แนบกับพิน PA0
หม้อ int = analogRead (PA0);
จากนั้นแปลงค่านี้ในรูปของหนึ่งไบต์ (0 ถึง 255)
ไบต์ MasterSend = แผนที่ (หม้อ 0,4096,0,255);
- ต่อไปนี้เป็นขั้นตอนสำคัญในคำสั่งต่อไปนี้เราจะส่งค่า POT ที่แปลงแล้วซึ่งเก็บไว้ในตัวแปร Mastersend ไปยังทาส Arduino และรับค่าจาก Slave Arduino และเก็บไว้ในตัวแปร mastereceive
Mastereceive = SPI.transfer (Mastersend);
- ถัดไปแสดงค่าที่ได้รับจากทาส arduino ด้วยความล่าช้า 500 ไมโครวินาทีจากนั้นรับและแสดงค่าอย่างต่อเนื่อง
Serial.println ("Slave Arduino เป็น 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, สูง);
หมายเหตุ: เราใช้ serial.println () เพื่อดูผลลัพธ์ใน Serial Motor ของ Arduino IDE
คำอธิบายการเขียนโปรแกรม Slave Arduino SPI
1. เช่นเดียวกับมาสเตอร์ก่อนอื่นเราต้อง รวมไลบรารี SPI เพื่อใช้ฟังก์ชันการสื่อสาร I2C และไลบรารี LCD สำหรับการใช้ฟังก์ชัน LCD กำหนดพิน LCD สำหรับ LCD 16x2 ด้วย
# รวม
2. ในการตั้งค่าเป็นโมฆะ ()
- เราเริ่มการสื่อสารแบบอนุกรมที่ Baud Rate 9600
Serial.begin (9600);
- คำสั่งด้านล่างตั้งค่า MISO เป็น OUTPUT (ต้องส่งข้อมูลไปยัง Master IN) ดังนั้นข้อมูลจะถูกส่งผ่าน MISO ของ Slave Arduino
pinMode (MISO, เอาท์พุท);
- ตอนนี้เปิด SPI ในโหมด Slave โดยใช้ SPI Control Register
SPCR - = _BV (SPE);
- จากนั้นเปิดการขัดจังหวะสำหรับการสื่อสาร SPI หากได้รับข้อมูลจากต้นแบบ Interrupt Service Routine จะถูกเรียกและค่าที่ได้รับจะถูกนำมาจาก SPDR (SPI data Register)
SPI.attachInterrupt ();
- ค่าจากต้นแบบถูกนำมาจาก SPDR และเก็บไว้ในตัวแปร Slavereceived สิ่งนี้เกิดขึ้นในฟังก์ชัน Interrupt Routine ต่อไปนี้
ISR (SPI_STC_vect) {Slavereceived = SPDR; ได้รับ = จริง; }
3. ถัดไปในvoid loop ()
- อ่านค่าอนาล็อกจาก Slave Arduino POT ที่ต่อกับพิน A0
หม้อ int = analogRead (A0);
- แปลงค่านั้นในรูปของหนึ่งไบต์เป็น 0 ถึง 255
Slavesend = แผนที่ (หม้อ, 0,1023,0,255);
- ขั้นตอนที่สำคัญถัดไปคือการส่งมูลค่าที่แปลงแล้วไปยัง Master STM32F10C8 ดังนั้นให้วางค่าในทะเบียน SPDR การลงทะเบียน SPDR ใช้ในการส่งและรับค่า
SPDR = Slavesend;
- จากนั้นแสดงค่าที่ได้รับ ( SlaveReceive ) จาก Master STM32F103C8 บน LCD ด้วยความล่าช้า 500 ไมโครวินาทีจากนั้นจึงรับและแสดงค่าเหล่านั้นอย่างต่อเนื่อง
lcd.setCursor (0,0); lcd.print ("ทาส: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 ถึง Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); ล่าช้า (500);
ด้วยการ หมุนโพเทนชิออมิเตอร์ที่ด้านหนึ่งคุณจะเห็นค่าที่แตกต่างกันบน LCD อีกด้านหนึ่ง:
ดังนั้นนี้เป็น วิธีการสื่อสาร SPI จะเกิดขึ้นใน STM32 ตอนนี้คุณสามารถเชื่อมต่อเซ็นเซอร์ SPI กับบอร์ด STM32 ได้แล้ว
การเข้ารหัสที่สมบูรณ์สำหรับ Master STM32 และ Slave Arduino มีให้ด้านล่างพร้อมวิดีโอสาธิต