ממשק היקפי טורי
| מפתח | מוטורולה |
|---|---|
| פיתוח | תחילת שנות ה־80 |
| נתונים | |
| רוחב | 1 ביט (דו־כיווני) |
| מספר התקנים מרבי |
בתצורת multidrop – לפי מספר יציאות slave select (SS) של השולט בתצורת daisy chain – ללא הגבלה |
| פרוטוקול | טורי דו־כיווני מלא |
| מיפוי פינים | |
| MOSI | שולט שולח, נשלט קולט |
| MISO | שולט קולט, נשלט שולח |
| SCLK | שעון טורי |
| SS | בחירת נשלט (אחד או יותר) |
ממשק היקפי טורי (באנגלית: Serial Peripheral Interface; בראשי תיבות: SPI) הוא תקן בפועל (עם וריאציות רבות) לתקשורת טורית סינכרונית, המשמש בעיקר במערכות משובצות לתקשורת קווית למרחקים קצרים בין מעגלים משולבים.
SPI פועל בארכיטקטורת שולט–נשלט (Master–Slave),[1] שבה התקן אחד (הנקרא לעיתים master, leader, controller או main) מנהל את התקשורת עם התקן אחד או יותר (הנקראים לעיתים slave, follower, target או sub) באמצעות שליטה באות השעון ובאות בחירת השבב. מאחר שאין תקן רשמי אחד, יצרנים מסוימים מציגים התקנים המסוגלים לשנות את תפקידם בזמן פעולה.
המפרט המקורי של מוטורולה (מתחילת שנות ה־80) משתמש בארבעה אותות לוגיים, המכונים גם קווים או חוטים, כדי לאפשר תקשורת דו־כיוונית מלאה (Full Duplex). לעיתים מכנים זאת אפיק טורי בעל ארבעה חוטים, כדי להבדיל מגרסאות בעלות שלושה חוטים שהן חצי־דו־כיווניות (Half Duplex), וכן להבדיל מאפיקים טוריים בעלי שני חוטים כגון I²C (אנ') ו-1-Wire (אנ').
יישומים טיפוסיים כוללים חיבור בין מיקרו־בקרים לשבבי היקפיים כגון כרטיסי Secure Digital (SD), צגי גביש נוזלי (LCD), ממירים אנלוגי-לדיגיטלי ודיגיטלי-לאנלוגי, זיכרונות הבזק ו-EEPROM, וכן שבבי תקשורת שונים.
אף על פי ש-SPI הוא ממשק טורי סינכרוני,[2] הוא שונה מ־Synchronous Serial Interface (SSI) – "ממשק טורי סינכרוני". SSI משתמש באיתות דיפרנציאלי ומספק ערוץ תקשורת חד־כיווני יחיד (simplex).
פעולה

בדרך כלל ל-SPI יש ארבעה אותות לוגיים. וריאציות שונות עשויות להשתמש בשמות שונים או באותות שונים.
| קיצור | שם | תיאור |
|---|---|---|
SS |
Slave Select (בחר נשלט) |
אות בחירת שבב (פעיל נמוך) על מנת לאפשר תקשורת עם התקן נשלט מסוים. |
SCLK |
Serial Clock (שעון טורי) |
אות שעון מהשולט |
MOSI |
Master Out Slave In (שולט שולח, נשלט קולט) |
נתונים טוריים שהשולט משדר |
MISO |
Master In Slave Out (שולט קולט, נשלט שולח) |
נתונים טוריים שהנשלט משדר |
הקו MOSI בשולט מחובר ל-MOSI של הנשלט. הקו MISO בנשלט מחובר ל-MISO של השולט.
כל התקן משתמש באופן פנימי באוגר הזזה לתקשורת הטורית, ויחד הם יוצרים מעין חוצץ מעגלי בין שבבי (inter-chip circular buffer).
כדי לתמוך באפיק רב־נקודתי (multidrop), התקנים נשלטים צריכים להשתמש ביציאות תלת מצביות (Tri-State), כך שהאות MISO שלהם יהיה בעל עכבה גבוהה (כלומר מנותק חשמלית) כאשר ההתקן אינו נבחר. התקנים נשלטים ללא יציאות תלת מצביות אינם יכולים לשתף קו MISO עם התקנים אחרים ללא שימוש בחוצץ תלת מצביות חיצוני.
העברת נתונים


