- מהו SPI Protocol Protocol?
- כיצד פועל פרוטוקול SPI?
- ההבדל בין I2C לתקשורת SPI
- SPI עם PIC16F877A באמצעות מהדר XC8:
- הסבר על קובץ כותרת SPI:
- תוכנית ראשית הסבר:
- הדמיית PIC עם איתור באגים של SPI:
מיקרו-בקרים של PIC הם פלטפורמה עוצמתית המסופקת על ידי שבב מיקרו לפרויקטים משובצים; האופי הרב-תכליתי שלו איפשר לה למצוא דרכים ליישומים רבים ועדיין לגדול הרבה. אם עקבת אחר מדריכי PIC שלנו, היית שם לב שכבר סקרנו מגוון רחב של הדרכות בנושא מיקרו-בקר PIC החל מהיסודות הבסיסיים. באותה הזרימה אנו ממשיכים ללמוד את פרוטוקולי התקשורת הזמינים עם PIC וכיצד להשתמש בהם. כבר כיסינו את I2C באמצעות PIC Microcontroller.
במערכת העצומה של יישומים משובצים, אף מיקרו-בקר אינו יכול לבצע את כל הפעילויות בעצמו. בשלב מסוים של זמן עליו לתקשר למכשירים אחרים כדי לשתף מידע, ישנם סוגים רבים ושונים של פרוטוקולי תקשורת לשיתוף מידע זה, אך השימושים הנפוצים ביותר הם USART, IIC, SPI ו- CAN. לכל פרוטוקול תקשורת יש את היתרון והחסרון שלו. בואו נתמקד ב פרוטוקול SPI לעת עתה מכיוון שזה מה שאנחנו הולכים ללמוד במדריך זה.
מהו SPI Protocol Protocol?
המונח SPI מייצג " ממשק היקפי סידורי ". זהו פרוטוקול תקשורת נפוץ המשמש לשליחת נתונים בין שני בקרי מיקרו או לקריאת / כתיבת נתונים מחיישן למיקרו-בקר. הוא משמש גם לתקשורת עם כרטיסי SD, רושמי משמרות, בקרי תצוגה ועוד.
כיצד פועל פרוטוקול SPI?
תקשורת SPI היא תקשורת סינכרונית, כלומר היא עובדת בעזרת אות שעון המשותף בין שני המכשירים המחליפים את הנתונים. כמו כן מדובר בתקשורת דופלקסית מלאה מכיוון שהיא יכולה לשלוח ולקבל נתונים באמצעות אוטובוס נפרד. תקשורת SPI דורשת 5 חוטים לפעול. מעגל תקשורת SPI פשוט בין מאסטר לעבד מוצג להלן
חמשת החוטים הנדרשים לתקשורת הם SCK (שעון סידורי), MOSI (Master Out Slave In), MISO (Master In Slave Out) ו- SS (Slave Select). תקשורת ה- SPI מתקיימת תמיד רק בין אדון לעבד. לאדון יכול להיות מחובר אליו מספר עבדים. המאסטר אחראי על הפקת דופק השעון והוא משותף עם כל העבדים. כמו כן, כל התקשורת יכולה להיות יזומה רק על ידי המאסטר.
סיכת SCK (aka שעון SCL טורי) חולקת את אות השעון שמפיק המאסטר עם העבדים. סיכת MOSI (המכונה SDA –Serial Data Out) משמשת לשליחת הנתונים מהמאסטר למשחה. סיכת MISO (aka SDI - Serial Data In) משמשת להעברת הנתונים מהמשחה למאסטר. ניתן גם לעקוב אחר סימן החץ באיור לעיל כדי להבין את תנועת הנתונים / האות. לבסוף נעשה שימוש בפין ה- SS (המכונה CS –Chip select) כאשר ישנם יותר ממודולי עבדים אחד המחוברים למאסטר. זה יכול לשמש לבחירת העבד הנדרש. מעגל לדוגמה שבו יותר מעבד אחד מחובר למאסטר לתקשורת SPI מוצג במעגל למטה.
ההבדל בין I2C לתקשורת SPI
למדנו כבר תקשורת I2C עם PIC ולכן עלינו להכיר את האופן שבו I2C עובד והיכן נוכל להשתמש בהם כמו I2C ניתן להשתמש כדי לממשק מודול RTC. אבל עכשיו, למה אנחנו צריכים פרוטוקול SPI כשיש לנו כבר I2C. הסיבה היא שתקשורת I2C ו- SPI הן יתרונות בדרכים שלה ולכן היא ספציפית ליישום.
במידה מסוימת ניתן לראות בתקשורת I2C יתרונות מסוימים ביחס לתקשורת SPI מכיוון ש- I2C משתמש במספר פחות של סיכות וזה נהיה מאוד שימושי כאשר יש מספר גדול של עבדים המחוברים לאוטובוס. אך החיסרון של I2C הוא שיש לו את אותו אוטובוס לשליחה וקבלה של נתונים ולכן הוא איטי יחסית. אז זה מבוסס על בסיס יישום להחליט בין פרוטוקול SPI ו- I2C עבור הפרויקט שלך.
SPI עם PIC16F877A באמצעות מהדר XC8:
די ביסודות, עכשיו בואו ללמוד כיצד נוכל להשתמש בתקשורת SPI במיקרו-בקר PIC16F877A באמצעות מהדר MPLABX IDE ו- XC8. לפני שנתחיל להבהיר כי הדרכה זו מדברת רק על SPI ב- PIC16F877a באמצעות מהדר XC8, התהליך יהיה זהה עבור מיקרו-בקרים אחרים, אך ייתכן שיהיה צורך בשינויים קלים. זכור גם שעבור מיקרו-בקרים מתקדמים כמו סדרת PIC18F, למהדר עצמו עשויה להיות ספרייה מובנית לשימוש בתכונות SPI, אך עבור PIC16F877A אין דבר כזה, אז בוא נבנה לבד. הספרייה המוסברת כאן תינתן כקובץ כותרת להורדה בתחתיתו, שניתן להשתמש בו עבור PIC16F877A כדי לתקשר עם מכשירי SPI אחרים.
במדריך זה נכתוב תוכנית קטנה המשתמשת בתקשורת SPI כדי לכתוב ולקרוא נתונים מאוטובוס ה- SPI. לאחר מכן נאמת אותו באמצעות סימולציה של פרוטאוס. כל הקוד הקשור לרשומות SPI ייעשה בתוך קובץ הכותרת הנקרא PIC16f877a_SPI.h. בדרך זו אנו יכולים להשתמש בקובץ הכותרת הזה בכל הפרויקטים הקרובים שלנו בהם נדרשת תקשורת SPI. ובתוך התוכנית הראשית פשוט נשתמש בפונקציות מקובץ הכותרת. את הקוד השלם יחד עם קובץ הכותרת ניתן להוריד מכאן.
הסבר על קובץ כותרת SPI:
בתוך קובץ הכותרת עלינו לאתחל את תקשורת SPI עבור PIC16F877a. כמו תמיד המקום הטוב ביותר להתחיל בו הוא גליון הנתונים PIC16F877A. הרשמים השולטים בתקשורת SPI עבור PIC16F8777a הם ה- SSPSTAT וה- SSPCON Register. תוכלו לגשת אליהם בעמוד 74 ו -75 בגליון הנתונים.
ישנן אפשרויות פרמטרים רבות שיש לבחור בעת אתחול תקשורת ה- SPI. האפשרות הנפוצה ביותר היא שתדר השעון יוגדר ל- Fosc / 4 ויעשה באמצע והשעון יוגדר נמוך במצב אידיאלי. אז אנו משתמשים גם באותה תצורה עבור קובץ הכותרת שלנו, אתה יכול לשנות אותם בקלות על ידי שינוי הסיביות המתאימות.
SPI_Initialize_Master ()
פונקציית ה- Master של אתחול ה- SPI משמשת להפעלת תקשורת ה- SPI כ- Master. בתוך פונקציה זו הגדרנו את הפינים המתאימים RC5 ו- RC3 כסיכות פלט. לאחר מכן אנו מגדירים את ה- SSPTAT ואת ה- SSPCON להפעיל את תקשורת SPI
בטל SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // עמ '74/234 SSPCON = 0b00100000; // עמ '75/234 TRISC3 = 0; // Set כפלט עבור מצב העבדים }
SPI_Initialize_Slave ()
פונקציה זו משמשת להגדרת המיקרו-בקר לעבוד במצב עבדים לתקשורת SPI. במצב עבד יש להגדיר את הפין RC5 כפלט ואת הפין RC3 צריך להיות מוגדר כקלט. ה- SSPSTAT וה- SSPCON מוגדרים באותו אופן הן עבור העבד והן עבור האדון.
בטל SPI_Initialize_Slave () { TRISC5 = 0; // יש להכריז על סיכת SDO כפלט SSPSTAT = 0b00000000; // עמ '74/234 SSPCON = 0b00100000; // עמ '75/234 TRISC3 = 1; // הגדר כמצב יציאה למצב מאסטר }
SPI_Write (אות נכנסת)
פונקציית כתיבת SPI משמשת לכתיבת נתונים לאוטובוס SPI. הוא מקבל את המידע מהמשתמש דרך המשתנה הנכנס ואז משתמש בו כדי לעבור לרשם המאגר. ה- SSPBUF יימחק בדופק השעון העוקב והנתונים יישלחו לאוטובוס קצת אחר ביט.
בטל SPI_Write (char נכנס) { SSPBUF = נכנס; // כתוב את הנתונים שניתנו למשתמש במאגר }
SPI_Ready2Read ()
פונקציית SPI ready to Read משמשת כדי לבדוק אם הנתונים באוטובוס SPI מתקבלים לחלוטין והאם ניתן לקרוא אותם. לרשומת SSPSTAT יש קצת שנקרא BF אשר יקבע לאחר קבלת הנתונים לחלוטין, לכן אנו בודקים אם סיבית זו מוגדרת אם היא לא מוגדרת, עלינו להמתין עד שהיא מוגדרת לקרוא משהו מאוטובוס SPI.
לא חתום SPI_Ready2Read () { אם (SSPSTAT & 0b00000001) מחזירים 1; אחרת להחזיר 0; }
SPI_Read ()
ה- SPI Read משמש לקריאת הנתונים מאוטובוס ה- SPI אל המיקרו-בקר. הנתונים שנמצאים באוטובוס SPI יאוחסנו ב- SSPBUF, עלינו לחכות עד שהנתונים המלאים יישמרו במאגר ואז נוכל לקרוא אותם למשתנה. אנו בודקים את ביט ה- BF של הרישום SSPSTAT לפני קריאת המאגר כדי לוודא שקבלת הנתונים הושלמה.
char SPI_Read () // קרא את הנתונים שהתקבלו { תוך (! SSPSTATbits.BF); // החזק עד להגדרת סיבית BF, כדי לוודא שהנתונים המלאים נקראים החזרת (SSPBUF); // להחזיר את הנתונים הנקראים }
תוכנית ראשית הסבר:
הפונקציות שהוסברו בסעיף לעיל יהיו בקובץ הכותרת וניתן לקרוא להן לקובץ c הראשי. אז בואו נכתוב תוכנית קטנה כדי לבדוק אם תקשורת ה- SPI עובדת. פשוט נכתוב מעט נתונים לאוטובוס SPI ונשתמש בסימולציה של פרוטאוס כדי לבדוק אם אותם נתונים מתקבלים בבאגים SPI.
כמו תמיד התחל את התוכנית על ידי הגדרת סיביות התצורה ואז חשוב מאוד להוסיף את קובץ הכותרת שהסברנו זה עתה לתוכנית כמוצג להלן.
#לִכלוֹל
אם פתחת את התוכנית מקובץ ה- zip שהורדת לעיל, כברירת מחדל קובץ הכותרת יהיה קיים בספריית קבצי הכותרת של קובץ הפרויקט שלך. אחרת אתה צריך להוסיף את קובץ הכותרת באופן ידני בתוך הפרויקט שלך, לאחר הוספת קבצי הפרויקט שלך ייראו כך למטה
בתוך הקובץ הראשי עלינו לאתחל את ה- PIC כ- Master לתקשורת SPI ואז בתוך לולאה אינסופית תוך כדי שנכתוב שלושה ערכי hex אקראיים לאוטובוס SPI כדי לבדוק אם נקבל את אותו הדבר במהלך הסימולציה.
בטל main () { SPI_Initialize_Master (); בעוד (1) { SPI_Write (0X0A); __השהיית_מס (100); SPI_Write (0X0F); __השהיית_מס (100); SPI_Write (0X15); __השהיית_מס (100); } }
שימו לב שהערכים האקראיים המשמשים בתוכנית הם 0A, 0F ו- 15 והם ערכים hex ולכן עלינו לראות אותם במהלך סימולציה. זהו שהקוד נעשה הכל, זה רק דוגמה, אך אנו יכולים להשתמש באותה מתודולוגיה כדי לתקשר עם MCU אחר או עם מודול חיישנים אחר הפועל בפרוטוקול SPI.
הדמיית PIC עם איתור באגים של SPI:
כעת, כאשר התוכנית שלנו מוכנה נוכל לקמפל אותה ואז להמשיך בסימולציה. ל- Proteus תכונה שימושית נחמדה הנקראת SPI debugger , בה ניתן להשתמש כדי לנטר את הנתונים דרך אוטובוס SPI. אז אנו משתמשים בו ובונים מעגל כמו להלן.
מכיוון שיש רק מכשיר SPI אחד בסימולציה איננו משתמשים בסיכת ה- SS וכאשר לא נעשה בו שימוש יש לקרקע אותו כמוצג לעיל. פשוט טען את קובץ ה- hex למיקרו-בקר PIC16F877A ולחץ על כפתור ההפעלה כדי לדמות את התוכנית שלנו. לאחר תחילת הסימולציה תקבל חלון קופץ המציג את הנתונים באוטובוס SPI כמוצג להלן
בואו נסתכל מקרוב על הנתונים שנכנסים ונבדוק אם זהים לזה שכתבנו בתוכנית שלנו.
הנתונים מתקבלים באותו סדר שכתבנו בתכנית שלנו וזהה מודגש עבורך. אתה יכול גם לנסות לדמות תוכנית כדי לתקשר עם שני מיקרו-בקרים PIC באמצעות פרוטוקול SPI. עליך לתכנת PIC אחד כמאסטר והשני כעבד. כל קבצי הכותרת הנדרשים למטרה זו ניתנים כבר בקובץ הכותרת.
זו רק הצצה למה ש- SPI יכול לעשות, זה יכול גם לקרוא ולכתוב נתונים למספר מכשירים. אנו נסקור עוד על SPI בהדרכות הקרובות שלנו על ידי ממשק מודולים שונים שעובדים עם פרוטוקול SPI.
מקווה שהבנתם את הפרויקט ולמדתם ממנו משהו שימושי. אם יש לך ספקות פרסם אותם בסעיף ההערות למטה או השתמש בפורומים לעזרה טכנית.
הקוד הראשי השלם ניתן להלן; אתה יכול להוריד קבצי כותרת עם כל הקוד מכאן