3.21. أساسيات SPI

SPI (Serial Peripheral Interface) هو ناقل تسلسلي متزامن مصمم للوصلات قصيرة المدى وعالية السرعة بين متحكم واحد وجهاز طرفي واحد أو أكثر على اللوحة نفسها. وهو الواجهة القياسية لبطاقات SD والشاشات وذاكرة الفلاش ومحولات ADC و DAC ومجموعة واسعة من المستشعرات.

في حين أن UART لم يكن له ساعة مشتركة وكان يستعيد التوقيت من خط البيانات نفسه، يُشغّل SPI سلكاً للساعة إلى جانب أسلاك البيانات. يدفع المتحكم الساعة بأي معدل يشاء، ويأخذ كل جهاز آخر على الناقل عيّنات من البيانات بالتزامن مع تلك الساعة. لا يوجد تخمين لمعدل الباود ولا أعباء تأطير -- مجرد حواف ساعة وبتات.

3.21.1. الأسلاك الأربعة

يضم ناقل SPI ثنائي الاتجاه الكامل أربعة أسلاك:

  • SCK (ساعة تسلسلية). يقودها المتحكم. تُنقل كل بتة دخولاً أو خروجاً على حافة من هذه الإشارة.

  • MOSI (خرج المتحكم، دخل الطرفية). خط خرج المتحكم؛ يأخذ الجهاز الطرفي البتات منه.

  • MISO (دخل المتحكم، خرج الطرفية). خط خرج الجهاز الطرفي؛ يأخذ المتحكم البتات منه.

  • CS (اختيار الشريحة)، يُسمى أحياناً SS (اختيار الطرفية). خط منفصل لكل جهاز طرفي. يسحب المتحكم CS إلى المستوى المنخفض لبدء معاملة وإلى المستوى المرتفع مجدداً لإنهائها؛ وأي جهاز طرفي يكون CS الخاص به غير مفعّل يتجاهل الناقل بالكامل ويتوقف عن قيادة خرج MISO الخاص به.

Four signal traces stacked: CS at top, SCK below it, then MOSI and MISO. CS starts high (idle), drops low to begin the transaction, then SCK clocks out eight pulses while MOSI and MISO carry one byte of data each, then CS returns high.

بايت SPI واحد: ينخفض CS لاختيار الجهاز الطرفي، ويُصدر SCK ثماني بتات، وينقل كل من MOSI و MISO بايتاً واحداً في اتجاهين متعاكسين.

تنقل كل حافة ساعة بتة واحدة في كل اتجاه في الوقت نفسه. تُرسل نبضة SCK واحدة بتة واحدة على MOSI وتستقبل في الوقت ذاته بتة واحدة على MISO -- فـ SPI ثنائي الاتجاه الكامل على مستوى السلك. ليس على البرمجيات أن تستخدم كلا الاتجاهين: فالمعاملات للكتابة فقط أو للقراءة فقط شائعة، مع تجاهل الخط غير المستخدَم أو إبقائه مرتفعاً.

3.21.2. قطبية الساعة وطورها

تحدد بتّتا تهيئة بالضبط أي حافة ساعة تنقل البيانات:

  • قطبية الساعة (polarity، تُسمى أحياناً CPOL) -- حالة الخمول لـ SCK. يعني 0 أن الساعة تخمل عند المستوى المنخفض وتنبض إلى المستوى المرتفع؛ ويعني 1 أن الساعة تخمل عند المستوى المرتفع وتنبض إلى المستوى المنخفض.

  • طور الساعة (phase، يُسمى أحياناً CPHA) -- أي حافة تأخذ عيّنة البيانات. يأخذ 0 العيّنة على الحافة الأولى من كل نبضة ساعة (الحافة الأمامية)؛ ويأخذ 1 العيّنة على الحافة الثانية (الحافة الخلفية).

تعطي هذه معاً أربعة أوضاع، تُسمى اصطلاحاً من الوضع 0 إلى الوضع 3. والوضع 0 (polarity=0, phase=0) هو الأكثر شيوعاً وخيار افتراضي آمن للأجهزة المجهولة.

القاعدة الحاسمة هي أنه يجب على الطرفين الاتفاق على الوضع. فالأوضاع غير المتطابقة تعطي بيانات غير صالحة حتى لو كانت خطوط الساعة والبيانات موصّلة بشكل صحيح؛ وإذا أعاد جهاز ما هراءً في المعاملة الأولى، فإن الوضع هو أول ما ينبغي التحقق منه.

3.21.3. أجهزة طرفية متعددة

يمكن لعدة أجهزة طرفية مشاركة خطوط SCK و MOSI و MISO نفسها ما دام لكل منها خط CS خاص به يقوده المتحكم:

  • ترى جميع الأجهزة الطرفية الساعة والبيانات نفسها، لكن كلاً منها يراقب CS الخاص به. وعندما يكون CS غير مفعّل (مرتفع)، يتجاهل الجهاز الطرفي SCK و MOSI بالكامل ويترك MISO في حالة ممانعة عالية حتى لا ينازع الأجهزة الأخرى على الخط.

  • يُفعّل المتحكم CS واحداً فقط في كل مرة، ويُشغّل المعاملة، ثم يُلغي تفعيل CS لتحرير الناقل.

يمكن لمتحكم دقيق يحتوي على كتلة SPI عتادية واحدة أن يتخاطب مع عدد من الأجهزة الطرفية بقدر ما لديه من دبابيس GPIO حرة يخصصها لخطوط CS -- فلا يوجد عَنْوَنة على الناقل نفسه.

3.21.4. نقاط القوة والضعف

تنبع كل من نقاط قوة SPI وضعفه من تصميمه:

  • سريع. يمكن تحقيق عشرات الميغاهرتز على المسارات القصيرة مع تحويل بسيط لمستوى الجهد. تستخدم قارئات بطاقات SD وشاشات SPI ذلك.

  • بسيط على مستوى السلك. لا عَنْوَنة، ولا إقرارات، ولا شروط بدء/توقف خاصة -- مجرد بتات على الأسلاك متزامنة مع ساعة.

  • نهِم للدبابيس. ثلاثة خطوط مشتركة بالإضافة إلى CS واحد لكل جهاز طرفي. لوحة بها خمسة أجهزة SPI تستخدم ثمانية دبابيس (ثلاثة + خمسة).

  • قصير المدى. يفترض SPI حواف نظيفة وسريعة، ما يعني مسارات قصيرة على اللوحة نفسها. وللوصلات الأطول، يكون I2C أو أحد النواقل المؤطّرة خياراً أنسب.