صفر تا صد رابط SPI در میکروکنترلرها

مقدمه

رابط سریال محیطی (Serial Peripheral Interface یا SPI) یک پروتکل ارتباطی سریال سنکرون است که به طور گسترده در سیستم‌های نهفته و میکروکنترلرها برای ارتباط کوتاه برد و با سرعت بالا بین یک دستگاه اصلی (Master) و یک یا چند دستگاه جانبی (Slave) استفاده می‌شود. این رابط که توسط شرکت موتورولا توسعه یافته، به دلیل سادگی و کارایی بالا، به یکی از محبوب‌ترین روش‌های ارتباطی در دنیای الکترونیک دیجیتال تبدیل شده است. در این مقاله، به بررسی جامع و کامل تمامی جنبه‌های رابط SPI، از مفاهیم پایه تا نکات پیشرفته، خواهیم پرداخت.

SPI چیست؟ مروری بر مفاهیم بنیادین

SPI یک رابط ارتباطی سریال است، به این معنی که داده‌ها بیت به بیت و پشت سر هم از طریق یک یا دو خط داده منتقل می‌شوند. این برخلاف ارتباط موازی است که چندین بیت داده به طور همزمان ارسال می‌گردند. سنکرون بودن SPI نیز به این معناست که یک سیگنال کلاک مشترک، زمان‌بندی ارسال و دریافت داده‌ها را بین دستگاه اصلی و جانبی هماهنگ می‌کند. این ویژگی باعث می‌شود تا SPI بتواند به سرعت‌های بالاتری نسبت به رابط‌های آسنکرون مانند UART دست یابد.

ارتباط در SPI بر پایه‌ی معماری Master/Slave شکل می‌گیرد. دستگاه Master (معمولاً میکروکنترلر) وظیفه‌ی تولید سیگنال کلاک و آغاز ارتباط را بر عهده دارد. دستگاه یا دستگاه‌های Slave (مانند سنسورها، حافظه‌ها، نمایشگرها و …) به دستورات Master پاسخ می‌دهند. SPI یک ارتباط تمام دوبلکس (FullDuplex) را فراهم می‌کند، بدین معنی که ارسال و دریافت داده‌ها می‌تواند به طور همزمان انجام شود.

پایه‌های استاندارد در رابط SPI

یک ارتباط استاندارد SPI معمولاً از چهار خط سیگنال اصلی استفاده می‌کند:

  1. MOSI (Master Out Slave In): این خط برای انتقال داده از دستگاه Master به دستگاه Slave استفاده می‌شود. داده‌ها از پایه MOSI در Master خارج و به پایه MOSI در Slave وارد می‌شوند. در برخی موارد، این پایه با نام‌های دیگری مانند SDI (Serial Data In) یا DI (Data In) بر روی دستگاه‌های Slave نیز شناخته می‌شود.
  2. MISO (Master In Slave Out): این خط برای انتقال داده از دستگاه Slave به دستگاه Master به کار می‌رود. داده‌ها از پایه MISO در Slave خارج و به پایه MISO در Master وارد می‌شوند. نام‌های دیگر این پایه شامل SDO (Serial Data Out) یا DO (Data Out) بر روی دستگاه‌های Slave است.
  3. SCK (Serial Clock) یا SCLK: این خط سیگنال کلاک را حمل می‌کند که توسط Master تولید می‌شود. هر پالس کلاک، انتقال یک بیت داده را همزمان می‌کند. فرکانس این کلاک، سرعت انتقال داده را تعیین می‌کند.
  4. SS (Slave Select) یا CS (Chip Select): این خط توسط Master برای انتخاب دستگاه Slave مورد نظر جهت برقراری ارتباط استفاده می‌شود. هر دستگاه Slave به یک خط SS جداگانه از Master متصل می‌شود (در حالت استاندارد). هنگامی که Master می‌خواهد با یک Slave خاص ارتباط برقرار کند، خط SS مربوط به آن Slave را فعال می‌کند (معمولاً با قرار دادن آن در سطح منطقی پایین یا LOW). تنها Slave انتخاب شده به سیگنال کلاک و داده‌های روی خطوط MOSI/MISO پاسخ می‌دهد.

