مقدمه
رابط سریال محیطی (Serial Peripheral Interface یا SPI) یک پروتکل ارتباطی سریال سنکرون است که به طور گسترده در سیستمهای نهفته و میکروکنترلرها برای ارتباط کوتاه برد و با سرعت بالا بین یک دستگاه اصلی (Master) و یک یا چند دستگاه جانبی (Slave) استفاده میشود. این رابط که توسط شرکت موتورولا توسعه یافته، به دلیل سادگی و کارایی بالا، به یکی از محبوبترین روشهای ارتباطی در دنیای الکترونیک دیجیتال تبدیل شده است. در این مقاله، به بررسی جامع و کامل تمامی جنبههای رابط SPI، از مفاهیم پایه تا نکات پیشرفته، خواهیم پرداخت.
SPI چیست؟ مروری بر مفاهیم بنیادین
SPI یک رابط ارتباطی سریال است، به این معنی که دادهها بیت به بیت و پشت سر هم از طریق یک یا دو خط داده منتقل میشوند. این برخلاف ارتباط موازی است که چندین بیت داده به طور همزمان ارسال میگردند. سنکرون بودن SPI نیز به این معناست که یک سیگنال کلاک مشترک، زمانبندی ارسال و دریافت دادهها را بین دستگاه اصلی و جانبی هماهنگ میکند. این ویژگی باعث میشود تا SPI بتواند به سرعتهای بالاتری نسبت به رابطهای آسنکرون مانند UART دست یابد.
ارتباط در SPI بر پایهی معماری Master/Slave شکل میگیرد. دستگاه Master (معمولاً میکروکنترلر) وظیفهی تولید سیگنال کلاک و آغاز ارتباط را بر عهده دارد. دستگاه یا دستگاههای Slave (مانند سنسورها، حافظهها، نمایشگرها و …) به دستورات Master پاسخ میدهند. SPI یک ارتباط تمام دوبلکس (Full–Duplex) را فراهم میکند، بدین معنی که ارسال و دریافت دادهها میتواند به طور همزمان انجام شود.
پایههای استاندارد در رابط SPI
یک ارتباط استاندارد SPI معمولاً از چهار خط سیگنال اصلی استفاده میکند:
MOSI(MasterOutSlaveIn): این خط برای انتقال داده از دستگاهMasterبه دستگاهSlaveاستفاده میشود. دادهها از پایهMOSIدرMasterخارج و به پایهMOSIدرSlaveوارد میشوند. در برخی موارد، این پایه با نامهای دیگری مانندSDI(SerialDataIn) یاDI(DataIn) بر روی دستگاههایSlaveنیز شناخته میشود.MISO(MasterInSlaveOut): این خط برای انتقال داده از دستگاهSlaveبه دستگاهMasterبه کار میرود. دادهها از پایهMISOدرSlaveخارج و به پایهMISOدرMasterوارد میشوند. نامهای دیگر این پایه شاملSDO(SerialDataOut) یاDO(DataOut) بر روی دستگاههایSlaveاست.SCK(SerialClock) یاSCLK: این خط سیگنال کلاک را حمل میکند که توسطMasterتولید میشود. هر پالس کلاک، انتقال یک بیت داده را همزمان میکند. فرکانس این کلاک، سرعت انتقال داده را تعیین میکند.SS(SlaveSelect) یاCS(ChipSelect): این خط توسطMasterبرای انتخاب دستگاهSlaveمورد نظر جهت برقراری ارتباط استفاده میشود. هر دستگاهSlaveبه یک خطSSجداگانه ازMasterمتصل میشود (در حالت استاندارد). هنگامی کهMasterمیخواهد با یکSlaveخاص ارتباط برقرار کند، خطSSمربوط به آنSlaveرا فعال میکند (معمولاً با قرار دادن آن در سطح منطقی پایین یاLOW). تنهاSlaveانتخاب شده به سیگنال کلاک و دادههای روی خطوطMOSI/MISOپاسخ میدهد.
در برخی پیکربندیها، به ویژه زمانی که تنها یک Slave وجود دارد، ممکن است پایه SS به طور دائم فعال نگه داشته شود.
نحوه عملکرد و انتقال داده در SPI
فرآیند انتقال داده در SPI به صورت زیر انجام میشود:
- انتخاب
Slave: دستگاهMasterابتدا خطSSمربوط بهSlaveمورد نظر را فعال میکند (معمولاً باLOWکردن آن). این کار بهSlaveاطلاع میدهد که قرار است با آن ارتباط برقرار شود. - تولید کلاک و ارسال داده:
Masterشروع به تولید پالسهای کلاک بر روی خطSCKمیکند. با هر پالس کلاک (بسته به مُدSPI،در لبه بالا رونده یا پایین رونده کلاک)،Masterیک بیت داده را از طریق رجیستر شیفت داخلی خود بر روی خطMOSIبه سمتSlaveارسال میکند. - دریافت داده (در صورت وجود): همزمان با ارسال بیت از
MasterبهSlave،اگرSlaveنیز دادهای برای ارسال بهMasterداشته باشد، یک بیت داده را از طریق رجیستر شیفت خود بر روی خطMISOبه سمتMasterارسال میکند. این فرآیند همزمان، ماهیت تمام دوبلکسSPIرا نشان میدهد. - تکمیل انتقال: این فرآیند ارسال و دریافت بیت به بیت تا زمانی که تمام دادههای مورد نظر (معمولاً یک بایت یا مضربی از آن) منتقل شوند، ادامه مییابد.
- غیرفعال کردن
Slave: پس از اتمام انتقال داده،MasterخطSSمربوط بهSlaveرا غیرفعال میکند (معمولاً باHIGHکردن آن).
دادهها در SPI معمولاً به صورت بایت به بایت منتقل میشوند، اما طول داده قابل تنظیم است و میتواند بسته به دستگاههای مورد استفاده متفاوت باشد. همچنین، ترتیب ارسال بیتها (بیت پرارزش اول MSB First یا بیت کمارزش اول LSB First) نیز قابل پیکربندی است.
مُدهای کاری SPI (Clock Polarity & Clock Phase)
یکی از جنبههای مهم در پیکربندی SPI، مُد کاری آن است که توسط دو پارامتر تعیین میشود: قطبیت کلاک (Clock Polarity یا CPOL) و فاز کلاک (Clock Phase یا CPHA). ترکیب این دو پارامتر چهار مُد کاری مختلف را برای SPI ایجاد میکند:
CPOL(ClockPolarity): این پارامتر سطح منطقی پایه کلاک (SCK) را در حالت بیکاری (زمانی که انتقالی صورت نمیگیرد) مشخص میکند.CPOL=0: کلاک در حالت بیکاری در سطحLOWقرار دارد. اولین لبه کلاک، یک انتقال ازLOWبهHIGH(لبه بالارونده) خواهد بود.CPOL=1: کلاک در حالت بیکاری در سطحHIGHقرار دارد. اولین لبه کلاک، یک انتقال ازHIGHبهLOW(لبه پایینرونده) خواهد بود.
CPHA(ClockPhase): این پارامتر تعیین میکند که نمونهبرداری از دادهها (خواندن بیت) در کدام لبه از کلاک (اولین یا دومین لبه پس از فعال شدن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 آن را پیکربندی کرد. این پیکربندی معمولاً شامل تنظیم موارد زیر از طریق رجیسترهای کنترلی مربوطه یا توابع کتابخانهای سطح بالا است:
- فعالسازی ماژول
SPI: اولین قدم، فعال کردن واحدSPIدر میکروکنترلر است. - تعیین حالت
MasterیاSlave: میکروکنترلر باید به عنوانMasterیاSlaveتنظیم شود. در اکثر کاربردها، میکروکنترلر نقشMasterرا ایفا میکند. - تنظیم سرعت کلاک (
BaudRate): فرکانس سیگنالSCKتوسطMasterتعیین میشود. این سرعت باید با حداکثر سرعت قابل پشتیبانی توسط دستگاهSlaveو همچنین محدودیتهای طول مسیر و نویز محیطی سازگار باشد. معمولاً سرعت کلاک از طریق تقسیم فرکانس کلاک سیستم میکروکنترلر به دست میآید. - تنظیم مُد
SPI(CPOLوCPHA): همانطور که پیشتر توضیح داده شد، قطبیت و فاز کلاک باید مطابق با نیاز دستگاهSlaveتنظیم شوند. - ترتیب ارسال بیت (
DataOrder): تعیین اینکه آیا بیت پرارزش (MSB) اول ارسال شود یا بیت کمارزش (LSB). - پیکربندی پایهها: اختصاص پایههای فیزیکی میکروکنترلر به عملکردهای
MOSI،MISO،SCKوSS. در بسیاری از میکروکنترلرها، این پایهها عملکردهای جایگزین (AlternateFunctions) پورتهایGPIOهستند.
کتابخانههای استاندارد ارائه شده توسط تولیدکنندگان میکروکنترلر (مانند کتابخانه SPI.h در آردوینو یا توابع HAL/LL در میکروکنترلرهای STM32) فرآیند پیکربندی و استفاده از SPI را سادهتر میکنند.
ارتباط با چندین دستگاه Slave
رابط SPI به طور ذاتی از اتصال چندین دستگاه Slave به یک Master پشتیبانی میکند. دو روش اصلی برای این کار وجود دارد:
- استفاده از خطوط
SSمستقل (StandardMode):
در این روش، هر دستگاهSlaveبه یک پایهSSجداگانه بر رویMasterمتصل میشود. خطوطMISO،MOSIوSCKبین تمامیSlaveهامشترک هستند.Masterبا فعال کردن (LOWکردن) خطSSمربوط بهSlaveمورد نظر، آن را برای ارتباط انتخاب میکند و سایرSlaveهاغیرفعال باقی میمانند و به دادههای روی باس پاسخ نمیدهند. این روش رایجترین و انعطافپذیرترین روش است اما با افزایش تعدادSlaveها،تعداد پایههایGPIOمورد نیاز درMasterنیز افزایش مییابد. - پیکربندی زنجیرهای (
Daisy–ChainConfiguration):
در این روش، تمامیSlaveهااز یک خطSSمشترک استفاده میکنند. خروجی داده (MISO) یکSlaveبه ورودی داده (MOSI)Slaveبعدی متصل میشود و به همین ترتیب ادامه مییابد تا خروجی آخرینSlaveبه ورودیMISOدرMasterوصل شود. دادهها ازMasterبه اولینSlaveارسال شده و سپس از طریق زنجیره بهSlaveهایبعدی منتقل میشوند. این روش تعداد پایههایSSمورد نیاز را کاهش میدهد اما پیچیدگی نرمافزاری بیشتری دارد و سرعت کلی ارتباط ممکن است کاهش یابد، زیرا دادهها باید از چندین دستگاه عبور کنند. همچنین، ارسال داده به یکSlaveخاص در وسط زنجیره بدون تأثیر بر سایرین دشوارتر است.
مزایای رابط SPI
رابط SPI دارای مزایای قابل توجهی است که آن را برای بسیاری از کاربردها مناسب میسازد:
- سرعت بالا:
SPIبه دلیل ماهیت سنکرون و پروتکل ساده خود، قادر به دستیابی به نرخ انتقال داده بسیار بالا (معمولاً چندین مگابیت بر ثانیه و گاهی تا دهها یا حتی صدها مگابیت بر ثانیه) است. این سرعت بسیار بیشتر از رابطهایی مانندI2CیاUARTاست. - ارتباط تمام دوبلکس (
Full–Duplex): امکان ارسال و دریافت همزمان دادهها کارایی را افزایش میدهد، به خصوص در کاربردهایی که نیاز به تبادل دوطرفه و سریع اطلاعات است. - پروتکل ساده و سربار کم:
SPIدارای پروتکل پیچیدهای نیست. هیچ فرآیند آدرسدهی رسمی یا بیتهای تأیید (Acknowledgement) در سطح سختافزار وجود ندارد که این امر به سادگی و سرعت آن کمک میکند. دادهها میتوانند به صورت پیوسته و بدون وقفههای زیاد منتقل شوند. - انعطافپذیری در طول داده: اگرچه معمولاً دادهها به صورت بایتی منتقل میشوند، اما
SPIمیتواند طولهای مختلفی از داده را پشتیبانی کند. - سختافزار سادهتر: پیادهسازی سختافزاری
SPIنسبت به برخی رابطهای دیگر سادهتر است و به منابع کمتری نیاز دارد.
معایب رابط SPI
با وجود مزایای فراوان، SPI معایبی نیز دارد:
- نیاز به تعداد پایههای بیشتر: در مقایسه با
I2C(که تنها به دو سیم نیاز دارد)،SPIحداقل به چهار سیم نیاز دارد. با افزایش تعدادSlaveهادر حالت استاندارد، تعداد پایههایSSمورد نیاز نیز افزایش مییابد که میتواند منجر به محدودیت در میکروکنترلرهایی با تعداد پایههای کم شود. - عدم وجود مکانیزم تأیید دریافت (
Acknowledgement):SPIدر سطح سختافزار هیچ مکانیزمی برای تأیید اینکه داده به درستی توسطSlaveدریافت شده است، ارائه نمیدهد. این مسئولیت بر عهده نرمافزار یا پروتکلهای لایه بالاتر است. - عدم وجود مکانیزم تشخیص خطا:
SPIبه طور ذاتی مکانیزم تشخیص خطا مانند بیت توازن (ParityBit) که درUARTوجود دارد را شامل نمیشود. - پشتیبانی تنها از یک
Master: در یک باسSPIاستاندارد، تنها یک دستگاهMasterمیتواند وجود داشته باشد. ارتباطMulti–Masterدر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)، ماژولهایWi–Fiو بلوتوث، و همچنین کنترلرهای اترنت، ممکن است ازSPIبرای تبادل داده با میکروکنترلر میزبان استفاده کنند. - شیفت رجیسترها: برای افزایش تعداد ورودیها یا خروجیهای دیجیتال میکروکنترلر، میتوان از شیفت رجیسترها با رابط
SPIاستفاده کرد. - کنترلرهای
LED: درایورهایLEDپیشرفته برای کنترل تعداد زیادیLED(مثلاً در نوارهایLEDآدرسپذیر) گاهی از پروتکلهای مبتنی برSPIاستفاده میکنند. - پردازش سیگنال دیجیتال (
DSP): در برخی سیستمها،SPIبرای ارتباط بین میکروکنترلر و پردازندههای سیگنال دیجیتال به کار میرود.
مقایسه SPI با سایر رابطهای سریال (I2C و UART)
درک تفاوتهای SPI با سایر پروتکلهای سریال رایج مانند I2C و UART برای انتخاب بهترین رابط برای یک کاربرد خاص ضروری است:
| ویژگی | SPI (Serial Peripheral Interface) | I2C (Inter–Integrated 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
- یکپارچگی سیگنال (
SignalIntegrity): در سرعتهای بالای کلاک، طول مسیر سیمها، امپدانس مشخصه، و نویز محیطی میتوانند بر کیفیت سیگنالهایSPIتأثیر بگذارند. استفاده از مقاومتهایPull–upیاPull–downمناسب بر روی خطوط (به ویژهSSو گاهیMISO)، کوتاه نگه داشتن مسیرها، و استفاده از زمین مناسب میتواند به بهبود یکپارچگی سیگنال کمک کند. - بارگذاری باس (
BusLoading): اتصال تعداد زیادی دستگاهSlaveبه خطوطMISO،MOSIوSCKمیتواند باعث افزایش ظرفیت خازنی باس شده و بر حداکثر سرعت قابل دستیابی تأثیر بگذارد. - سطوح ولتاژ منطقی: اطمینان حاصل کنید که سطوح ولتاژ منطقی بین
MasterوSlaveهاسازگار هستند (مثلاً هر دو 3.3 ولت یا هر دو 5 ولت). در صورت عدم تطابق، از مبدلهای سطح ولتاژ (LevelShifters) استفاده کنید. - مدیریت خط
MISO: در سیستمهایی با چندینSlave،باید اطمینان حاصل شود که تنهاSlaveانتخاب شده خطMISOرا هدایت (Drive) میکند. سایرSlaveهاباید پایهMISOخود را در حالت امپدانس بالا (High–Z) قرار دهند تا از تداخل سیگنال جلوگیری شود. این کار معمولاً به طور خودکار توسط سختافزارSlaveهنگام غیرفعال بودن خطSSانجام میشود. - تأخیرها (
TimingDelays): در طراحیهای با سرعت بالا، تأخیرهای انتشار سیگنال و زمانهایSetupوHoldبرای دادهها نسبت به کلاک اهمیت پیدا میکنند. این پارامترها باید از دیتاشیت دستگاهها استخراج و در نظر گرفته شوند. - استفاده از
DMA(DirectMemoryAccess): برای انتقال حجم زیادی از دادهها از طریقSPIبدون درگیر کردن مداومCPU،میتوان از کنترلرDMA(در صورت وجود در میکروکنترلر) استفاده کرد.DMAمیتواند دادهها را مستقیماً بین حافظه و رجیستر دادهSPIمنتقل کند و بار پردازشیCPUرا کاهش دهد.
نتیجهگیری
رابط SPI یک پروتکل ارتباطی قدرتمند، سریع و انعطافپذیر است که نقش حیاتی در اکوسیستم میکروکنترلرها و سیستمهای نهفته ایفا میکند. درک صحیح اصول عملکرد، پایهها، مُدهای کاری، مزایا و معایب آن به مهندسان و طراحان این امکان را میدهد تا به طور مؤثر از این رابط برای اتصال طیف گستردهای از قطعات جانبی استفاده کنند. با انتخاب صحیح پیکربندی و در نظر گرفتن ملاحظات عملی، SPI میتواند راهحلی کارآمد برای بسیاری از چالشهای ارتباطی در طراحیهای الکترونیکی مدرن ارائه دهد.