כדי להתחיל תקשורת, שולט ה-SPI בוחר תחילה את ההתקן שאיתו הוא רוצה לתקשר על ידי הורדת אות SS לרמה נמוכה (הקו מעל SS מציין שזהו אות פעיל-נמוך, כלומר מתח נמוך פירושו "נבחר", ומתח גבוה פירושו "לא נבחר").
אם נדרש זמן המתנה — למשל לצורך ביצוע המרה של אות אנלוגי-לדיגיטלי — השולט חייב להמתין לפחות פרק זמן זה לפני שהוא מתחיל לשלוח מחזורי שעון.
במהלך כל מחזור שעון של SPI מתבצעת העברת ביט אחת בתקשורת דו־כיוונית מלאה. השולט שולח ביט בקו MOSI בזמן שהנשלט שולח ביט בקו MISO, ולאחר מכן כל צד קורא את הביט שנכנס אליו. רצף זה נשמר גם כאשר נדרשת העברת נתונים בכיוון אחד בלבד.
העברת נתונים עם התקן נשלט יחיד כוללת אוגר הזזה אחד בשולט ואחד בנשלט, כל אחד בגודל מילה מסוים (למשל 8 ביטים). ההעברות מורכבות לעיתים קרובות ממילים של שמונה ביטים, אך גודלי מילים אחרים נפוצים גם כן, לדוגמה מילים של 16 ביט עבור בקרי מסך מגע או קודקי שמע (Audio codec) כגון TSC2101 של Texas Instruments, או מילים של 12 ביט עבור ממירים רבים מאנלוגי לדיגיטלי (ADC) או מדיגיטלי לאנלוגי (DAC).
בדרך כלל הנתונים מוזזים החוצה כאשר הביט המשמעותי ביותר (MSB) נשלח ראשון, אך במפרט המקורי קיימת אפשרות בשם LSBFE (LSB-First Enable) המאפשרת לקבוע האם הנתונים יועברו כשהביט הפחות משמעותי (LSB) או המשמעותי ביותר (MSB) נשלח ראשון.
בעליית השעון (clock edge) גם השולט וגם הנשלט מזיזים ביט אחד אל הצד השני. בעליית השעון הבאה כל מקלט דוגם את הביט שהתקבל ושומר אותו באוגר ההזזה כביט הפחות משמעותי החדש. לאחר שכל הביטים הוזזו החוצה ופנימה, השולט והנשלט החליפו את ערכי האוגרים שלהם. אם יש צורך להעביר נתונים נוספים, אוגרי ההזזה נטענים מחדש והתהליך חוזר על עצמו. ההעברה יכולה להימשך עבור כל מספר של מחזורי שעון. כאשר ההעברה מסתיימת, השולט מפסיק להפעיל את אות השעון ובדרך כלל גם מבטל את בחירת הנשלט.
אם משתמשים בהתקן נשלט יחיד, ניתן לחבר את פין SS שלו באופן קבוע לרמה לוגית נמוכה אם ההתקן מאפשר זאת. כאשר קיימים מספר התקנים נשלטים, תצורת multidrop (אנ') דורשת אות SS נפרד מהשולט לכל התקן נשלט, בעוד שתצורת daisy chain (אנ') דורשת אות SS אחד בלבד.
כל התקן נשלט באפיק שלא נבחר צריך להתעלם מאות השעון הנכנס ומהאות MOSI. בנוסף, כדי למנוע התנגשויות בקו MISO, התקנים נשלטים שאינם נבחרים חייבים להשתמש ביציאה תלת מצבית (Tri-State). התקנים שאינם בעלי יציאה כזו כברירת מחדל יצטרכו חוצצים תלת מצביים חיצוניים כדי להבטיח זאת.
קוטביות ופאזה של השעון
בנוסף להגדרת תדר השעון, על השולט להגדיר גם את קוטביות השעון ואת פאזת השעון ביחס לנתונים. חברת מוטורולה[3][4] כינתה שתי אפשרויות אלו בשמות (clock polarity – קוטביות שעון) ו-CPHA (clock phase – פאזת שעון), מוסכמה שאומצה גם על ידי רוב היצרנים האחרים.