در برخی پیکربندی‌ها، به ویژه زمانی که تنها یک Slave وجود دارد، ممکن است پایه SS به طور دائم فعال نگه داشته شود.

نحوه عملکرد و انتقال داده در SPI

فرآیند انتقال داده در SPI به صورت زیر انجام می‌شود:

  1. انتخاب Slave: دستگاه Master ابتدا خط SS مربوط به Slave مورد نظر را فعال می‌کند (معمولاً با LOW کردن آن). این کار به Slave اطلاع می‌دهد که قرار است با آن ارتباط برقرار شود.
  2. تولید کلاک و ارسال داده: Master شروع به تولید پالس‌های کلاک بر روی خط SCK می‌کند. با هر پالس کلاک (بسته به مُد SPI، در لبه بالا رونده یا پایین رونده کلاک)، Master یک بیت داده را از طریق رجیستر شیفت داخلی خود بر روی خط MOSI به سمت Slave ارسال می‌کند.
  3. دریافت داده (در صورت وجود): همزمان با ارسال بیت از Master به Slave، اگر Slave نیز داده‌ای برای ارسال به Master داشته باشد، یک بیت داده را از طریق رجیستر شیفت خود بر روی خط MISO به سمت Master ارسال می‌کند. این فرآیند همزمان، ماهیت تمام دوبلکس SPI را نشان می‌دهد.
  4. تکمیل انتقال: این فرآیند ارسال و دریافت بیت به بیت تا زمانی که تمام داده‌های مورد نظر (معمولاً یک بایت یا مضربی از آن) منتقل شوند، ادامه می‌یابد.
  5. غیرفعال کردن Slave: پس از اتمام انتقال داده، Master خط SS مربوط به Slave را غیرفعال می‌کند (معمولاً با HIGH کردن آن).

داده‌ها در SPI معمولاً به صورت بایت به بایت منتقل می‌شوند، اما طول داده قابل تنظیم است و می‌تواند بسته به دستگاه‌های مورد استفاده متفاوت باشد. همچنین، ترتیب ارسال بیت‌ها (بیت پرارزش اول MSB First یا بیت کم‌ارزش اول LSB First) نیز قابل پیکربندی است.

مُدهای کاری SPI (Clock Polarity & Clock Phase)

یکی از جنبه‌های مهم در پیکربندی SPI، مُد کاری آن است که توسط دو پارامتر تعیین می‌شود: قطبیت کلاک (Clock Polarity یا CPOL) و فاز کلاک (Clock Phase یا CPHA). ترکیب این دو پارامتر چهار مُد کاری مختلف را برای SPI ایجاد می‌کند:

  • CPOL (Clock Polarity): این پارامتر سطح منطقی پایه کلاک (SCK) را در حالت بیکاری (زمانی که انتقالی صورت نمی‌گیرد) مشخص می‌کند.
    • CPOL=0: کلاک در حالت بیکاری در سطح LOW قرار دارد. اولین لبه کلاک، یک انتقال از LOW به HIGH (لبه بالارونده) خواهد بود.
    • CPOL=1: کلاک در حالت بیکاری در سطح HIGH قرار دارد. اولین لبه کلاک، یک انتقال از HIGH به LOW (لبه پایین‌رونده) خواهد بود.
  • CPHA (Clock Phase): این پارامتر تعیین می‌کند که نمونه‌برداری از داده‌ها (خواندن بیت) در کدام لبه از کلاک (اولین یا دومین لبه پس از فعال شدن SS) انجام شود. همچنین مشخص می‌کند که تغییر داده (ارسال بیت بعدی) در کدام لبه رخ دهد.
    • CPHA=0: داده در اولین لبه کلاک نمونه‌برداری می‌شود و در لبه دوم تغییر می‌کند.
    • CPHA=1: داده در دومین لبه کلاک نمونه‌برداری می‌شود و در لبه اول تغییر می‌کند.

