- מה זה Bit Banging?
- מתי להשתמש במקצת Biting
- אלגוריתם לתקשורת סדרתית באמצעות פיצוץ ביטים
- קצת דופק על SPI
- דוגמה למפוצץ ביטים: תקשורת SPI בארדואינו
- חסרונות של דפיקות סיביות
- UART דרך קצת דופק בארדואינו
ממשקי תקשורת הם אחד הגורמים הנחשבים בעת בחירת מיקרו-בקר שישמש לפרויקט. המעצב מבטיח כי למיקרו-בקר שנבחר יהיו כל הממשקים הנדרשים לתקשורת עם כל שאר הרכיבים שישמשו למוצר. קיומם של חלק מהממשקים הללו כמו SPI ו- I2C במיקרו-בקר תמיד מעלה את עלותם של מיקרו-בקרים כאלה, ובהתאם לתקציב ה- BOM הוא עשוי להפוך את המיקרו-בקר הרצוי ללא סביר. במצבים כאלה הטכניקות כמו Bit Banging נכנסות לשחק.
מה זה Bit Banging?
דפיקות סיביות היא טכניקה לתקשורת סדרתית בה כל תהליך התקשורת מטופל באמצעות תוכנה במקום חומרה ייעודית. להעברת נתונים, הטכניקה כוללת שימוש בתוכנה לקידוד הנתונים לאותות ופעימות המשמשים לתמרון מצב של סיכת קלט / פלט של מיקרו-בקר המשמש כסיכת Tx לשליחת נתונים למכשיר היעד. כדי לקבל נתונים, הטכניקה כוללת דגימה של מצב סיכת ה- Rx לאחר מרווחים מסוימים אשר נקבעת על ידי קצב שידור התקשורת. התוכנה מגדירה את כל הפרמטרים הדרושים להשגת תקשורת זו, כולל סנכרון, תזמון, רמות וכו ', אשר בדרך כלל נקבעים על ידי חומרה ייעודית כאשר לא משתמשים במפוצצים.
מתי להשתמש במקצת Biting
Bit-Banging משמש בדרך כלל במצבים בהם מיקרו-בקר עם הממשק הנדרש אינו זמין או כאשר מעבר למיקרו-בקר עם הממשק הנדרש עשוי להיות יקר מדי. כך הוא מספק דרך זולה לאפשר לאותו מכשיר לתקשר באמצעות מספר פרוטוקולים. מיקרו-בקר אשר הופעל בעבר לתקשורת UART בלבד, יכול להיות מצויד בתקשורת באמצעות SPI ו- 12C באמצעות דפיקות סיביות.
אלגוריתם לתקשורת סדרתית באמצעות פיצוץ ביטים
בעוד שהקוד ליישום דפיקות סיביות עשוי להיות שונה בין מיקרו-בקרים מגוונים ועשוי להשתנות גם לפרוטוקולים סדרתיים שונים, אך ההליך / אלגוריתם ליישום דפיקות סיביות זהה בכל הפלטפורמות.
כדי לשלוח נתונים למשל נעשה שימוש בקוד הפסאוד שלמטה;
- הַתחָלָה
- שלח קצת התחלה
- המתן לתזמון שיתכתב עם קצב השידור של המקלט
- שלח ביט נתונים
- המתן למשך זמן שיתאים שוב לקצב השידור של המקלט
- בדוק אם כל סיביות הנתונים נשלחו. אם לא, עבור אל 4. אם כן, עבור 7
- שלח קצת עצירה
- תפסיק
קבלת נתונים נוטה להיות מורכבת מעט יותר, בדרך כלל משתמשים בהפרעה כדי לקבוע מתי קיימים נתונים על סיכת המקלט. זה עוזר להבטיח שהמיקרו-בקר לא מבזבז יותר מדי כוח עיבוד. אמנם יישומים מסוימים משתמשים באחד מסיכות ה- I / O של בקרי המיקרו, אך הסיכוי לרעש ולשגיאות, אם לא מטפלים בוודאי, הוא גבוה יותר. האלגוריתם לקבלת נתונים באמצעות הפרעות מוסבר להלן.
- הַתחָלָה
- אפשר הפסקה בסיכת Rx
- כאשר מופעלת הפרעה, השג קצת התחל
- המתן לתזמון בהתאם לקצב השידור
- קרא את סיכת ה- Rx
- חזור על הפעולה מ -4 עד לקבלת כל הנתונים
- המתן לתזמון בהתאם לקצב השידור
- בדוק אם יש עצירה
- תפסיק
קצת דופק על SPI
כאמור לעיל, דפיקות סיביות עבור פרוטוקולים שונים פועלות בצורה שונה ולכן חשוב לקרוא על כל פרוטוקול, להבין את מסגור הנתונים ואת השעון לפני שתנסה ליישם. אם ניקח את מצב SPI 1 כדוגמה, ערך הבסיס של השעון הוא תמיד 0 ונתונים נשלחים או מתקבלים תמיד בקצה השעון העולה. תרשים העיתוי לפרוטוקול התקשורת SPI Mode 1 מוצג להלן.
כדי ליישם זאת, ניתן להשתמש באלגוריתם הבא;
- הַתחָלָה
- הגדר את סיכת ה- SS נמוכה כדי להתחיל בתקשורת
- הגדר את הסיכה ל- Master Out Slave In (MOSI) לסיבית הראשונה של הנתונים שיישלחו
- הגדר את סיכת השעון (SCK) גבוהה כך שהנתונים מועברים על ידי המאסטר ומקבלים על ידי העבד
- קרא את מצב המאסטר ב- Slave Out (MISO) כדי לקבל את נתון הנתונים הראשון מהעבד
- הגדר SCK נמוך, כך שניתן יהיה לשלוח נתונים בקצה העולה הבא
- עבור ל -2 עד שכל סיביות הנתונים הועברו.
- הגדר את סיכת ה- SS גבוהה כדי להפסיק את השידור.
- תפסיק
דוגמה למפוצץ ביטים: תקשורת SPI בארדואינו
כדוגמה, בואו ניישם את האלגוריתם לתקשורת SPI באמצעות פיצוץ סיביות בארדואינו כדי להראות כיצד ניתן לדפוק נתונים על SPI באמצעות הקוד שלמטה.
אנו מתחילים בהכרזה על השימוש בסיכות הארדואינו.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; בתים sendData = 64; // הערך שיש לשלוח בתים slaveData = 0; // לאחסון הערך שנשלח על ידי העבד
לאחר מכן, אנו עוברים לפונקציית התקנת הריק () שם מצהירים על מצב הסיכות. רק סיכת ה- Master in Slave out (MISO) מוכרזת כקלט שכן היא הסיכה היחידה שמקבלת נתונים. כל שאר הסיכות מוצהרות כפלט. לאחר הכרזת מצבי הסיכה, סיכת ה- SS מוגדרת ל- HIGH. הסיבה לכך היא להבטיח כי התהליך נטול שגיאות והתקשורת מתחילה רק כשהוא מוגדר נמוך.
הגדרת חלל () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
לאחר מכן, אנו מתחילים את הלולאה לשליחת נתונים. שים לב שלולאה זו תמשיך לשלוח את הנתונים שוב ושוב.
אנו מתחילים את הלולאה על ידי כתיבת סיכת ה- SS נמוכה, כדי להתחיל את תחילת התקשורת, וקוראים לפונקציית bitbangdata המפרקת את הנתונים שהוגדרו מראש לביטים ושולחים. עם זאת, אנו כותבים את סיכת ה- SS HIGH כדי לציין את סוף העברת הנתונים.
לולאה בטלה () { digitalWrite (SSPin, LOW); // SS נמוך slaveData = bitBangData (sendData); // העברת נתונים digitalWrite (SSPin, HIGH); // שוב SS גבוהה }
Bitbangdata () הפונקציה כתוב למטה. הפונקציה מכניסה את הנתונים שיש לשלוח ומפרקת אותם לסיביות ושולחת אותם על ידי לולאה על הקוד להעברה כפי שצוין בשלב 7 של האלגוריתם.
בתים bitBangData (בתים _שלח) // פונקציה זו מעבירה את הנתונים באמצעות סיבוב ביטים { בתים _קבל = 0; עבור (int i = 0; i <8; i ++) // 8 סיביות בתים { digitalWrite (MOSIPin, bitRead (_send, i)); // הגדר MOSI digitalWrite (SCKPin, HIGH); // SCK גבוה bitWrite (_receive, i, digitalRead (MISOPin)); // לכידת MISO digitalWrite (SCKPin, LOW); // SCK נמוך } תשואה _קבל; // החזר את הנתונים שהתקבלו }
חסרונות של דפיקות סיביות
אימוץ דפיקות סיביות אמור להיות החלטה מחושבת מכיוון שיש כמה חסרונות לדפיקות סיביות שעשויות להפוך את זה לא אמין ליישום בפתרונות מסוימים. דפיקות סיביות מגדילות את הכוח הנצרך על ידי המיקרו-בקר בגלל כוח העיבוד הגבוה הנצרך על ידי התהליך. בהשוואה לחומרה ייעודית, שגיאות תקשורת רבות יותר כמו תקלות ועצבנות מתרחשות כאשר נעשה שימוש בחבטות סיביות במיוחד כאשר מתבצעת תקשורת נתונים על ידי המיקרו-בקר במקביל למשימות אחרות. תקשורת באמצעות דפיקות סיביות מתרחשת בשבריר מהמהירות בה היא מתרחשת כאשר משתמשים בחומרה ייעודית. זה עשוי להיות חשוב ביישומים מסוימים ועשוי להפוך דפיקות קצת לבחירה "לא כל כך טובה".
דפיקות סיביות משמשות לכל מיני תקשורת טורית כולל; RS-232, תקשורת טורית אסינכרונית, UART, SPI ו- I2C.
UART דרך קצת דופק בארדואינו
אחד היישומים הפופולאריים של פיצוץ סיביות הוא ספריית התוכנה Arduino Serial המאפשרת ל- Arduino לתקשר באמצעות UART ללא שימוש בסיכות UART ייעודיות לחומרה (D0 ו- D1). זה נותן גמישות רבה מכיוון שמשתמשים יכולים לחבר התקנים טוריים רבים ככל שמספר הפינים בלוח Arduino יכול לתמוך.