- מהו פרוטוקול תקשורת I2C?
- איך עובדת תקשורת I2C?
- היכן להשתמש בתקשורת I2C?
- I2C ב- Nuvoton N76E003 - דרישת חומרה
- ממשק AT24LC64 עם Nuvoton N76E003 - דיאגרמת מעגלים
- סיכות I2C על Nuvoton N76E003
- תקשורת I2C ב- N76E003
- תכנות N76E003 לתקשורת I2C
- מהבהב את הקוד והפלט
במערכת העצומה של יישומים משובצים, אף מיקרו-בקר אינו יכול לבצע את כל הפעילויות בעצמו. בשלב מסוים של זמן, עליו לתקשר למכשירים אחרים בכדי לשתף מידע, ישנם סוגים רבים ושונים של פרוטוקולי תקשורת כדי לשתף מידע זה, אך השימושים הנפוצים ביותר הם USART, IIC, SPI ו- CAN. לכל פרוטוקול תקשורת יש את היתרון והחסרון שלו. בואו נתמקד בקטע IIC לעת עתה מכיוון שזה מה שאנחנו הולכים ללמוד במדריך זה. אם אתה חדש כאן, עיין במדריכי Nuvoton שבה דנו בכל ציוד היקפי של N76E003 מיקרו-בקר מההדרכה הבסיסית מאוד. אם ברצונך ללמוד כיצד להשתמש ב- I2C עם מיקרו-בקרים אחרים, תוכל לבדוק את הקישורים הבאים.
- כיצד להשתמש ב- I2C בארדואינו: תקשורת בין שני לוחות ארדואינו
- תקשורת I2C עם מיקרו-בקר PIC16F877
- ממשק 16X2 LCD עם ESP32 באמצעות I2C
- תקשורת I2C עם MSP430 Launchpad
- ממשק LCD עם NodeMCU ללא שימוש ב- I2C
- כיצד לטפל בתקשורת מרובה (I2C SPI UART) בתוכנית אחת של ארדואינו
I2C הוא פרוטוקול תקשורת חשוב שפותח על ידי פיליפס (כיום NXP). באמצעות פרוטוקול I2C זה, ניתן לחבר MCU למספר מכשירים ולהתחיל לתקשר. I2C עובד עם שני חוטים בלבד, כלומר SDA ו- SCL. היכן ש- SDA מייצג נתונים סידוריים ו- SCL מייצג שעון סידורי. עם זאת, שני פינים אלה דורשים נגדי משיכה לרמת המתח VCC ועם נגר משיכה הולם, האוטובוס יכול לתמוך ב 127 מכשירים עם כתובת ייחודית.
מהו פרוטוקול תקשורת I2C?
המונח IIC מייצג " מעגלים משולבים בין-לאומיים ". בדרך כלל זה מסומן כ- I2C או בריבוע C או אפילו כפרוטוקול ממשק דו-חוטי (TWI) במקומות מסוימים, אך כל זה אומר אותו דבר. I2C הוא פרוטוקול תקשורת סינכרוני שמשמעותו, שני המכשירים שמשתפים את המידע חייבים לשתף אות שעון משותף. יש לו רק שני חוטים לשיתוף מידע שמתוכם אחד משמש לאות השעון והשני משמש לשליחה וקבלה של נתונים.
איך עובדת תקשורת I2C?
תקשורת I2C הוצגה לראשונה על ידי פיליפס. כפי שנאמר קודם, יש לו שני חוטים, שני חוטים אלה יחוברו על פני שני מכשירים. כאן מכשיר אחד נקרא מאסטר והמכשיר השני נקרא עבד. תקשורת צריכה ותתרחש תמיד בין שתיים, מאסטר ועבד. היתרון בתקשורת I2C הוא שניתן לחבר יותר מעבד אחד למאסטר.
התקשורת המלאה מתבצעת באמצעות שני החוטים הללו, כלומר שעון סידורי (SCL) ונתונים סידוריים (SDA).
שעון סידורי (SCL): משתף את אות השעון שנוצר על ידי המאסטר עם העבד
נתונים סידוריים (SDA): שולח את הנתונים אל המאסטר והעבד וממנו.
בכל זמן נתון, רק המאסטר יוכל ליזום את התקשורת. מכיוון שיש יותר מעבד אחד באוטובוס, המאסטר צריך להתייחס לכל עבד באמצעות כתובת אחרת. כאשר פונים אליהם רק המשחה עם אותה כתובת מסוימת ישיב בחזרה עם המידע בזמן שהאחרים שותקים. בדרך זו אנו יכולים להשתמש באותו אוטובוס כדי לתקשר עם מספר מכשירים.
היכן להשתמש בתקשורת I2C?
תקשורת I2C משמשת רק לתקשורת למרחקים קצרים. זה בהחלט אמין במידה שכן יש לו דופק שעון מסונכרן כדי להפוך אותו לחכם. פרוטוקול זה משמש בעיקר לתקשורת עם החיישן או מכשירים אחרים אשר צריכים לשלוח מידע למאסטר. זה מאוד שימושי כאשר מיקרו-בקר צריך לתקשר עם מודולי עבדים רבים אחרים באמצעות מינימום חוטים בלבד. אם אתם מחפשים תקשורת ארוכת טווח, עליכם לנסות את RS232 ואם אתם מחפשים תקשורת אמינה יותר, עליכם לנסות את פרוטוקול SPI.
I2C ב- Nuvoton N76E003 - דרישת חומרה
מכיוון שהדרישה של פרויקט זה היא ללמוד תקשורת I2C באמצעות N76E003, נשתמש ב- EEPROM שיחובר לקו הנתונים I2C. נשמור כמה נתונים ב- EEPROM וגם נקרא אותם ונציג אותם באמצעות מסך UART.
מכיוון שהערך המאוחסן יודפס ב- UART, כל סוג של ממיר USB ל- UART נדרש. אתה יכול גם לבדוק את ההדרכה על UART עם Nuvoton אם אתה חדש בתקשורת UART ב- N76E003. ליישום שלנו נשתמש בממיר CP2102 UART ל- USB. מלבד האמור לעיל, אנו דורשים גם את הרכיבים הבאים-
- EEPROM 24C02
- 2 יחידות נגדים 4.7k
שלא לדבר על מלבד הרכיבים הנ"ל, אנו זקוקים ללוח פיתוח מבוסס מיקרו-בקר N76E וכן לתכנת ה- Nu-Link. בנוסף, נדרשים גם חוטי קרש וחיבור לחיבור כל הרכיבים.
ממשק AT24LC64 עם Nuvoton N76E003 - דיאגרמת מעגלים
כפי שניתן לראות בתרשים למטה, ה- EEPROM מחובר בקו I2C יחד עם שני נגדים נמשכים. בצד שמאל קיצוני מוצג חיבור ממשק התכנות.
השתמשתי בקרש לחץ עבור ה- AT24LC64 IC וחיברתי את ה- IC ללוח המתכנת של nuvoton באמצעות חוטי מגשר. הגדרת החומרה שלי יחד עם מתכנת ה- nu-ink מוצגת למטה.
סיכות I2C על Nuvoton N76E003
את תרשים הסיכות של N76E003 ניתן לראות בתמונה למטה-
כפי שאנו רואים, לכל סיכה יש מפרט שונה וכל סיכה יכולה לשמש למספר מטרות. עם זאת, סיכה 1.4 משמשת כסיכת SDA I2C, היא תאבד את ה- PWM ופונקציונליות אחרת. אבל זו לא בעיה שכן אין צורך בפונקציונליות אחרת לפרויקט זה. אותו דבר יקרה עבור P1.3 הוא סיכת SCL של I2C.
מכיוון שסיכות I2C פועלות כ- GPIO, יש להגדיר אותו. ניתן להגדיר את כל הפינים של GPIO במצב המתואר להלן.
בהתאם לגליון הנתונים, PxM1.n ו- PxM2. n הם שני רושמים המשמשים לקביעת פעולת הבקרה של יציאת ה- I / O. בגליון הנתונים מצוין כי כדי להשתמש בפונקציונליות I2C, יש להשתמש במצבי הקלט / פלט כ- Open-drain עבור תקשורת הקשורה ל- I2C.
תקשורת I2C ב- N76E003
ציוד היקפי I2C הוא דבר חשוב לכל יחידת מיקרו-בקר שתומכת בתכונות I2C. סוגים רבים של מיקרו-בקרים שונים מגיעים עם ציוד היקפי I2C מובנה. עם זאת, במקרים מסוימים ניתן להגדיר את I2C באופן ידני באמצעות בקרת תוכנה כאשר תמיכה בחומרה הקשורה ל- I2C אינה זמינה (למשל, רבים 8051 מיקרו-בקרים). עם זאת, ה- nuvoton N76E003 מגיע עם תמיכה היקפית I2C.
M76E003 תומך בארבעה סוגים של פעולות במצבי I2C - משדר ראשי, מקלט ראשי, משדר עבדים ומקלט עבדים. הוא תומך גם במהירויות סטנדרטיות (100kbps) ומהירות (עד 400kbps) עבור קו I2C. I2C עובד עם כמה כללים כלליים בקווי האות SCL ו- SDA.
מצב התחלה והפסקה:
זה דבר חשוב בתקשורת I2C. כאשר הנתונים מועברים לקו I2C, הם מתחילים בתנאי התחלה ומסתיימים בתנאי עצירה.
תנאי ההתחלה הוא המעבר הגבוה-נמוך ב- SDA כאשר קו SCL גבוה ותנאי העצירה הוא המעבר נמוך-גבוה ב- SDA כאשר קו SCL גבוה. שני התנאים הללו נוצרים על ידי המאסטר (ה- MCU או כל מה ששולט במכשירי העבדים האחרים). קו האוטובוס נותר תפוס במצב זה כאשר תנאי ההתחלה מתחיל ונשאר חופשי כאשר תנאי התחנה מתחיל.
מצב ההתחלה וההפסקה מוצג בצורה מצוינת בפרספקטיבה של האות בגליון הנתונים N76E003-
כתובת 7 סיביות עם פורמט נתונים:
N76E003 תומך בכתובת ובפורמט נתונים של 7 סיביות. לאחר תחילת תנאי ההתחלה, מכשיר הראשי צריך לשלוח את הנתונים לקו I2C. הנתונים הראשונים הם נתונים חשובים. אם נתונים אלה לא נוצרו או מועברים כהלכה, המכשיר המחובר לא יזוהה ולא ניתן לבצע תקשורת נוספת.
הנתונים מורכבים מכתובת עבדים ארוכה של 7 סיביות, המסומנת כ- SLA. כתובת זו בת 7 סיביות צריכה להיות ייחודית לכל מכשיר אם מספר מכשירים מחוברים באוטובוס. לאחר הכתובת של 7 סיביות, הסיבית השמינית היא סיבית כיוון הנתונים. כלומר, תלוי בביט השמיני, המאסטר שולח את המידע למכשיר העבדים האם הנתונים ייכתבו בהתקן העבדים או שהנתונים יוקראו ממכשיר העבדים. הסיבית השמינית היא סיבית ה- R / W המכונה הודעת קריאה או כתיבה. כפי שכולנו יודעים מידע על 8 סיביות יכול להיות 128 סוגים, וכך לתמוך ב 128 מכשירים, אך I2C תומך ב 127 סוגים של מכשירים באותו אוטובוס אך לא 128. מכיוון שכתובת 0x00 היא כתובת שמורה הנקראת כתובת שיחה כללית. אם המאסטר רוצה לשלוח מידע לכל המכשירים,זה יתייחס ל 0x00 וכל מכשיר יופעל מחדש באותו אופן כמו בתצורות התוכנה האישיות.
לפיכך, העברת הנתונים נראית למטה -
לְהוֹדוֹת:
בתמונת כתובת הנתונים שלעיל, הסיבית ה -9 ואחריה ביט ה- R / W נקראת סיבוך ההכרה. זה חשוב מכיוון שבשימוש בסיבית זו, המאסטר או העבד מגיב למשדר הנתונים על ידי משיכת קו SDA נמוך. כדי לקבל את ביט ההכרה, המשדר צריך לשחרר את קו ה- SDA.
תכנות N76E003 לתקשורת I2C
התוכנית המלאה בה נעשה שימוש במדריך זה נמצאת בתחתית עמוד זה. ההסבר על קטעים חשובים בקוד הוא כדלקמן -
הגדר סיכות כניקוז פתוח והגדר אותן עבור I2C:
נתחיל תחילה בסעיף הסיכות I2C. כפי שתואר לעיל, יש להגדיר את יציאות SC2 ו- SDA I2C ולהגדיר אותן כקונפיגורציה פתוחה. לשם כך, אנו משתמשים בקובץ כותרת I2C.h יחד עם קובץ מקור I2C.c . קטע הקוד נראה כך-
בצע {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} בעוד (0)
הקוד שלעיל מגדיר את ה- P13 וה- P14 כסיכה פתוחה-ניקוז ו- clr_I2CPX משמש לבחירת ה- P13 ו- P14 כסיכת SCL על P1.3 ו- SDA על P1.4.
I2CPX זה הוא הסיבית ה -0 של רישום הבקרה I2C I2CON. אם I2C_PX מוגדר כ- 1, הסיכות מוחלפות ל- P0.2 כ- SCL ו- P1.6 כ- SDA. עם זאת, נשתמש ב- P13 ו- P14. כאן לא משתמשים בסיכות חלופיות.
I2C בקרת רישום I2CON:
רישום בקרת I2C I2CON משמש לבקרת פעולות ה- I2C. הביט הראשון הוא ביט הבחירה של פינים I2C. הגדרת אותו 0 מגדירה את סיכת ה- I2C כ- P13 ו- P14.
סיבית AA היא דגל ההודעה הכרה, אם דגל ה- AA מוגדר, ACK יוחזר במהלך פעימות שעון ההכרה של קו SCL. אם הוא מנוקה, NACK (רמה גבוהה ב- SDA) יוחזר במהלך פעימות השעון המאושרת של קו SCL.
הביט הבא הוא SI שהוא הפרעת המצב של I2C. אם מופעלת הפרעת מצב I2C, המשתמש צריך לבדוק את הרישום I2STAT כדי לקבוע איזה צעד עבר ועליו לנקוט בפעולה.
ה- STO הוא דגל ה- STOP המוגדר במצב מאסטר. STO מנוקה באופן אוטומטי על ידי חומרה לאחר שאותר מצב STOP .
הביט הבא הוא ביט ה- STA. אם דגל זה מוגדר, אז I2C מייצר מצב START אם האוטובוס חופשי. אם האוטובוס תפוס, ה- I2C ממתין למצב STOP ויוצר מצב START בעקבותיו. אם STA מוגדר בזמן שה- I2C כבר נמצא במצב מאסטר ובית אחד או יותר הועברו או התקבלו, ה- I2C יוצר מצב START חוזר. התוכנה צריכה לנקות את ה- STA באופן ידני.
האחרון, I2CEN הוא האפשרות I2C להפעיל או להשבית.
EEPROM 24C02:
עכשיו, מגיעים ל- 24C02. חבילת התמיכה בלוח של N76E003 כוללת קוד I2C עבור 24LC64 וניתנת לשינוי בקלות. עם זאת, נשתמש בשיטה פשוטה להבנת פונקציית I2C.
אם מישהו רוצה להשתמש בממשק מפורט עם EEPROM 24C02, ניתן להשתמש בתוכנית EEPROM ב- BSP.
אנו נחבר את ה- 24C02 רק ב- I2C, שם ה- N76E003 יהיה מאסטר ו- EEPROM יהיה עבד. לפיכך, נכתוב את כל הנתונים לכתובת EEPROM ונקרא אותם.
24C02 פינאוט EEPROM מוצג להלן-
A0, A1 ו- A2 הם שלושה סיכות לבחירת כתובות. סיכות ה- WP הן סיכות הגנה מפני כתיבה ויש לחבר אותן ל- VSS כדי לאפשר כתיבה ב- EEPROM.
הפונקציונליות של כתיבת בתים מוצגת בתמונה למטה -
מחזור הכתיבה המלא קורה עם קצת התחלה. לאחר מכן, יש להגיש את בית הבקרה. בתא הבקרה נדרשים הדברים הבאים-
לאחר סיבית ההתחלה, מורכב מכתובת העבדים. 1010 הוא הסטטי ו- A0, A1 ו- A2 הם הכתובת המבוססת על חיבור חומרה. אם שלושת הפינים מחוברים לאספקת GND או VSS, הם נקראים כ- 0. אחרת, אם הם מחוברים ל- VCC, הם נקראים כ- 1. במקרה שלנו, כל A0, A1 ו- A2 מחוברים ל- VSS. לפיכך כל אלה יהיו 0.
הוצאות על מצב הקריאה או הכתיבה. ערך הכתובת עם סיבית הקריאה או הכתיבה יהיה - 0xA0 לכתיבה ו- 0xA1 לקריאה. הבא הוא ביט ההכרה ולאחריו תועבר כתובת של 8 סיביות במקום בו צריך לאחסן את הנתונים ולבסוף את הנתונים שיישמרו במיקום המתאים. דברים אלה נעשים בתבנית שלב אחר שלב בפונקציה הראשית.
פונקציה עיקרית ולולאה:
בטל ראשי (בטל) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // חשוב, השתמש בפונקציית הדפסה חייבת להגדיר TI = 1; I2C_init (); בעוד (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n הערך הנקרא הוא% x", c & 0xff); }; }
הפונקציה העיקרית היא פשוטה, היא כותבת ברציפות ערכים ל- EEPROM בכתובת 1 וקריאת הנתונים. הנתונים מודפסים באמצעות פונקציית printf. Printf מדפיס את הערך ב- hex.
פונקציית הכתיבה EEPROM מורכבת מהדברים הבאים שתוארו בסעיף EEPROM-
בטל EEPROM_write (כתובת char לא חתומה, ערך char לא חתום) {I2C_start (); I2C_write (0xA0); I2C_write (כתובת); I2C_write (ערך); I2C_stop (); }
פונקציית ההתחלה של I2C מורכבת מהדברים הבאים-
בטל I2C_start (בטל) {זמן int חתום = פסק זמן; set_STA; clr_SI; ואילו ((SI == 0) && (זמן> 0)) {זמן--; }; }
בפונקציה זו, בודקים את סטטוס ה- SI יחד עם פרק הזמן הקבוע מראש (מוגדר ב- I2C.h כאשר הזמן המוגדר מראש מוגדר כ 1000). פונקציית ההתחלה מתחילה בהגדרת ה- STA ובניקוי ה- SI.
בטל I2C_stop (בטל) {זמן int חתום = פסק זמן; clr_SI; set_STO; בעוד ((STO == 1) && (זמן> 0)) {זמן--; }; }
זהה לפונקציה התחל, עצור. להפסיק פונקציה היא ביוזמת הקמת STO ואחריו ניקוי SI. מתחת לפונקציה נמצאת פונקציית הקריאה I2C-
char I2C_read (לא חתום char ack_mode) {חתום int זמן = פסק זמן; ערך תו לא חתום = 0x00; set_AA; clr_SI; ואילו ((SI == 0) && (t> 0)) {זמן--; }; ערך = I2DAT; אם (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; ואילו ((SI == 0) && (t> 0)) {זמן--; }; } ערך החזרה; }
Ack_mode ו I2C_NACK , שניהם מוגדרים בקובץ הכותרת I2C כמו 0 ו 1 בהתאמה.
באופן דומה, נוצרת פונקציית הכתיבה-
בטל I2C_write (ערך char לא חתום) {זמן חתום int = פסק זמן; I2DAT = ערך; clr_STA; clr_SI; ואילו ((SI == 0) && (זמן> 0)) {זמן--; }; }
מהבהב את הקוד והפלט
הקוד החזיר 0 אזהרה ו -0 שגיאות והבהב בשיטת ההברקה המוגדרת כברירת מחדל על ידי הקיל. אם אתה חדש, עיין בהדרכה עם תחילת העבודה עם nuvoton כדי להבין כיצד להעלות קוד. המידע המקיף של הקוד ניתן למצוא למטה.
בנה יעד 'I2C_EEPROM' הידור I2C_EEPROM.c… מחבר I2C.c… מקשר… גודל תוכנית: נתונים = 59.2 xdata = 0 קוד = 2409 יוצר קובץ hex מתוך ". \ Output \ I2C_EEPROM"… ". \ פלט \ I2C_EEPROM "- 0 שגיאות, 0 אזהרות. זמן בנייה חלף: 00:00:04 סיכום בניית אצווה: 1 הצליח, 0 נכשל, 0 דילג - זמן שחלף: 00:00:04
החומרה מוצבת על גבי לוח לחם ועובדת כצפוי. כפי שניתן לראות בתמונה למטה, הצלחנו לכתוב ערך ב- EEPROM ולקרוא אותו מהזיכרון ולהציג אותו על הצג הסדרתי.
בדוק את הסרטון המופיע להלן לקבלת הדגמה מלאה כיצד הלוח עובד עבור קוד זה. מקווה שנהנית מההדרכה ולמדת משהו שימושי אם יש לך שאלות, השאיר אותן בסעיף ההערות למטה. אתה יכול גם להשתמש בפורומים שלנו כדי לפרסם שאלות טכניות אחרות.