چهار مُد استاندارد SPI عبارتند از:

  • مُد 0 (CPOL=0, CPHA=0): کلاک در حالت بیکاری LOW است. داده در لبه بالارونده کلاک نمونه‌برداری و در لبه پایین‌رونده تغییر می‌کند.
  • مُد 1 (CPOL=0, CPHA=1): کلاک در حالت بیکاری LOW است. داده در لبه پایین‌رونده کلاک نمونه‌برداری و در لبه بالارونده تغییر می‌کند.
  • مُد 2 (CPOL=1, CPHA=0): کلاک در حالت بیکاری HIGH است. داده در لبه پایین‌رونده کلاک نمونه‌برداری و در لبه بالارونده تغییر می‌کند.
  • مُد 3 (CPOL=1, CPHA=1): کلاک در حالت بیکاری HIGH است. داده در لبه بالارونده کلاک نمونه‌برداری و در لبه پایین‌رونده تغییر می‌کند.

انتخاب مُد صحیح SPI برای ارتباط موفقیت‌آمیز بین Master و Slave بسیار حیاتی است. هر دو دستگاه باید بر روی یک مُد یکسان پیکربندی شوند. این اطلاعات معمولاً در دیتاشیت دستگاه Slave مشخص شده است.

پیکربندی SPI در میکروکنترلرها

برای استفاده از رابط SPI در یک میکروکنترلر، ابتدا باید واحد سخت‌افزاری SPI آن را پیکربندی کرد. این پیکربندی معمولاً شامل تنظیم موارد زیر از طریق رجیسترهای کنترلی مربوطه یا توابع کتابخانه‌ای سطح بالا است:

  1. فعال‌سازی ماژول SPI: اولین قدم، فعال کردن واحد SPI در میکروکنترلر است.
  2. تعیین حالت Master یا Slave: میکروکنترلر باید به عنوان Master یا Slave تنظیم شود. در اکثر کاربردها، میکروکنترلر نقش Master را ایفا می‌کند.
  3. تنظیم سرعت کلاک (Baud Rate): فرکانس سیگنال SCK توسط Master تعیین می‌شود. این سرعت باید با حداکثر سرعت قابل پشتیبانی توسط دستگاه Slave و همچنین محدودیت‌های طول مسیر و نویز محیطی سازگار باشد. معمولاً سرعت کلاک از طریق تقسیم فرکانس کلاک سیستم میکروکنترلر به دست می‌آید.
  4. تنظیم مُد SPI (CPOL و CPHA): همانطور که پیشتر توضیح داده شد، قطبیت و فاز کلاک باید مطابق با نیاز دستگاه Slave تنظیم شوند.
  5. ترتیب ارسال بیت (Data Order): تعیین اینکه آیا بیت پرارزش (MSB) اول ارسال شود یا بیت کم‌ارزش (LSB).
  6. پیکربندی پایه‌ها: اختصاص پایه‌های فیزیکی میکروکنترلر به عملکردهای MOSI، MISO، SCK و SS. در بسیاری از میکروکنترلرها، این پایه‌ها عملکردهای جایگزین (Alternate Functions) پورت‌های GPIO هستند.

کتابخانه‌های استاندارد ارائه شده توسط تولیدکنندگان میکروکنترلر (مانند کتابخانه SPI.h در آردوینو یا توابع HAL/LL در میکروکنترلرهای STM32) فرآیند پیکربندی و استفاده از SPI را ساده‌تر می‌کنند.

ارتباط با چندین دستگاه Slave

رابط SPI به طور ذاتی از اتصال چندین دستگاه Slave به یک Master پشتیبانی می‌کند. دو روش اصلی برای این کار وجود دارد:

  1. استفاده از خطوط SS مستقل (Standard Mode):
    در این روش، هر دستگاه Slave به یک پایه SS جداگانه بر روی Master متصل می‌شود. خطوط MISO، MOSI و SCK بین تمامی Slaveها مشترک هستند. Master با فعال کردن (LOW کردن) خط SS مربوط به Slave مورد نظر، آن را برای ارتباط انتخاب می‌کند و سایر Slaveها غیرفعال باقی می‌مانند و به داده‌های روی باس پاسخ نمی‌دهند. این روش رایج‌ترین و انعطاف‌پذیرترین روش است اما با افزایش تعداد Slaveها، تعداد پایه‌های GPIO مورد نیاز در Master نیز افزایش می‌یابد.
  2. پیکربندی زنجیره‌ای (DaisyChain Configuration):
    در این روش، تمامی Slaveها از یک خط SS مشترک استفاده می‌کنند. خروجی داده (MISO) یک Slave به ورودی داده (MOSI) Slave بعدی متصل می‌شود و به همین ترتیب ادامه می‌یابد تا خروجی آخرین Slave به ورودی MISO در Master وصل شود. داده‌ها از Master به اولین Slave ارسال شده و سپس از طریق زنجیره به Slaveهای بعدی منتقل می‌شوند. این روش تعداد پایه‌های SS مورد نیاز را کاهش می‌دهد اما پیچیدگی نرم‌افزاری بیشتری دارد و سرعت کلی ارتباط ممکن است کاهش یابد، زیرا داده‌ها باید از چندین دستگاه عبور کنند. همچنین، ارسال داده به یک Slave خاص در وسط زنجیره بدون تأثیر بر سایرین دشوارتر است.

