- מה זה SPI?
- עבודה של SPI
- סיכות SPI בארדואינו UNO
- שימוש ב- SPI בארדואינו
- רכיבים נדרשים לתקשורת SPI של Arduino
- תרשים מעגלי תקשורת של SPD של ארדואינו
- כיצד לתכנת Arduino לתקשורת SPI:
- הסבר לתכנות אב של SPD Arduino
- הסבר על תכנות עבדים של SPD Arduino
- איך SPI עובד על Arduino? בואו נבדוק את זה!
מיקרו-בקר משתמש בפרוטוקולים רבים ושונים כדי לתקשר עם חיישנים ומודולים שונים. ישנם סוגים רבים ושונים של פרוטוקולי תקשורת לתקשורת אלחוטית וקווית, וטכניקת התקשורת הנפוצה ביותר היא תקשורת טורית. תקשורת טורית היא תהליך שליחת נתונים ביט אחד בכל פעם, ברצף, דרך ערוץ תקשורת או אוטובוס. ישנם סוגים רבים של תקשורת טורית כמו UART, CAN, USB, I2C ותקשורת SPI.
במדריך זה אנו למדים על פרוטוקול SPI וכיצד להשתמש בו בארדואינו. נשתמש בפרוטוקול SPI לתקשורת בין שני ארדואינו. כאן ארדואינו אחד ישמש כמאסטר ואחד אחר ישמש כעבד, שני נוריות וכפתורי לחיצה יחוברו לשני הארדואינו. כדי להדגים תקשורת SPI, נשלוט על נורית הצד הראשי על ידי כפתור הלחיצה בצד העבדים ולהיפך באמצעות פרוטוקול התקשורת הסדרתית SPI.
מה זה SPI?
SPI (ממשק היקפי סידורי) הוא פרוטוקול תקשורת סדרתי. ממשק SPI נמצא על ידי מוטורולה בשנת 1970. ל- SPI יש חיבור דופלקס מלא, כלומר הנתונים נשלחים ומתקבלים בו זמנית. כלומר מאסטר יכול לשלוח נתונים לעבד ועבד יכול לשלוח נתונים למורה בו זמנית. SPI הוא תקשורת טורית סינכרונית פירושו שהשעון נדרש למטרות תקשורת.
תקשורת SPI הוסברה בעבר במיקרו-בקרים אחרים:
- תקשורת SPI עם מיקרו-בקר PIC16F877A
- ממשק TFT LCD עם מסך מגע 3.5 אינץ 'עם פטל פטל
- תכנות מיקרו בקר AVR עם סיכות SPI
- ממשק נוקיה 5110 LCD גרפי עם ארדואינו
עבודה של SPI
ל- SPI יש תקשורת מאסטר / עבדים באמצעות ארבע שורות. ל- SPI יכול להיות רק מאסטר אחד ויכול להיות עבדים מרובים. מאסטר הוא בדרך כלל מיקרו-בקר והעבדים יכולים להיות מיקרו-בקר, חיישנים, ADC, DAC, LCD וכו '.
להלן ייצוג דיאגרמת הבלוקים של SPI Master עם עבד יחיד.
ל- SPI יש ארבע שורות MISO, MOSI, SS ו- CLK
- MISO (Master in Slave Out) - קו ה- Slave לשליחת נתונים למאסטר.
- MOSI (Master Out Slave In) - קו המאסטר לשליחת נתונים לציוד היקפי.
- SCK (שעון סידורי) - פעימות השעון המסנכרנות העברת נתונים שנוצרה על ידי המאסטר.
- SS (Slave Select) –Master יכול להשתמש בסיכה זו כדי להפעיל ולהשבית התקנים ספציפיים.
מאסטר SPI עם מספר עבדים
כדי להתחיל בתקשורת בין מאסטר ועבד עלינו להגדיר את סיכת ה- Slave Select (SS) של המכשיר הנדרש ל- LOW, כך שהוא יוכל לתקשר עם המאסטר. כשהוא גבוה זה מתעלם מהמאסטר. זה מאפשר לך להתקין מספר מכשירי SPI השותפים את אותם קווי MISO, MOSI ו- CLK של מאסטר. כפי שניתן לראות בתמונה שלעיל ישנם ארבעה עבדים בהם SCLK, MISO, MOSI מחוברים לרוב ל- SS וה- SS של כל עבד מחובר בנפרד לסיכות SS בודדות (SS1, SS2, SS3) של מאסטר. על ידי הגדרת סיכת ה- SS הנדרשת LOW מאסטר יכול לתקשר עם אותו עבד.
סיכות SPI בארדואינו UNO
התמונה למטה מציגה את סיכות SPI המציגות את Arduino UNO (בתיבה אדומה).
קו SPI |
הצמד בארדואינו |
MOSI |
11 או ICSP-4 |
מיסו |
12 או ICSP-1 |
SCK |
13 או ICSP-3 |
SS |
10 |
שימוש ב- SPI בארדואינו
לפני שתתחיל לתכנת לתקשורת SPI בין שני ארדואינו. עלינו ללמוד על ספריית ה- SPI של Arduino המשמשת ב- Arduino IDE.
הספרייה
1. SPI.begin ()
שימוש: כדי לאתחל את אוטובוס ה- SPI על ידי הגדרת SCK, MOSI ו- SS ליציאות, משיכת SCK ו- MOSI נמוכה ו- SS גבוה.
2. SPI.setClockDivider (מחלק)
שימוש: כדי להגדיר את מחלק השעון SPI ביחס לשעון המערכת. המחיצות הזמינות הן 2, 4, 8, 16, 32, 64 או 128.
מְחוּגָה:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (מטפל)
שימוש: פונקציה זו נקראת כאשר מכשיר עבדים מקבל נתונים מהמאסטר.
4. SPI.transfer (val)
שימוש: פונקציה זו משמשת לשליחה וקבלת נתונים בו זמנית בין מאסטר לעבד.
אז עכשיו נתחיל בהדגמה מעשית של פרוטוקול SPI בארדואינו. במדריך זה נשתמש בשני ארדואינו אחד כמאסטר ואחר כעבד. שניהם Arduino מחוברים עם LED & כפתור לחיצה בנפרד. ניתן לשלוט על מנורת LED באמצעות לחצן הלחיצה של עבד ארדואינו וניתן לשלוט על נורית עבד של ארדואינו באמצעות לחצן הלחיצה של מאסטר ארדואינו באמצעות פרוטוקול תקשורת SPI הקיים בארדואינו.
רכיבים נדרשים לתקשורת SPI של Arduino
- ארדואינו UNO (2)
- נורת LED (2)
- לחצן לחצן (2)
- נגד 10k (2)
- נגד 2.2k (2)
- קרש לחם
- חוטי חיבור
תרשים מעגלי תקשורת של SPD של ארדואינו
דיאגרמת המעגל שלהלן מראה כיצד להשתמש ב- SPI ב- Arduino UNO, אך ניתן לבצע את אותו ההליך עבור תקשורת Arduino Mega SPI או תקשורת Arduino nano SPI. כמעט הכל יישאר זהה למעט מספר הסיכה. אתה צריך לבדוק את pinout של Arduino ננו או מגה כדי למצוא את Arduino nano SPI סיכות ו Arduino מגה סיכות, לאחר שעשית כי כל השאר יהיו זהים.
בניתי את המעגל המוצג לעיל מעל קרש לחם, אתה יכול לראות את מערך המעגלים בו השתמשתי לבדיקה להלן.
כיצד לתכנת Arduino לתקשורת SPI:
במדריך זה שתי תוכניות האחת למאסטר ארדואינו והשנייה לעבד ארדואינו. תוכניות שלמות לשני הצדדים ניתנות בסוף פרויקט זה.
הסבר לתכנות אב של SPD Arduino
1. קודם כל עלינו לכלול את ספריית SPI לשימוש בפונקציות תקשורת SPI.
#לִכלוֹל
2. בהגדרת הריק ()
- אנו מתחילים בתקשורת סדרתית בקצב שידור 115200.
Serial.begin (115200);
- חבר את הנורית לסיכה 7 ולחץ על הכפתור לסיכה 2 והגדר את הסיכות האלה OUTPUT ו- INPUT בהתאמה.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- בשלב הבא נתחיל בתקשורת SPI
SPI.begin ();
- לאחר מכן הגדרנו את Clockdivider לתקשורת SPI. כאן קבענו את מחלק 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- ואז הגדר את סיכת ה- SS HIGH מכיוון שלא התחלנו לבצע העברה לארדינו עבדים.
digitalWrite (SS, HIGH);
3. בלולאה בטלה ():
- אנו קוראים את המצב של סיכת הכפתור המחוברת ל- pin2 (מאסטר ארדואינו) לשליחת ערך זה לעבד הארדואינו.
buttonvalue = digitalRead (ipbutton);
- הגדר לוגיקה להגדרת ערך x (להישלח לעבד) בהתאם לקלט מהסיכה 2
אם (buttonvalue == HIGH) { x = 1; } אחר { x = 0; }
- לפני שנשלח את הערך עלינו להוריד את ערך העבד כדי להתחיל בהעברה לעבד מהמאסטר.
digitalWrite (SS, LOW);
- כאן מגיע הצעד החשוב, בהצהרה הבאה אנו שולחים את ערך כפתור הלחיצה המאוחסן במשתנה Mastersend למעבד הארדואינו וגם מקבלים ערך מהעבד שיאוחסן במשתנה Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- לאחר מכן, בהתאם לערך ה- Mastereceive , נדליק או כבה את נורית ה- Master Arduino.
אם (Mastereceive == 1) { digitalWrite (LED, HIGH); // מגדיר סיכה 7 HIGH Serial.println ("נורית LED מופעלת"); } אחר { digitalWrite (LED, LOW); // מגדיר סיכה 7 LOW Serial.println ("נורית LED כבויה"); }
הערה: אנו משתמשים ב- serial.println () כדי להציג את התוצאה ב- Motor Serial של Arduino IDE. בדקו את הסרטון בסוף.
הסבר על תכנות עבדים של SPD Arduino
1. קודם כל עלינו לכלול את ספריית SPI לשימוש בפונקציות תקשורת SPI.
#לִכלוֹל
2. בהגדרת הריק ()
- אנו מתחילים בתקשורת סדרתית בקצב שידור 115200.
Serial.begin (115200);
- חבר את הנורית לסיכה 7 ולחץ על הכפתור לסיכה 2 והגדר את הסיכות האלה OUTPUT ו- INPUT בהתאמה.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- הצעד החשוב כאן הוא ההצהרות הבאות
pinMode (MISO, OUTPUT);
ההצהרה שלעיל קובעת את MISO כ- OUTPUT (צריך לשלוח נתונים ל- Master IN). אז הנתונים נשלחים באמצעות MISO של Slave Arduino.
- כעת הפעל את SPI במצב Slave באמצעות Register Control SPI
SPCR - = _BV (SPE);
- ואז הפעל הפסקת תקשורת SPI. אם נתקבל נתונים מהמאסטר נקראת שגרת ההפסקה והערך שהתקבל נלקח מ- SPDR (SPI data Register)
SPI.attachInterrupt ();
- הערך ממאסטר נלקח מ- SPDR ומאוחסן במשתנה Slavereceived . זה מתרחש בתפקוד הפסקת השגרה הבאה.
ISR (SPI_STC_vect) { Slavereceived = SPDR; קיבל = נכון; }
3. לאחר מכן במעגל הריק () הגדרנו את נורית ה- Slave arduino להדליק או לכבות בהתאם לערך שקיבל עבד.
אם (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // מגדיר את סיכה 7 כ- HIGH LED ON Serial.println ("Slave LED ON"); } אחר { digitalWrite (LEDpin, LOW); // מגדיר את סיכה 7 כ- LOW LED OFF Serial.println ("Slave LED OFF"); }
- לאחר מכן אנו קוראים את הסטטוס של כפתור הלחץ של Slave Arduino ושומרים את הערך ב- Slavesend כדי לשלוח את הערך ל- Master Arduino על ידי מתן ערך לרישום SPDR.
buttonvalue = digitalRead (buttonpin); אם (buttonvalue == HIGH) {x = 1; } אחר {x = 0; } עבד = x; SPDR = Slavesend;
הערה: אנו משתמשים ב- serial.println () כדי להציג את התוצאה ב- Motor Serial של Arduino IDE. בדקו את הסרטון בסוף.
איך SPI עובד על Arduino? בואו נבדוק את זה!
להלן תמונת ההתקנה הסופית לתקשורת SPI בין שני לוחות Arduino.
כאשר לוחצים על כפתור הלחץ בצד הראשי, נורית הלבן בצד העבד נדלקת.
וכאשר לוחצים על כפתור הלחץ בצד העבד, נורית האדום בצד הראשי נדלקת.
אתה יכול לבדוק את הסרטון למטה כדי לראות את ההדגמה של תקשורת SPI של Arduino. אם יש לך שאלות אנא השאר אותן בקטע ההערות, השתמש בפורומים שלנו.