- SPI ב- STM32F103C8
- סיכות SPI בארדואינו
- רכיבים נדרשים
- תרשים מעגלים וחיבורים להדרכת STM32 SPI
- תכנות STM32 SPI
- הסבר לתכנות מאסטר STM32 SPI
- הסבר על תכנות SPI Arduino SPI
בהדרכות הקודמות שלנו למדנו על תקשורת SPI ו- I2C בין שני לוחות Arduino. במדריך זה נחליף לוח ארדואינו אחד בלוח הגלולה הכחולה שהוא STM32F103C8 ונתקשר עם לוח הארדואינו באמצעות אוטובוס SPI. בדוגמה זו STM32 SPI, נשתמש בארדואינו UNO כעבד ו- STM32F103C8 כמסטר עם שתי תצוגות LCD 16X2 מחוברות זו לזו בנפרד. שני פוטנציומטרים מחוברים גם ל- STM32 (PA0) וארדואינו (A0) כדי לקבוע את ערכי השליחה (0 עד 255) ממאסטר לעבד ועבד למאסטר על ידי שינוי הפוטנציומטר.
SPI ב- STM32F103C8
בהשוואת אוטובוס SPI בארדואינו ו- STM32F103C8 לוח גלולות כחולות, יש ב- STM32 2 אוטובוסים SPI ואילו לארדואינו אונו יש אוטובוס SPI אחד. Arduino Uno כולל ATMEGA328 מיקרו-בקר, ו- STM32F103C8 כולל ARM Cortex-M3 מה שהופך אותו למהיר יותר מאשר לוח Arudino.
למידע נוסף על תקשורת SPI, עיין במאמרים הקודמים שלנו
- כיצד להשתמש ב- SPI בארדואינו: תקשורת בין שני לוחות ארדואינו
- תקשורת SPI עם מיקרו-בקר PIC16F877A
- תקשורת SPI באמצעות Bit Banging
- Raspberry Pi גלאי דליפת מים חמים באמצעות מודולי SPI
- שעון בזמן אמת ESP32 באמצעות מודול DS3231
STM32 סיכות SPI STM32F103C8
קו SPI 1 | הצמד ב STM32F103C8 |
MOSI1 | PA7 או PB5 |
MISO1 | PA6 או PB4 |
SCK1 | PA5 או PB3 |
SS1 | PA4 או PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
סיכות SPI בארדואינו
קו SPI |
הצמד בארדואינו |
MOSI |
11 או ICSP-4 |
מיסו |
12 או ICSP-1 |
SCK |
13 או ICSP-3 |
SS |
10 |
רכיבים נדרשים
- STM32F103C8
- ארדואינו
- LCD 16x2 - 2
- פוטנציומטר 10k - 4
- קרש לחם
- חוטי חיבור
תרשים מעגלים וחיבורים להדרכת STM32 SPI
הטבלה שלהלן מציגה את הסיכות המחוברות לתקשורת STM32 SPI עם Arduino.
פין SPI |
STM32F103C8 |
ארדואינו |
MOSI |
PA7 |
11 |
מיסו |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
הטבלה שלהלן מציגה את הפינים המחוברים לשני LCD (16x2) עם STM32F103C8 וארדואינו בנפרד.
סיכת LCD |
STM32F103C8 |
ארדואינו |
VSS |
GND |
GND |
VDD |
+ 5 וולט |
+ 5 וולט |
V0 |
ל- PIN של מרכז הפוטנציומטר עבור ניגודיות LCD |
ל- PIN של מרכז הפוטנציומטר עבור ניגודיות LCD |
RS |
PB0 |
2 |
RW |
GND |
GND |
ה |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
א |
+ 5 וולט |
+ 5 וולט |
ק |
GND |
GND |
חָשׁוּב:
- אל תשכח לחבר את ה- Arduino GND ו- STM32F103C8 GND יחד.
תכנות STM32 SPI
התכנות דומה לקוד הארדואינו. אותו הדבר
בדוגמה זו STM32 SPI, נשתמש בארדואינו UNO כעבד ו- STM32F103C8 כמסטר עם שתי תצוגות LCD 16X2 מחוברות זו לזו בנפרד. שני פוטנציומטרים מחוברים גם ל- STM32 (PA0) וארדואינו (A0) כדי לקבוע את ערכי השליחה (0 עד 255) ממאסטר לעבד ועבד למאסטר על ידי שינוי הפוטנציומטר.
קלט אנלוגי נלקח ב STM32F10C8 סיכה PA0 (0 עד 3.3V) על ידי סיבוב הפוטנציומטר. לאחר מכן ערך קלט זה מומר לערך אנלוגי לדיגיטלי (0 עד 4096) וערך דיגיטלי זה ממופה עוד ל (0 עד 255) מכיוון שנוכל לשלוח רק 8 סיביות (בתים) באמצעות תקשורת SPI בבת אחת.
באופן דומה בצד העבדים אנו לוקחים ערך קלט אנלוגי בסיכת Arduino A0 מ (0 עד 5V) באמצעות פוטנציומטר. ושוב ערך קלט זה מומר לערך אנלוגי לדיגיטלי (0 עד 1023) וערך דיגיטלי זה ממופה עוד ל (0 עד 255)
במדריך זה שתי תוכניות האחת למאסטר STM32 ואחת עבור עבד ארדואינו. תוכניות שלמות לשני הצדדים ניתנות בסוף פרויקט זה עם סרטון הדגמה.
הסבר לתכנות מאסטר STM32 SPI
1. קודם כל עלינו לכלול את ספריית SPI לשימוש בפונקציות תקשורת SPI וספריית LCD לשימוש בפונקציות LCD. הגדר גם סיכות LCD עבור 16x2 LCD. למידע נוסף על ממשק LCD עם STM32 כאן.
#לִכלוֹל
2. בהגדרת הריק ()
- התחל תקשורת טורית בקצב שידור 9600.
Serial.begin (9600);
- לאחר מכן התחל בתקשורת SPI
SPI.begin ();
- ואז הגדר את מחלק השעון לתקשורת SPI. הגדרתי את מחלק 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- לאחר מכן הגדר את סיכת ה- SS HIGH מכיוון שלא התחלנו לבצע העברה לארדינו עבדים.
digitalWrite (SS, HIGH);
3. בלולאה בטלה ()
- לפני שנשלח ערך כלשהו לעבד עלינו להוריד את ערך בחירת העבד כדי להתחיל להעביר לעבד מהמאסטר.
digitalWrite (SS, LOW);
- לאחר מכן קרא את הערך האנלוגי מהמאסטר STM32F10C8 POT המחובר לסיכה PA0.
סיר פוט = analogRead (PA0);
לאחר מכן המיר ערך זה במונחים של בת אחד (0 עד 255).
בתים MasterSend = מפה (סיר, 0,4096,0,255);
- כאן מגיע השלב החשוב, בהצהרה הבאה אנו שולחים את ערך ה- POT המומר המאוחסן במשתנה Mastersend לעבד הארדואינו, וגם מקבלים ערך מהעבד ארדואינו ושומרים אותו במשתנה mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- הבא מציג את הערכים שקיבלו מהעבד ארדואינו בעיכוב של 500 מיקרו שניות ואז מקבלים ומציגים את הערכים ברציפות.
Serial.println ("עבד ארדואינו למאסטר STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (עיכוב MasterReceive (500); digitalWrite (SS, HIGH);
הערה: אנו משתמשים ב- serial.println () כדי להציג את התוצאה ב- Motor Serial של Arduino IDE.
הסבר על תכנות SPI Arduino SPI
1. זהה למאסטר, קודם כל עלינו לכלול את ספריית SPI לשימוש בפונקציות תקשורת I2C וספריית LCD לשימוש בפונקציות LCD. הגדר גם סיכות LCD עבור 16x2 LCD.
#לִכלוֹל
2. בהגדרת הריק ()
- אנו מתחילים בתקשורת סדרתית בקצב שידור 9600.
Serial.begin (9600);
- ההצהרה הבאה מגדירה את MISO כ- OUTPUT (צריך לשלוח נתונים ל- Master IN). הנתונים נשלחים באמצעות MISO של Slave Arduino.
pinMode (MISO, OUTPUT);
- כעת הפעל את SPI במצב Slave באמצעות Register Control SPI
SPCR - = _BV (SPE);
- ואז הפעל הפסקת תקשורת SPI. אם מתקבלים נתונים מהמאסטר נקראת שגרת השירות להפסיק והערך שהתקבל נלקח מ- SPDR (SPI data Register)
SPI.attachInterrupt ();
- הערך ממאסטר נלקח מ- SPDR ומאוחסן במשתנה Slavereceived . זה מתרחש בתפקוד הפסקת השגרה הבאה.
ISR (SPI_STC_vect) {Slavereceived = SPDR; קיבל = נכון; }
3. הבא בלולאה בטלה ()
- קרא את הערך האנלוגי מ- Pave Arduino POT המצורף לסיכה A0.
סיר פוט = analogRead (A0);
- המר ערך זה במונחים של בת אחד כ- 0 ל- 255.
Slavesend = מפה (סיר, 0,1023,0,255);
- השלב החשוב הבא הוא לשלוח את הערך המומר ל- Master STM32F10C8, אז הכניסו את הערך לרשום SPDR. מרשם ה- SPDR משמש לשליחה וקבלה של ערכים.
SPDR = Slavesend;
- לאחר מכן הציגו את הערך שהתקבל ( SlaveReceive ) ממאסטר STM32F103C8 על גבי LCD עם עיכוב של 500 מיקרו שניות ואז קבלו והציגו את הערך ברציפות.
lcd.setCursor (0,0); lcd.print ("עבד: ארדואינו"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 to Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); עיכוב (500);
על ידי סיבוב פוטנציומטר בצד אחד, תוכלו לראות את הערכים המשתנים על גבי LCD בצד אחר:
אז ככה מתקיימת תקשורת SPI ב- STM32. כעת תוכלו לממשק כל חיישן SPI עם לוח STM32.
הקידוד השלם עבור מאסטר STM32 ועבד ארדואינו ניתן להלן עם סרטון הדגמה