مزایای رابط SPI

رابط SPI دارای مزایای قابل توجهی است که آن را برای بسیاری از کاربردها مناسب می‌سازد:

  • سرعت بالا: SPI به دلیل ماهیت سنکرون و پروتکل ساده خود، قادر به دستیابی به نرخ انتقال داده بسیار بالا (معمولاً چندین مگابیت بر ثانیه و گاهی تا ده‌ها یا حتی صدها مگابیت بر ثانیه) است. این سرعت بسیار بیشتر از رابط‌هایی مانند I2C یا UART است.
  • ارتباط تمام دوبلکس (FullDuplex): امکان ارسال و دریافت همزمان داده‌ها کارایی را افزایش می‌دهد، به خصوص در کاربردهایی که نیاز به تبادل دوطرفه و سریع اطلاعات است.
  • پروتکل ساده و سربار کم: SPI دارای پروتکل پیچیده‌ای نیست. هیچ فرآیند آدرس‌دهی رسمی یا بیت‌های تأیید (Acknowledgement) در سطح سخت‌افزار وجود ندارد که این امر به سادگی و سرعت آن کمک می‌کند. داده‌ها می‌توانند به صورت پیوسته و بدون وقفه‌های زیاد منتقل شوند.
  • انعطاف‌پذیری در طول داده: اگرچه معمولاً داده‌ها به صورت بایتی منتقل می‌شوند، اما SPI می‌تواند طول‌های مختلفی از داده را پشتیبانی کند.
  • سخت‌افزار ساده‌تر: پیاده‌سازی سخت‌افزاری SPI نسبت به برخی رابط‌های دیگر ساده‌تر است و به منابع کمتری نیاز دارد.

معایب رابط SPI

با وجود مزایای فراوان، SPI معایبی نیز دارد:

  • نیاز به تعداد پایه‌های بیشتر: در مقایسه با I2C (که تنها به دو سیم نیاز دارد)، SPI حداقل به چهار سیم نیاز دارد. با افزایش تعداد Slaveها در حالت استاندارد، تعداد پایه‌های SS مورد نیاز نیز افزایش می‌یابد که می‌تواند منجر به محدودیت در میکروکنترلرهایی با تعداد پایه‌های کم شود.
  • عدم وجود مکانیزم تأیید دریافت (Acknowledgement): SPI در سطح سخت‌افزار هیچ مکانیزمی برای تأیید اینکه داده به درستی توسط Slave دریافت شده است، ارائه نمی‌دهد. این مسئولیت بر عهده نرم‌افزار یا پروتکل‌های لایه بالاتر است.
  • عدم وجود مکانیزم تشخیص خطا: SPI به طور ذاتی مکانیزم تشخیص خطا مانند بیت توازن (Parity Bit) که در UART وجود دارد را شامل نمی‌شود.
  • پشتیبانی تنها از یک Master: در یک باس SPI استاندارد، تنها یک دستگاه Master می‌تواند وجود داشته باشد. ارتباط MultiMaster در SPI به سادگی I2C امکان‌پذیر نیست، اگرچه راه‌حل‌های پیچیده‌تری برای آن وجود دارد.
  • فاصله محدود: به دلیل سرعت بالا و ماهیت سیگنال‌ها، SPI معمولاً برای ارتباطات کوتاه برد (در حد یک برد مدار چاپی یا بین بردهای نزدیک به هم) مناسب است. برای فواصل طولانی‌تر، ممکن است به بافرها یا درایورهای خط نیاز باشد و مشکلات مربوط به یکپارچگی سیگنال افزایش می‌یابد.
  • عدم وجود آدرس‌دهی استاندارد برای Slaveها: انتخاب Slave تنها از طریق خطوط SS انجام می‌شود. هیچ آدرس تعبیه شده‌ای در پروتکل برای Slaveها وجود ندارد، برخلاف I2C.

