- מהו פרוטוקול תקשורת I2C?
- כיצד עובדת תקשורת I2C?
- היכן להשתמש בתקשורת I2C?
- I2C עם PIC16F877a באמצעות מהדר XC8
- תכנות באמצעות קבצי הכותרת I2C:
- הדמיית פרוטאוס:
מיקרו-בקרים של PIC הם פלטפורמה עוצמתית המסופקת על ידי שבב מיקרו לפרויקטים משובצים, אופיה הרב-תכליתי גרם לו למצוא דרכים ליישומים רבים והשלב עדיין נמשך. אם עקבת אחר מדריכי PIC שלנו היית שם לב שכבר סקרנו מגוון רחב של הדרכות בנושא מיקרו-בקר PIC החל מהיסודות הבסיסיים. מאז, סקרנו את היסודות שאנו יכולים להיכנס לדברים מעניינים יותר כמו פורטל התקשורת.
במערכת העצומה של יישומים משובצים, אף מיקרו-בקר אינו יכול לבצע את כל הפעילויות בעצמו. בשלב מסוים של זמן עליו לתקשר למכשירים אחרים כדי לשתף מידע, ישנם סוגים רבים ושונים של פרוטוקולי תקשורת לשיתוף מידע זה, אך השימושים הנפוצים ביותר הם USART, IIC, SPI ו- CAN. לכל פרוטוקול תקשורת יש את היתרון והחסרון שלו. בואו נתמקד בקטע IIC לעת עתה מכיוון שזה מה שאנחנו הולכים ללמוד במדריך זה.
מהו פרוטוקול תקשורת I2C?
המונח IIC מייצג " מעגלים משולבים בין-לאומיים ". בדרך כלל זה מסומן כ- I2C או בריבוע C או אפילו כפרוטוקול ממשק דו-חוטי (TWI) במקומות מסוימים, אך כל זה אומר אותו דבר. I2C הוא פרוטוקול תקשורת סינכרוני שמשמעותו, שני המכשירים שמשתפים את המידע חייבים לשתף אות שעון משותף. יש לו רק שני חוטים לשיתוף מידע שמתוכם אחד משמש לאות הזין והשני משמש לשליחת וקבלת נתונים.
כיצד עובדת תקשורת I2C?
תקשורת I2C הוצגה לראשונה על ידי פיליפס. כאמור קודם יש לו שני חוטים, שני חוטים אלה יחוברו על פני שני מכשירים. כאן מכשיר אחד נקרא מאסטר והמכשיר השני נקרא עבד. תקשורת צריכה ותמיד תתרחש בין שני מאסטר ועבד. היתרון בתקשורת I2C הוא שניתן לחבר יותר מעבד אחד למאסטר.
התקשורת המלאה מתבצעת באמצעות שני החוטים הללו, כלומר שעון סידורי (SCL) ונתונים סידוריים (SDA).
שעון סידורי (SCL): משתף את אות השעון שנוצר על ידי המאסטר עם העבד
נתונים סידוריים (SDA): שולח את הנתונים אל המאסטר והעבד וממנו.
בכל זמן נתון רק המאסטר יוכל ליזום את התקשורת. מכיוון שיש יותר מעבד אחד באוטובוס, המאסטר צריך להתייחס לכל עבד באמצעות כתובת אחרת. כאשר פונים אליו רק המשחה עם הכתובת הספציפית הזו ישיב בחזרה עם המידע בזמן שהאחרים ממשיכים להפסיק. בדרך זו אנו יכולים להשתמש באותו אוטובוס כדי לתקשר עם מספר מכשירים.
היכן להשתמש בתקשורת I2C?
תקשורת I2C משמשת רק לתקשורת למרחקים קצרים. זה בהחלט אמין במידה שכן יש לו דופק שעון מסונכרן כדי להפוך אותו לחכם. פרוטוקול זה משמש בעיקר לתקשורת עם חיישן או התקנים אחרים אשר צריכים לשלוח מידע למאסטר. זה מאוד שימושי כאשר מיקרו-בקר צריך לתקשר עם מודולי עבדים רבים אחרים באמצעות מינימום חוטים בלבד. אם אתם מחפשים תקשורת לטווח רחוק עליכם לנסות את RS232 ואם אתם מחפשים תקשורת אמינה יותר עליכם לנסות את פרוטוקול SPI.
I2C עם PIC16F877a באמצעות מהדר XC8
די להיכרות, מאפשר להיכנס אליו וללמוד כיצד נוכל להשתמש במיקרו-בקר לביצוע תקשורת I2C. לפני שנתחיל להבהיר כי מדריך זה מדבר רק על I2C ב- PIC16F877a באמצעות מהדר XC8, התהליך יהיה זהה עבור מיקרו-בקרים אחרים אך ייתכן שיהיה צורך בשינויים קלים. זכור גם שעבור מיקרו-בקרים מתקדמים כמו סדרת PIC18F, למהדר עצמו אולי ישנה ספרייה מובנית לשימוש בתכונות I2C, אך עבור PIC16F877A אין דבר כזה, אז בוא נבנה לבד. הספרייה שתוסבר כאן תינתן כקובץ כותרת להורדה בתחתיתו, שיכול לשמש עבור PIC16F877A כדי לתקשר עם מכשירי I2C אחרים.
כמו תמיד המקום הטוב ביותר להתחיל בכל דבר הוא גיליון הנתונים שלנו. חפש פרטים אודות I2C בגליון הנתונים ובדוק אילו רושמים יש להגדיר. אני לא מתכוון להסביר בפרטים מכיוון שגליון הנתונים כבר עשה זאת עבורך. בהמשך אני הולך להסביר את הפונקציות השונות הקיימות בקובץ הכותרת ואת האחריות שלהן בתוכנית.
בטל I2C_Initialize ()
פונקציית האתחול משמשת כדי לומר למיקרו-בקר שאנחנו הולכים להשתמש בפרוטוקול I2C. ניתן לעשות זאת על ידי הגדרת הביטים הנדרשים במרשם SSPCON ו- SSPCON2. הצעד הראשון יהיה להכריז על סיכות ה- IIC כסיכות קלט, כאן יש להשתמש בפינים RC3 ו- RC4 לתקשורת I2C ולכן אנו מכריזים עליהם כסיכות קלט. בשלב הבא עלינו להגדיר את ה- SSPCON ו- SSPCON2 שהם רושמי בקרת MSSP. אנו מפעילים את ה- PIC במצב מאסטר IIC עם תדר שעון של FOSC / (4 * (SSPADD + 1)). עיין במספרי העמודים בגליון הנתונים המוזכרים בשורות ההערה למטה כדי להבין מדוע אותו מרשם מסוים מוגדר כך.
אז הבא עלינו להגדיר את תדר השעון, תדר השעון ליישומים שונים עשוי להשתנות, ולכן אנו מקבלים את הבחירה מהמשתמש דרך המשתנה feq_k ומשתמשים בנוסחאות שלנו כדי להגדיר את רישום ה- SSPADD.
בטל I2C_Initialize (const לא חתום feq_K) // התחל את IIC כמאסטר { TRISC3 = 1; TRISC4 = 1; // הגדר סיכות SDA ו- SCL כסיכות קלט SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; // הגדרת מהירות שעון pg99 / 234 SSPSTAT = 0b00000000; // pg83 / 234 }
בטל I2C_Hold ()
הפונקציה החשובה הבאה היא פונקציית I2C_hold המשמשת להחזקת ביצוע המכשיר עד להשלמת פעולת ה- I2C הנוכחית. נצטרך לבדוק אם יש לבצע את פעולות ה- I2C לפני שמתחילים בפעולה חדשה. ניתן לעשות זאת על ידי בדיקת הרישום SSPSTAT ו- SSPCON2. ה- SSPSTAT מכיל את המידע אודות מצב האוטובוס I2C.
התוכנית עשויה להיראות מעט מורכבת מכיוון שהיא כוללת מפעיל "ו-" ו- "או". כשאתה שובר את זה כמו
SSPSTAT & 0b00000100 SSPCON2 & 0b00011111
</s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s>
זה אומר שאנחנו מוודאים כי 2 nd קצת על SSPSTAT הוא אפס ובדומה ביטים בין 0 ל -4 הם אפס על SSPCON2. ואז אנו משלבים את כל אלה כדי לבדוק שהתוצאה היא אפס. אם התוצאה היא אפס התוכנית תמשיך אם לא היא תחזיק שם עד שתקבל אפס מכיוון שהיא משמשת בלולאת זמן .
בטל I2C_Hold () { תוך ((SSPCON2 & 0b00011111) - (SSPSTAT & 0b00000100)); // בדוק את זה ברשומות כדי לוודא שה- IIC אינו מתבצע }
בטל I2C_Begin () ומבוטל I2C_End ()
בכל פעם שאנחנו כותבים או קוראים נתונים באמצעות אוטובוס I2C עלינו להתחיל ולסיים את חיבור I2C. כדי להתחיל בתקשורת I2C עלינו להגדיר את סיבית ה- SEN וכדי לסיים את התקשורת עלינו להגדיר את סיבית המצב PEN. לפני שנחלף אחד מהביטים הללו, עלינו לבדוק אם אוטובוס ה- I2C תפוס באמצעות הפונקציה I2C_Hold כפי שפורט לעיל.
בטל I2C_Begin () { I2C_Hold (); // החזק את התוכנית I2C תפוס SEN = 1; // התחל IIC pg85 / 234 } ריק I2C_End () { I2C_Hold (); // החזק את התוכנית I2C תפוס PEN = 1; // סוף IIC pg85 / 234 }
בטל I2C_Write ()
פונקציית הכתיבה משמשת לשליחת כל הנתונים ממודול המאסטר למודול המשחה. פונקציה זו משמשת בדרך כלל לאחר פונקציית התחלת I2C ואחריה פונקציית סיום I2C. הנתונים שיש לכתוב לאוטובוס ה- IIC מועברים דרך הנתונים המשתנים. נתונים אלה נטענים לאחר מכן אל מרשם החיץ SSPBUF כדי לשלוח אותם על גבי אוטובוס I2C.
בדרך כלל לפני כתיבת נתונים תיכתב כתובת, כך שתצטרך להשתמש בפונקציית הכתיבה פעמיים, פעם אחת להגדרת הכתובת ובפעם השנייה למשלוח הנתונים בפועל.
בטל I2C_Write (נתונים לא חתומים) { I2C_Hold (); // החזק את התוכנית I2C תפוס SSPBUF = נתונים; // pg82 / 234 }
לא חתום I2C_Read ()
הפונקציה הסופית שעלינו לדעת עליה היא פונקציית I2C_Read . פונקציה זו משמשת לקריאת הנתונים הנמצאים כעת באוטובוס I2C. הוא משמש לאחר שביקש עבד לכתוב ערך כלשהו לאוטובוס. הערך המתקבל יהיה ב- SSPBUF, אנו יכולים להעביר את הערך לכל משתנה עבור פעולתנו.
במהלך תקשורת I2C, העבד לאחר שליחת הנתונים המבוקשים על ידי המאסטר ישלח ביט נוסף שהוא ביט ההכרה, על המאסטר לבדוק את זה גם כדי לוודא שהתקשורת הצליחה. לאחר בדיקת ביט ACKDT לאישור עליו להיות מופעל על ידי הגדרת סיבית ACKEN.
לא חתום קצר I2C_Read (לא חתום קצר ack) { לא חתום קצר נכנס; I2C_Hold (); RCEN = 1; I2C_Hold (); נכנס = SSPBUF; // שמור את הנתונים ב- SSPBUF I2C_Hold (); ACKDT = (ack)? 0: 1; // בדוק אם bit ack קיבל ACKEN = 1; // עמ '85/234 חזרה נכנסת; }
זהו, פונקציות אלה צריכות להספיק בכדי להגדיר תקשורת I2C ולכתוב או לקרוא נתונים ממכשיר. שים לב שישנן פונקציות רבות אחרות שתקשורת I2C יכולה לבצע, אך למען הפשטות איננו דנים בהן כאן. אתה תמיד יכול להפנות את גליון הנתונים כדי לדעת את העבודה המלאה של
ניתן להוריד את הקוד השלם עם קובץ הכותרת לתקשורת PIC16F877A I2C מהקישור.
תכנות באמצעות קבצי הכותרת I2C:
כעת לאחר שלמדנו כיצד פועלת תקשורת I2C וכיצד אנו יכולים להשתמש בקובץ הכותרת שנוצר עבורה, בואו נערוך תוכנית פשוטה בה נשתמש בקובץ הכותרת ונכתוב כמה ערכים לקווי I2C. לאחר מכן נדמה תוכנית זו ונבדוק אם ערכים אלה נכתבים באוטובוס.
כמו תמיד התוכנית מתחילה בהגדרת סיביות התצורה ובהגדרת תדר השעון ל -20 מגה הרץ כמוצג להלן
# pragma config FOSC = HS // סיביות בחירת מתנד (מתנד HS) # config config WDTE = OFF // טיימר כלב שמירה אפשר ביט (WDT מושבת) # pragma config PWRTE = ON // הפעלה טיימר הפעלת bit (PWRT מופעל) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) # pragma config LVP = OFF // מתח נמוך (אספקה יחידה) תכנות סידורי במעגל אפשר Bit (RB3 הוא Digital I / O, HV פועל יש להשתמש ב- MCLR לצורך תכנות) # config config CPD = OFF // Data EEPROM Memory Code Protection Protection (Data EEPROM code code off) # pragma config WRT = OFF // Flash Programm Memory Memory כתוב אפשר ביטים (הגנת כתיבה כבויה; כל זיכרון התוכנית עשוי להיכתב על ידי בקרת EECON) # config config CP = OFF // Bit Bit Memory Code Code Protection (Code code off) #define _XTAL_FREQ 20000000
השלב הבא יהיה להוסיף את קובץ הכותרת שעליו בדיוק דנו. קובץ הכותרת נקרא PIC16F877a_I2C.h וניתן להוריד אותו מהקישור עליו דנו לעיל. ודא שקובץ הכותרת נוסף בקובץ הכותרת של רשימת הפרויקטים שלך, מבנה קובץ הפרויקט שלך צריך להיראות כך
לאחר שתוודא שקובץ הכותרת נוסף לקובץ הפרוייקט שלך כלול את קובץ הכותרת בקובץ C הראשי
#לִכלוֹל
בתוך בעוד הלולאה אנו נתחיל את תקשורת I2C הערכים האקראיים כמה כתיבת אוטובוס I2C ולאחר מכן סיימנו את תקשורת I2C. הערכים האקראיים שבחרתי הם D0, 88 ו- FF. אתה יכול להזין כל הערכים שאתה רוצה. אך זכרו את הערכים הללו כיוון שנאמת אותם בסימולציה שלנו.
ואילו (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __השהיית_מס (1000); }
את התוכנית המלאה תוכלו למצוא בתחתית הדף, תוכלו להשתמש בה או להוריד מכאן את קובץ ה- zip המלא של התוכנית. לאחר קבלת התוכנית הידור אותה והתכונן לסימולציה.
הדמיית פרוטאוס:
ל- Proteus יש מכשיר נחמד בשם I2C debugger ובאמצעותו ניתן לקרוא את הנתונים באוטובוס I2C, אז בואו נבנה מעגל באמצעותו ונבדוק אם הנתונים נכתבים בהצלחה. תרשים המעגל המלא מוצג להלן
טען את קובץ ה- hex שנוצר על ידי התוכנית שלנו על ידי לחיצה כפולה על המיקרו-בקר. ואז לדמות את התוכנית. תבחין בחלון שצץ ויציג את כל המידע על אוטובוס I2C. חלון התוכנית שלנו מוצג למטה.
אם תסתכל מקרוב על הנתונים שנכתבים אתה יכול להבחין שהם זהים לזה שכתבנו בתוכנית שלנו. הערכים הם D0, 88 ו- FF. הערכים נכתבים לכל שנייה, כך שהזמן מתעדכן גם כמוצג להלן. החץ הכחול מציין שהוא כתוב ממאסטר לעבד, הוא היה מצביע בכיוון ההפוך אם אחרת. מבט מקרוב על הנתונים הנשלחים מוצג להלן.
זו רק הצצה למה ש- I2C יכול לעשות, הוא יכול גם לקרוא ולכתוב נתונים למספר מכשירים. אנו נסקור עוד על I2C בהדרכות הקרובות שלנו על ידי ממשק מודולים שונים שעובדים עם פרוטוקול I2C.
מקווה שהבנתם את הפרויקט ולמדתם ממנו משהו שימושי. אם יש לך ספקות פרסם אותם בסעיף ההערות למטה או השתמש בפורומים לעזרה טכנית.
הקוד המלא ניתן להלן; אתה יכול להוריד קבצי כותרת עם כל הקוד מכאן.