דיאגרמת התזמון של SPI המוצגת מתוארת בהמשך:
- CPOL מייצג את הקוטביות של השעון. ניתן להמיר קוטביות באמצעות מְהַפֵּךְ (inverter) (אנ') פשוט.
- SCLKCPOL=0 משמעו שהמערכת מפרשת רמה לוגית נמוכה של SCLK כרמת הבסיס של השעון.
- SCLKCPOL=1 משמעו שהמערכת מפרשת רמה לוגית גבוהה של SCLK כרמת הבסיס של השעון.
- CPHA מייצג את המופע (פאזה) של מחזור השידור של כל סיבית נתונים יחסית ל־SCLK.
- עבור CPHA=0:
- סיבית הנתונים הראשונה משודרת מיד כאשר SS מופעל.
- הסיביות הבאות משודרות כאשר SCLK עובר לרמת הבסיס.
- דגימה מתרחשת כאשר SCLK עובר מרמת הבסיס.
- עבור CPHA=1:
- סיבית הנתונים הראשונה משודרת בעליית השעון הראשונה של SCLK לאחר הפעלת SS.
- הסיביות הבאות משודרות כאשר SCLK עובר מרמת הבסיס.
- דגימה מתרחשת כאשר SCLK עובר לרמת הבסיס.
- המרה בין שני מופעי השעון הללו אינה טריוויאלית.
- אותות MOSI ו-MISO בדרך כלל יציבים (בנקודות הקליטה שלהם) לאורך חצי מחזור, עד לתחילת מחזור השידור של הסיבית הבאה. לכן, התקני SPI של השולט והנשלט עשויים לדגום את הנתונים בנקודות שונות בתוך אותו חצי מחזור, לצורך גמישות, אף אם הדבר שונה מהמפרט המקורי.
- עבור CPHA=0:
מספרי מצב
השילובים של הקוטביות והפאזה מיוצגים על ידי מספרי "מצב SPI" אלו, כאשר CPOL הוא הביט הגבוה ו‑CPHA הוא הביט הנמוך:
| מצב SPI | קוטביות השעון (CPOL) |
פאזת השעון (CPHA) |
הנתונים משודרים כאשר | הנתונים נדגמים כאשר |
|---|---|---|---|---|
| 0 | 0 | 0 | SCLK יורד, וכאשר SS מופעל | SCLK עולה |
| 1 | 0 | 1 | SCLK עולה | SCLK יורד |
| 2 | 1 | 0 | SCLK עולה, וכאשר SS מופעל | SCLK יורד |
| 3 | 1 | 1 | SCLK יורד | SCLK עולה |
הערות:
- סימון נפוץ נוסף מייצג את המצב כצמד (CPOL, CPHA); לדוגמה, הערך '(0, 1)' יצביע על CPOL=0 ו-CPHA=1.
- בפעולה דו־כיוונית מלאה, המכשיר הראשי יכול לשדר ולקלוט במצבים שונים. לדוגמה, הוא יכול לשדר במצב 0 ולקלוט במצב 1 בו זמנית.
- ספקים שונים עשויים להשתמש בשמות שונים, כמו CKE עבור עליית השעון או NCPHA להופכי של CPHA.
תקשורת תקינה
יש התקנים נשלטים שמתוכננים להתעלם מכל תקשורת SPI שבה מספר פעימות השעון גדול מהמוגדר. אחרים אינם מתייחסים לכך, ומתעלמים מקלט נוסף תוך שהם ממשיכים להזיז החוצה את אותו ביט פלט. מקובל שהתקנים שונים משתמשים בתקשורת SPI באורכים שונים; לדוגמה, כאשר משתמשים ב־SPI כדי לגשת לשרשרת הסריקה (scan chain) של מעגל משולב, על ידי שליחת מילת פקודה בגודל מסוים (למשל 32 ביט) ולאחר מכן קבלת תגובה בגודל אחר (למשל 153 ביט, אחד עבור כל פין בשרשרת הסריקה).
פסיקות
פסיקות נמצאות מחוץ לתחום ההגדרה של SPI; השימוש בהן אינו אסור אך גם אינו מוגדר במפרט, ולכן ניתן לממש אותן באופן אופציונלי.
משולט לנשלט
מיקרו־בקרים המוגדרים כהתקנים נשלטים עשויים לכלול תמיכה חומרתית ביצירת אותות פסיקה לעצמם כאשר מתקבלות מילות נתונים או כאשר מתרחשת גלישה בחוצץ FIFO של הקליטה.[5] בנוסף, ניתן להגדיר שגרת פסיקה כאשר קו הקלט של בחירת ההתקן הנשלט שלהם משתנה לרמה נמוכה או גבוהה.
מנשלט לשולט
התקנים SPI נשלטים משתמשים לעיתים באות מחוץ לאפיק הראשי (out-of-band), כלומר חוט נוסף, כדי לשלוח אות פסיקה לשולט. דוגמאות לכך כוללות פסיקות מסוג "pen-down" מחיישני מסך מגע, התראות על מגבלת טמפרטורה מחיישני טמפרטורה, אזעקות משבבי שעון זמן אמת (RTC), אותות SDIO, וכן זיהוי הכנסת תקע שמע בקודק שמע.
פסיקות אל השולט יכולות גם להיות מדומות באמצעות Polling (בדיקה מחזורית), בדומה לשיטה הנהוגה ב-USB 1.1 ו-2.0.
עיצוב תוכנה
SPI מתאים לתכנון תוכנה מסוג "מנהל התקן אפיק". תוכנה עבור התקנים מחוברים נכתבת כך שתקרא "מנהל התקן אפיק" שמטפל בחומרת ה-SPI ברמה נמוכה בפועל. זה מאפשר לקוד הדרייבר עבור התקנים מחוברים להעביר בקלות לחומרה אחרת או למימוש תוכנה בעל רמת סיביות גבוהה.
טופולוגיות אפיק
אף על פי שבחלק הקודם על אופן הפעולה הוצג ממשק בסיסי עם התקן נשלט יחיד, SPI יכול לתקשר גם עם מספר התקנים נשלטים באמצעות תצורות multidrop, daisy chain, או expander.
תצורת Multidrop
בתצורת אפיק multidrop, לכל התקן נשלט יש אות SS משלו, והשולט בוחר בכל פעם רק התקן אחד. הקווים MISO, SCLK ו-MOSI משותפים לכל ההתקנים. זוהי הדרך הנפוצה ביותר לשימוש ב-SPI.
מאחר שקווי MISO של כל הנשלטים מחוברים יחד, הם חייבים להיות בעלי יציאות תלת מצביות (גבוה, נמוך או עכבה גבוהה). כאשר ההתקן אינו נבחר, עליו להעביר את היציאה למצב עכבה גבוהה. התקנים נשלטים שאינם תומכים ביציאת תלת מצביות יכולים לפעול בתצורת multidrop באמצעות הוספת שבב חוצץ תלת מצבי (Tri-State buffer) הנשלט על ידי אות SS שלהם. מאחר שיש צורך להכניס למצב Tri-State רק קו אות אחד לכל נשלט, ניתן להשתמש בשבב לוגי סטנדרטי המכיל ארבעה חוצצים תלת מצביים עם כניסות הפעלה נפרדות, וכך לחבר עד ארבעה התקנים נשלטים לאפיק SPI.
- הערת זהירות: כל אותות SS צריכים להתחיל במצב גבוה (כלומר אף נשלט אינו נבחר) לפני שליחת הודעות אתחול לכל התקן נשלט. כך התקנים אחרים שעדיין לא אותחלו יתעלמו מהודעות שאינן מיועדות להם. מצב זה עלול להתרחש כאשר השולט משתמש בפיני GPIO (פיני קלט־פלט לשימוש כללי) עבור אותות SS (פינים שעלולים להתחיל במצב לא מוגדר), וכאשר משתמשים בספריות תוכנה שונות כדי לאתחל כל התקן. פתרון אחד הוא להגדיר את כל פיני ה-GPIO המשמשים ל-SS כפלט ברמה גבוהה עבור כל הנשלטים לפני הרצת קוד האתחול של הספריות. פתרון נוסף הוא להוסיף נגד pull-up (אנ') לכל אות SS כדי להבטיח שכל האותות יתחילו במצב גבוה.
תצורת daisy chain
מוצרים מסוימים המשתמשים ב-SPI יכולים להיות מחוברים בתצורת daisy chain, שבה הפלט של הנשלט הראשון מחובר לכניסה של הנשלט השני, וכך הלאה עבור שאר ההתקנים, עד לנשלט האחרון שפלטו מחובר חזרה לכניסת השולט.
תצורה זו מאחדת את אוגרי ההזזה של כל הנשלטים ליצירת אוגר הזזה משולב גדול אחד שמעביר את הנתונים לאורך השרשרת. בתצורה זו נדרש אות ה אחד בלבד מהשולט, במקום אות SS נפרד לכל נשלט.
בנוסף לשימוש בהתקנים נשלטים ייעודיים ל-SPI, ניתן לשלב בשרשרת גם אוגרי הזזה בדידים כדי להוסיף פינים נוספים לקלט (למשל באמצעות רכיב PISO מסוג 74xx165) או לפלט (למשל באמצעות SIPO מסוג 74xx595) בשרשרת כמעט בלתי מוגבלת. יישומים נוספים היכולים לפעול עם SPI בתצורת daisy chain כוללים את SGPIO, JTAG ו-I²C.
תצורות expander
בתצורות expander, משתמשים ביחידות כתובת הנשלטות על ידי SPI (למשל מפענחים בינאריים, מפלגים (demultiplexers), או אוגרי הזזה) כדי להוסיף אותות בחירת שבב (chip select) נוספים.
לדוגמה, ניתן להשתמש באות SS אחד כדי לשלוח למפלג הנשלט על ידי SPI מספר אינדקס הקובע את אותות הבחירה שלו, בעוד שאות SS אחר מועבר דרך אותו מפלג בהתאם לאינדקס שנשלח כדי לבחור את ההתקן הנשלט הרצוי.
יתרונות וחסרונות
יתרונות
|
חסרונות
|
יישומים
SPI משמש לתקשורת עם מגוון רחב של התקנים היקפיים, כגון:
- חיישנים: טמפרטורה, לחץ, ADC, מסכי מגע, בקרי משחקי וידאו
- התקני בקרה: קודקי שמע, פוטנציומטרים דיגיטליים, DAC
- עדשות מצלמה: תושבת עדשות Canon EF
- זיכרון: הבזק ו־EEPROM
- שעוני זמן אמת (RTC)
- צגי LCD, לפעמים אפילו לניהול נתוני תמונה
- כל כרטיס MMC או SD (כולל גרסת SDIO)
- אוגרי הזזה להרחבת קווי קלט/פלט[6][7]
החיסכון במקום על גבי הלוח ובחיווט בהשוואה לאפיק מקבילי הוא משמעותי, ולכן SPI הפך לרכיב מרכזי במערכות משובצות. הדבר נכון עבור רוב מעבדי מערכת על שבב (SoC), הן עבור מעבדי 32-ביט מתקדמים יותר כגון ARM, MIPS ו־PowerPC, והן עבור מיקרו־בקרים פשוטים יותר כגון AVR, PIC ו־MSP430. שבבים אלה כוללים בדרך כלל בקרי SPI המסוגלים לפעול הן במצב שולט והן במצב נשלט. ניתן גם לתכנת מיקרו־בקרים ממשפחת AVR (כולל כאלה ריקים) באמצעות SPI.[8]
בתכנונים המבוססים על שבבים או על FPGA, משתמשים לעיתים ב־SPI לתקשורת בין רכיבים פנימיים. שטח הסיליקון בתוך השבב יכול להיות יקר בדיוק כמו השטח על גבי לוח המעגל. במערכות בעלות ביצועים גבוהים, רכיבי FPGA משתמשים לעיתים ב־SPI כדי לפעול כנשלט מול מערכת מארחת, כשולט מול חיישנים, או כדי לגשת לזיכרון הבזק המשמש לטעינת מערכת האתחול כאשר מדובר ב-FPGA המבוסס על SRAM.
היכולת של SPI לפעול בתקשורת דו־כיוונית מלאה (Full Duplex) הופכת אותו לפשוט ויעיל במיוחד עבור יישומים עם שולט אחד ונשלט אחד. התקנים מסוימים משתמשים במצב full duplex כדי לממש זרימת נתונים יעילה ומהירה עבור יישומים כמו שמע דיגיטלי, עיבוד אותות דיגיטלי או ערוצי תקשורת. עם זאת, רוב הרכיבים המסחריים משתמשים בפרוטוקול Half-Duplex מסוג בקשה-תגובה (Request/Response).
כלי פיתוח
מחשבי לוח יחיד
מחשבי לוח יחיד (Single-board computer) עשויים לספק גישה לפיני החומרה של SPI. לדוגמה, מחבר J8 של ראספברי פאי חושף לפחות שני ממשקי SPI שניתן להשתמש בהם באמצעות מנהלי התקנים של לינוקס (Linux) או באמצעות פייתון.
מתאמי USB ל-SPI
קיימים מספר מתאמי USB המאפשרים למחשב שולחני או לסמארטפון בעל חיבור USB לתקשר עם שבבי SPI (למשל מתאמים המבוססים על CH341A/B או FT221xs). מתאמים אלו משמשים לבדיקות, תכנות וניפוי שגיאות של מערכות משובצות, שבבים (כגון FPGA, ASIC ו־SoC) והתקנים היקפיים.
רבים מהם מספקים גם יכולות סקריפט או תכנות (למשל באמצעות Visual Basic, C/C++ או VHDL), וניתן להשתמש בהם יחד עם תוכנות קוד פתוח כגון flashrom, IMSProg, SNANDer או avrdude לצורך תכנות זיכרונות הבזק ו-EEPROM, וכן לתכנות מנהל אתחול (bootloader) או BIOS.
הפרמטרים המרכזיים של SPI הם:
- התדר המרבי הנתמך עבור הממשק הטורי
- זמן השיהוי בין פקודות (command-to-command latency)
- האורך המרבי של פקודות SPI
כיום ניתן למצוא מתאמי SPI בשוק התומכים בממשקים טוריים עד 100 מגה־הרץ, ומאפשרים העברת נתונים רציפה כמעט ללא הגבלה.
מאחר ש-SPI הוא תקן דה־פקטו, חלק ממתאמי ה־SPI למארח תומכים גם בפרוטוקולים נוספים מעבר ל־SPI הקלאסי בעל ארבעת הקווים, למשל תמיכה בפרוטוקול Quad-SPI או בפרוטוקולים טוריים מותאמים אישית המבוססים על SPI.
קישורים חיצוניים
הערות שוליים
- ↑ Stoicescu, Alin (2018). "Getting Started with SPI" (PDF). Microchip.
- ↑ "What is Serial Synchronous Interface (SSI)?".
- ↑ SPI Block Guide v3.06; Motorola/Freescale/NXP; 2003.
- ↑ "AN991/D: Using the Serial Peripheral Interface to Communicate Between Multiple Microcomputers" (PDF). NXP. 2004 [1994]. ארכיון (PDF) מ-2023-04-04.
- ↑ "TMS320x281x Serial Peripheral Interface Reference Guide". Texas Instruments. 2002. pp. 16–17.
- ↑ Gammon, Nick (2013-03-23). "Gammon Forum : Electronics : Microprocessors : Using a 74HC165 input shift register". Gammon Forum. ארכיון מ-2023-07-29.
- ↑ Gammon, Nick (2012-01-31). "Gammon Forum : Electronics : Microprocessors : Using a 74HC595 output shift register as a port-expander". Gammon Forum. ארכיון מ-2023-07-14.
- ↑ "AVR910 - In-system programming" (PDF). אורכב מ-המקור (PDF) ב-2011-03-02.
ממשק היקפי טורי43177793Q849492