کاربردهای رایج SPI در میکروکنترلرها

سادگی، سرعت و انعطاف‌پذیری SPI باعث شده تا در طیف وسیعی از کاربردها مورد استفاده قرار گیرد، از جمله:

  • ارتباط با سنسورها: بسیاری از سنسورهای دیجیتال مانند دما، فشار، شتاب‌سنج، ژیروسکوپ و … از رابط SPI برای ارسال داده‌های اندازه‌گیری شده به میکروکنترلر استفاده می‌کنند.
  • ماژول‌های حافظه: حافظه‌های خارجی مانند Flash مموری‌های سریال، EEPROMهای سریال و کارت‌های حافظه SD/MMC اغلب از طریق SPI با میکروکنترلر ارتباط برقرار می‌کنند.
  • نمایشگرها: نمایشگرهای LCD گرافیکی و کاراکتری، و همچنین نمایشگرهای OLED، به وفور از SPI برای دریافت داده‌های تصویر و دستورات کنترلی بهره می‌برند.
  • مبدل‌های آنالوگ به دیجیتال (ADC) و دیجیتال به آنالوگ (DAC): بسیاری از ADCها و DACهای خارجی با دقت و سرعت بالا از طریق SPI به میکروکنترلر متصل می‌شوند.
  • ماژول‌های ارتباطی: ماژول‌های وایرلس مانند فرستنده-گیرنده‌های رادیویی (RF)، ماژول‌های WiFi و بلوتوث، و همچنین کنترلرهای اترنت، ممکن است از SPI برای تبادل داده با میکروکنترلر میزبان استفاده کنند.
  • شیفت رجیسترها: برای افزایش تعداد ورودی‌ها یا خروجی‌های دیجیتال میکروکنترلر، می‌توان از شیفت رجیسترها با رابط SPI استفاده کرد.
  • کنترلرهای LED: درایورهای LED پیشرفته برای کنترل تعداد زیادی LED (مثلاً در نوارهای LED آدرس‌پذیر) گاهی از پروتکل‌های مبتنی بر SPI استفاده می‌کنند.
  • پردازش سیگنال دیجیتال (DSP): در برخی سیستم‌ها، SPI برای ارتباط بین میکروکنترلر و پردازنده‌های سیگنال دیجیتال به کار می‌رود.

مقایسه SPI با سایر رابط‌های سریال (I2C و UART)

درک تفاوت‌های SPI با سایر پروتکل‌های سریال رایج مانند I2C و UART برای انتخاب بهترین رابط برای یک کاربرد خاص ضروری است:

ویژگیSPI (Serial Peripheral Interface)I2C (InterIntegrated Circuit)UART (Universal Asynchronous Receiver/Transmitter)
همزمانیسنکرون (نیاز به کلاک مشترک)سنکرون (نیاز به کلاک مشترک)آسنکرون (بدون کلاک مشترک، نیاز به Baud Rate یکسان)
تعداد سیم‌هاحداقل 4 سیم (MOSI, MISO, SCK, SS)2 سیم (SDA, SCL)2 سیم (RX, TX)
سرعتبسیار بالامتوسط (استاندارد 100kbps, 400kbps، مدهای سریعتر هم موجود است)پایین تا متوسط
ارتباطتمام دوبلکسنیمه دوبلکس (معمولاً)تمام دوبلکس
Master/Slaveیک Master، چندین Slave (استاندارد)چندین Master، چندین Slaveارتباط نقطه به نقطه (معمولاً)
آدرس‌دهی Slaveاز طریق خطوط SS جداگانهآدرس‌دهی 7 یا 10 بیتی در پروتکلندارد (ارتباط مستقیم)
تأیید دریافتندارد (در سطح سخت‌افزار)دارد (ACK/NACK)ندارد (معمولاً، مگر با بیت توازن)
پیچیدگی سخت‌افزارنسبتاً سادهپیچیده‌تر از SPIساده
پیچیدگی پروتکلسادهپیچیده‌تر از SPIساده
کاربرد اصلیارتباطات پرسرعت با حافظه‌ها، سنسورها، نمایشگرهاارتباط با تعداد زیادی دستگاه با سرعت متوسط، مدیریت توانارتباط سریال عمومی، ارتباط با کامپیوتر، GPS، بلوتوث

چه زمانی از SPI استفاده کنیم؟

  • نیاز به سرعت انتقال داده بسیار بالا.
  • ارتباط تمام دوبلکس ضروری است.
  • ارتباط با یک یا چند دستگاه جانبی که SPI را پشتیبانی می‌کنند.
  • سربار پروتکل باید حداقل باشد.
  • تعداد پایه‌های میکروکنترلر برای خطوط SPI (و خطوط SS اضافی در صورت نیاز) کافی است.

نکات مهم و ملاحظات پیشرفته در استفاده از SPI

  • یکپارچگی سیگنال (Signal Integrity): در سرعت‌های بالای کلاک، طول مسیر سیم‌ها، امپدانس مشخصه، و نویز محیطی می‌توانند بر کیفیت سیگنال‌های SPI تأثیر بگذارند. استفاده از مقاومت‌های Pullup یا Pulldown مناسب بر روی خطوط (به ویژه SS و گاهی MISO)، کوتاه نگه داشتن مسیرها، و استفاده از زمین مناسب می‌تواند به بهبود یکپارچگی سیگنال کمک کند.
  • بارگذاری باس (Bus Loading): اتصال تعداد زیادی دستگاه Slave به خطوط MISO، MOSI و SCK می‌تواند باعث افزایش ظرفیت خازنی باس شده و بر حداکثر سرعت قابل دستیابی تأثیر بگذارد.
  • سطوح ولتاژ منطقی: اطمینان حاصل کنید که سطوح ولتاژ منطقی بین Master و Slaveها سازگار هستند (مثلاً هر دو 3.3 ولت یا هر دو 5 ولت). در صورت عدم تطابق، از مبدل‌های سطح ولتاژ (Level Shifters) استفاده کنید.
  • مدیریت خط MISO: در سیستم‌هایی با چندین Slave، باید اطمینان حاصل شود که تنها Slave انتخاب شده خط MISO را هدایت (Drive) می‌کند. سایر Slaveها باید پایه MISO خود را در حالت امپدانس بالا (HighZ) قرار دهند تا از تداخل سیگنال جلوگیری شود. این کار معمولاً به طور خودکار توسط سخت‌افزار Slave هنگام غیرفعال بودن خط SS انجام می‌شود.
  • تأخیرها (Timing Delays): در طراحی‌های با سرعت بالا، تأخیرهای انتشار سیگنال و زمان‌های Setup و Hold برای داده‌ها نسبت به کلاک اهمیت پیدا می‌کنند. این پارامترها باید از دیتاشیت دستگاه‌ها استخراج و در نظر گرفته شوند.
  • استفاده از DMA (Direct Memory Access): برای انتقال حجم زیادی از داده‌ها از طریق SPI بدون درگیر کردن مداوم CPU، می‌توان از کنترلر DMA (در صورت وجود در میکروکنترلر) استفاده کرد. DMA می‌تواند داده‌ها را مستقیماً بین حافظه و رجیستر داده SPI منتقل کند و بار پردازشی CPU را کاهش دهد.

نتیجه‌گیری

رابط SPI یک پروتکل ارتباطی قدرتمند، سریع و انعطاف‌پذیر است که نقش حیاتی در اکوسیستم میکروکنترلرها و سیستم‌های نهفته ایفا می‌کند. درک صحیح اصول عملکرد، پایه‌ها، مُدهای کاری، مزایا و معایب آن به مهندسان و طراحان این امکان را می‌دهد تا به طور مؤثر از این رابط برای اتصال طیف گسترده‌ای از قطعات جانبی استفاده کنند. با انتخاب صحیح پیکربندی و در نظر گرفتن ملاحظات عملی، SPI می‌تواند راه‌حلی کارآمد برای بسیاری از چالش‌های ارتباطی در طراحی‌های الکترونیکی مدرن ارائه دهد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *