
تفاوت I2C و SPI در پروژههای میکروکنترلری؛ کدام رابط را انتخاب کنیم؟
در بسیاری از پروژههای الکترونیکی، اتصال سنسور، نمایشگر، حافظه یا مبدل آنالوگ به دیجیتال به چند سیم ارتباطی نیاز دارد. دو مورد از رایجترین رابطهای مورد استفاده برای این کار، I2C و SPI هستند.
هر دو رابط امکان انتقال داده بهصورت سری و هماهنگ با سیگنال کلاک را فراهم میکنند، اما در تعداد سیمها، روش انتخاب تجهیزات جانبی، سرعت انتقال، پیچیدگی سختافزار و نحوه مدیریت ارتباط تفاوت دارند.
اگر تعداد سیمها و اتصال چند قطعه روی یک باس برایتان مهم است، I2C معمولاً انتخاب مناسبی است. اگر نرخ انتقال داده بالا و تبادل سریع اطلاعات اهمیت بیشتری دارد، SPI اغلب گزینه بهتری خواهد بود. البته انتخاب نهایی به مشخصات قطعه جانبی، قابلیتهای میکروکنترلر و محدودیتهای مدار بستگی دارد.
۱. رابط I2C چیست و چگونه کار میکند؟
I2C مخفف Inter-Integrated Circuit است. این رابط برای ارتباط بین مدارهای مجتمع و تجهیزات جانبی طراحی شده و با استفاده از دو خط اصلی، امکان تبادل داده بین چند دستگاه را فراهم میکند.
دو خط اصلی I2C عبارتاند از:
-
SDA (Serial Data): خط انتقال داده که میتواند در هر دو جهت استفاده شود.
-
SCL (Serial Clock): خط کلاک که معمولاً توسط کنترلکننده ارتباط تولید میشود.
در یک ارتباط معمولی، میکروکنترلر نقش کنترلکننده (Controller) و قطعات جانبی نقش مقصد یا Target را دارند. کنترلکننده با استفاده از آدرس هر قطعه، دستگاه موردنظر را انتخاب میکند و عملیات خواندن یا نوشتن را انجام میدهد. استاندارد I2C امکان وجود چند کنترلکننده روی یک باس را نیز پیشبینی کرده است.
آدرسدهی در I2C
یکی از مهمترین مزیتهای I2C، امکان اتصال چند قطعه به خطوط مشترک SDA و SCL است. هر قطعه باید با آدرسی قابل تشخیص باشد تا کنترلکننده بتواند آن را انتخاب کند.
بسیاری از قطعات I2C از آدرسدهی ۷ بیتی استفاده میکنند. برخی قطعات نیز آدرسدهی ۱۰ بیتی را پشتیبانی میکنند.
برای مثال، فرض کنید در یک مدار از این تجهیزات استفاده میکنید:
-
یک سنسور دما
-
یک حافظه EEPROM
-
یک ماژول ساعت واقعی (RTC)
اگر هر سه قطعه از I2C استفاده کنند و آدرسهای آنها با یکدیگر تداخل نداشته باشد، میتوان هر سه را به همان دو خط SDA و SCL متصل کرد.
البته باید به آدرس ثابت یا قابل تنظیم قطعات توجه کنید. اگر دو دستگاه روی یک باس آدرس یکسان داشته باشند، ممکن است ارتباط دچار تداخل شود. در چنین شرایطی میتوان از تغییر پایههای انتخاب آدرس، باسهای جداگانه یا مالتیپلکسر I2C استفاده کرد؛ البته راهکار مناسب به امکانات قطعات بستگی دارد.
مقاومتهای Pull-up در I2C
خطوط SDA و SCL در I2C معمولاً از ساختار خروجی Open-drain یا Open-collector استفاده میکنند. این ساختار اجازه میدهد دستگاهها خط را به سطح منطقی پایین بکشند و مقاومت Pull-up آن را به سطح منطقی بالا برساند.
به همین دلیل، در طراحی مدار I2C معمولاً به مقاومتهای Pull-up نیاز داریم. مقدار این مقاومتها باید با توجه به ولتاژ تغذیه، ظرفیت خازنی باس، سرعت ارتباط و توانایی خروجی دستگاهها انتخاب شود.
مقدار نامناسب مقاومت میتواند باعث کندشدن لبههای سیگنال، اختلال در ارتباط یا افزایش جریان شود. همچنین اگر چند ماژول متصل به باس هرکدام مقاومت Pull-up داشته باشند، مقاومت معادل باید بررسی شود؛ زیرا اتصال موازی مقاومتها، مقدار معادل را کاهش میدهد.
سرعت انتقال داده در I2C
استاندارد I2C چند حالت سرعت دارد. مهمترین حالتهای متداول عبارتاند از:
| حالت | حداکثر نرخ کلاک اسمی |
|---|---|
| Standard-mode | 100 kHz |
| Fast-mode | 400 kHz |
| Fast-mode Plus | 1 MHz |
| High-speed mode | 3.4 MHz |
این اعداد، نرخ کلاک اسمی هر حالت هستند و نباید آنها را با نرخ واقعی انتقال داده مفید یکسان دانست. آدرسدهی، بیت تأیید دریافت (ACK)، شرایط شروع و پایان ارتباط و سایر سربارهای پروتکل بر سرعت انتقال داده واقعی اثر میگذارند. همه قطعات نیز از تمام حالتهای سرعت پشتیبانی نمیکنند.
برای بسیاری از سنسورها، ماژولهای RTC و قطعاتی که در فواصل زمانی نسبتاً طولانی داده ارسال میکنند، I2C انتخاب مناسبی است.
۲. رابط SPI چیست و چگونه کار میکند؟
SPI مخفف Serial Peripheral Interface است. این رابط سریال سنکرون برای ارتباط سریع بین میکروکنترلر و تجهیزات جانبی کاربرد دارد.
در شکل رایج چهار سیمه، SPI از خطوط زیر استفاده میکند:
-
SCLK: سیگنال کلاک که توسط کنترلکننده تولید میشود.
-
MOSI: ارسال داده از کنترلکننده به قطعه جانبی.
-
MISO: ارسال داده از قطعه جانبی به کنترلکننده.
-
CS یا SS: انتخاب قطعه جانبی موردنظر.
نامگذاری MOSI و MISO در بسیاری از منابع و میکروکنترلرها رایج است؛ در بعضی مستندات جدیدتر از نامهایی مانند COPI و CIPO نیز استفاده میشود.
برخلاف I2C، در SPI معمولاً آدرسدهی داخلی مشابه I2C وجود ندارد. کنترلکننده با فعالکردن خط CS مربوط به قطعه موردنظر، آن را برای تبادل داده انتخاب میکند.
نحوه اتصال چند قطعه به SPI
فرض کنید یک میکروکنترلر باید با یک نمایشگر، یک حافظه و یک مبدل ADC ارتباط برقرار کند. در یک آرایش متداول SPI، خطوط SCLK، MOSI و MISO بین قطعات مشترک هستند؛ اما هر قطعه خط انتخاب CS مخصوص خود را دارد.
در نتیجه، با اضافهشدن قطعات جانبی، تعداد پایههای موردنیاز کنترلکننده معمولاً افزایش مییابد. اگر تعداد پایهها محدود باشد، میتوان با استفاده از دیکودر یا مدار انتخاب مناسب، تعداد خروجیهای لازم برای انتخاب قطعات را کاهش داد؛ البته این کار پیچیدگی مدار را افزایش میدهد.
باید به رفتار خط MISO نیز توجه داشت: قطعاتی که MISO مشترک دارند باید هنگام انتخابنشدن، خروجی خود را به وضعیت امپدانس بالا (High-impedance) ببرند. در غیر این صورت، ممکن است خروجی چند قطعه با یکدیگر تداخل پیدا کند.
سرعت انتقال داده در SPI
یکی از دلایل اصلی انتخاب SPI، امکان کار با کلاکهای نسبتاً سریع و انتقال پیوسته داده است. سرعت قابل دستیابی به میکروکنترلر، قطعه جانبی، طول مسیرها، کیفیت سیگنال، تنظیمات کلاک و محدودیتهای دیتاشیت وابسته است. بنابراین، برای SPI نمیتوان یک حداکثر سرعت واحد و عمومی برای تمام قطعات اعلام کرد.
برای مثال، هنگام بهروزرسانی سریع پیکسلهای یک نمایشگر یا انتقال بلوکهای داده به حافظه، SPI میتواند در مقایسه با I2C مزیت قابلتوجهی داشته باشد؛ به شرط آنکه خود قطعه جانبی و طراحی مدار بتوانند سرعت موردنظر را پشتیبانی کنند.
آیا SPI همیشه چهار سیم نیاز دارد؟
خیر. چهار خط، ساختار رایج SPI است؛ اما برخی تجهیزات از ارتباط سهسیمه یا آرایشهای خاص استفاده میکنند. در این موارد، جزئیات به طراحی رابط و دیتاشیت قطعه وابسته است.
در حالت رایج چهار سیمه، خطوط داده جداگانه MOSI و MISO امکان ارسال و دریافت همزمان را فراهم میکنند. به این قابلیت Full-duplex گفته میشود. با این حال، اینکه یک قطعه واقعاً از تبادل همزمان داده پشتیبانی کند، به پروتکل همان قطعه بستگی دارد.
۳. مقایسه مستقیم I2C و SPI
جدول زیر تفاوتهای اصلی این دو رابط را از دید طراحی یک پروژه میکروکنترلری نشان میدهد.
| ویژگی | I2C | SPI |
|---|---|---|
| تعداد خطوط اصلی | 2 خط | معمولاً 4 خط |
| خطوط داده | یک خط دوطرفه | معمولاً دو خط جداگانه |
| انتخاب دستگاه | آدرسدهی | خط CS برای هر قطعه در آرایش رایج |
| مقاومت Pull-up | معمولاً لازم است | معمولاً برای خطوط اصلی لازم نیست |
| سرعت انتقال | دارای حالتهای سرعت استاندارد | وابسته به کنترلکننده و قطعه جانبی؛ اغلب مناسب نرخهای بالاتر |
| تبادل همزمان دوطرفه | معمولاً با یک خط داده انجام نمیشود | در ساختار رایج امکانپذیر است |
| اتصال چند قطعه | خطوط مشترک و آدرسهای متمایز | خطوط داده مشترک و معمولاً CS جداگانه |
| پیچیدگی سیمکشی | معمولاً کمتر | معمولاً بیشتر |
| سربار پروتکل | آدرسدهی و بیتهای کنترلی | به طراحی پروتکل قطعه وابسته است |
| کاربرد متداول | سنسورها، RTC، حافظههای کمسرعت و توسعه GPIO | نمایشگرها، حافظههای سریع و مبدلهای داده پرسرعت |
نکته مهم این است که هیچیک از این دو رابط در تمام معیارها برتری مطلق ندارد. برای نمونه، SPI میتواند نرخ انتقال بالاتری داشته باشد، اما مصرف پایههای GPIO آن در اتصال چند قطعه ممکن است بیشتر باشد. از طرف دیگر، I2C سیمکشی را سادهتر میکند، اما ظرفیت خازنی باس و محدودیت سرعت باید جدی گرفته شوند.
۴. در چه شرایطی I2C انتخاب بهتری است؟
I2C معمولاً زمانی انتخاب مناسبی است که تعداد خطوط ارتباطی اهمیت زیادی داشته باشد و نرخ انتقال داده موردنیاز نسبتاً پایین باشد.
اتصال چند سنسور به یک میکروکنترلر
اگر بخواهید چند سنسور دما، رطوبت، فشار یا شتابسنج را به یک برد متصل کنید، I2C میتواند تعداد سیمهای ارتباطی را کاهش دهد. بهجای اختصاصدادن مجموعهای از خطوط جداگانه به هر قطعه، چند دستگاه سازگار میتوانند از SDA و SCL مشترک استفاده کنند. با این حال، قبل از اتصال چند سنسور باید آدرسهای آنها، ولتاژ منطقی، ظرفیت باس و سرعت قابل پشتیبانی بررسی شود.
استفاده از ماژول ساعت واقعی و EEPROM
ماژولهای RTC برای نگهداری زمان و حافظههای EEPROM برای ذخیره تنظیمات، معمولاً به پهنای باند بسیار بالایی نیاز ندارند. در چنین کاربردهایی، I2C میتواند راهکاری ساده و کمسیم باشد؛ البته رابط واقعی هر قطعه باید از دیتاشیت آن بررسی شود.
افزایش تعداد ورودی و خروجیها
برخی توسعهدهندههای GPIO از I2C استفاده میکنند و امکان افزایش تعداد ورودی و خروجیهای دیجیتال را با اشغال تعداد کمی از پایههای میکروکنترلر فراهم میسازند.
این راهکار برای پنلهای کنترلی، کلیدها، LEDها و تجهیزات جانبی مناسب است؛ اما برای سیگنالهای بسیار سریع یا کاربردهای حساس به تأخیر، باید محدودیتهای توسعهدهنده GPIO نیز بررسی شود.
۵. در چه شرایطی SPI انتخاب بهتری است؟
اگر سرعت انتقال داده اهمیت زیادی دارد یا قطعه جانبی از ابتدا برای SPI طراحی شده است، معمولاً باید SPI را در اولویت بررسی قرار دهید.
اتصال نمایشگرهای گرافیکی
نمایشگرهای گرافیکی ممکن است به انتقال حجم زیادی از داده نیاز داشته باشند. برای مثال، هنگام تغییر تصویر یا بهروزرسانی ناحیه بزرگی از نمایشگر، پهنای باند رابط اهمیت پیدا میکند.
SPI در چنین کاربردهایی میتواند مناسب باشد؛ اما سرعت واقعی به وضوح نمایشگر، نوع کنترلکننده نمایشگر، اندازه بستههای داده، کتابخانه نرمافزاری و کلاک قابل پشتیبانی وابسته است.
استفاده از حافظههای پرسرعت
برخی حافظههای Flash و سایر تجهیزات ذخیرهسازی از رابط SPI یا نسخههای توسعهیافته آن استفاده میکنند. در این شرایط، SPI امکان انتقال بلوکهای بزرگ داده را با سربار ارتباطی مناسب فراهم میکند.
با این حال، نباید مشخصات SPI معمولی را بدون بررسی به رابطهایی مانند Quad-SPI تعمیم داد؛ زیرا تعداد خطوط داده و شیوه انتقال در آنها متفاوت است.
اتصال مبدلهای ADC و DAC
بعضی مبدلهای آنالوگ به دیجیتال و دیجیتال به آنالوگ از SPI استفاده میکنند. اگر پروژه به نمونهبرداری سریع یا ارسال دادههای پیوسته نیاز داشته باشد، این رابط میتواند گزینه مناسبی باشد.
در اینجا تنها سرعت کلاک اهمیت ندارد؛ نرخ نمونهبرداری قطعه، زمان تبدیل، زمانبندی سیگنالها و توانایی میکروکنترلر برای پردازش داده نیز باید بررسی شوند.
۶. نکات مهم در طراحی سختافزار
انتخاب I2C یا SPI فقط تصمیمی نرمافزاری نیست. طراحی PCB، کیفیت مسیرهای سیگنال و سازگاری الکتریکی قطعات نیز نقش مهمی دارند.
سازگاری ولتاژ منطقی
پیش از اتصال تجهیزات جانبی، ولتاژ منطقی پایههای آنها را بررسی کنید. برای مثال، اگر یک میکروکنترلر با منطق 3.3 ولت کار میکند، نباید بدون بررسی مشخصات پایهها فرض کرد که اتصال مستقیم به یک ماژول با خروجی 5 ولت ایمن است.
در I2C، مقاومتهای Pull-up باید به ولتاژی متصل شوند که برای تمام دستگاههای باس مجاز باشد. در SPI نیز سطوح ولتاژ SCLK، MOSI، MISO و CS باید با مشخصات ورودی و خروجی قطعات سازگار باشند. در صورت نیاز، از مبدل سطح منطقی مناسب استفاده کنید.
طول مسیرها و نویز
هر دو رابط برای ارتباط دیجیتال به کیفیت سیگنال وابستهاند. افزایش طول سیمها و ظرفیت خازنی، نویز و تداخل الکترومغناطیسی میتوانند قابلیت اطمینان ارتباط را کاهش دهند. در I2C، ظرفیت باس و زمان بالا رفتن سیگنالها اهمیت ویژهای دارند. در SPI، با افزایش فرکانس کلاک، کیفیت مسیرها، زمانبندی و یکپارچگی سیگنال اهمیت بیشتری پیدا میکند.
برای طراحی قابلاعتماد:
-
مسیرهای ارتباطی را تا حد امکان کوتاه نگه دارید.
-
مسیر بازگشت جریان و پیوستگی صفحه زمین را در طراحی PCB در نظر بگیرید.
-
در صورت مشاهده خطا، ابتدا کلاک و سیگنالهای داده را با ابزار مناسب بررسی کنید.
-
سرعت ارتباط را تنها تا جایی افزایش دهید که قطعات و طراحی مدار بهصورت قابلاعتماد پشتیبانی کنند.
تنظیمات کلاک در SPI
SPI دارای تنظیمات قطبیت کلاک (CPOL) و فاز کلاک (CPHA) است. این تنظیمات مشخص میکنند کلاک در حالت بیکار چه سطحی دارد و داده در کدام لبه نمونهبرداری یا تغییر میکند. چهار ترکیب متداول این دو پارامتر با حالتهای SPI Mode 0 تا SPI Mode 3 شناخته میشوند.
اگر تنظیمات میکروکنترلر با نیاز قطعه جانبی مطابقت نداشته باشد، ممکن است دادهها اشتباه خوانده شوند یا ارتباط اصلاً کار نکند. برای انتخاب حالت درست، باید بخش Timing Characteristics یا توضیحات رابط سریال در دیتاشیت قطعه را بررسی کنید.
محدودیتهای آدرسدهی در I2C
اگر چند قطعه I2C روی یک باس قرار دارند، آدرس هرکدام باید بهدرستی شناسایی شود. گاهی دو قطعه یکسان، آدرس ثابت یکسانی دارند و امکان تغییر آن نیز وجود ندارد. در چنین شرایطی، استفاده از مالتیپلکسر I2C یا قرار دادن دستگاهها روی باسهای مستقل میتواند راهحل باشد. همچنین وجود چند مجموعه مقاومت Pull-up روی ماژولهای مختلف باید بررسی شود تا مقاومت معادل بیش از حد پایین نیاید.
۷. نمونههای عملی برای انتخاب رابط
برای ملموسترشدن تفاوتها، چند سناریوی رایج را در نظر بگیریم.
| کاربرد | انتخاب اولیه پیشنهادی | دلیل |
|---|---|---|
| سنسور دمای دیجیتال با نرخ بهروزرسانی پایین | I2C، در صورت پشتیبانی سنسور | تعداد سیم کمتر و پهنای باند کافی |
| ماژول RTC | I2C، در صورت پشتیبانی ماژول | انتقال داده محدود و سیمکشی ساده |
| نمایشگر گرافیکی با بهروزرسانی سریع | SPI، در صورت پشتیبانی نمایشگر | امکان نرخ انتقال بالاتر |
| حافظه جانبی Flash با رابط SPI | SPI | انطباق مستقیم با رابط قطعه |
| توسعهدهنده GPIO با رابط I2C | I2C | کاهش تعداد پایههای مصرفی میکروکنترلر |
| مبدل ADC با رابط SPI و نرخ داده بالا | SPI | امکان انتقال سریع داده مطابق مشخصات مبدل |
این جدول یک راهنمای اولیه است، نه یک قانون همیشگی. بعضی سنسورها، نمایشگرها و حافظهها فقط یکی از این رابطها را دارند و در چنین مواردی، انتخاب به مشخصات قطعه محدود میشود.
۸. استفاده از I2C و SPI در Arduino و Raspberry Pi Pico
در بسیاری از محیطهای توسعه، کتابخانههای استاندارد برای راهاندازی این رابطها وجود دارند. در Arduino، کتابخانه Wire برای ارتباط I2C و کتابخانه SPI برای ارتباط SPI به کار میروند. برای نمونه، تابع Wire.begin() باس I2C را راهاندازی میکند و میتواند کنترلکننده را بدون تعیین آدرس، در نقش کنترلکننده باس قرار دهد.
در Raspberry Pi Pico مبتنی بر RP2040، دو کنترلکننده سختافزاری I2C و دو کنترلکننده سختافزاری SPI وجود دارد. این قابلیتها به طراح اجازه میدهند با توجه به تخصیص پایهها و نیاز پروژه، از رابطهای سختافزاری استفاده کند. البته پایههای فیزیکی باید بر اساس نقشه پایهها و تنظیمات مالتیپلکس GPIO انتخاب شوند.
در ESP32 نیز امکانات رابطها و پایههای قابلاستفاده به مدل دقیق تراشه و برد بستگی دارد. بنابراین، پیش از انتخاب پایهها یا کدنویسی نهایی، مستندات همان مدل را بررسی کنید.
نکته مهم این است که استفاده از کتابخانه، محدودیتهای الکتریکی یا زمانی سختافزار را برطرف نمیکند. حتی اگر برنامه بدون خطا کامپایل شود، سیمکشی نادرست، ولتاژ نامناسب یا تنظیمات اشتباه رابط میتواند مانع ارتباط صحیح شود.
۹. روش عیبیابی ارتباط I2C و SPI
اگر ارتباط برقرار نمیشود، بهتر است بهجای تغییر تصادفی کد، عیبیابی را مرحلهبهمرحله انجام دهید.
عیبیابی I2C
1. تغذیه و اتصال زمین مشترک را بررسی کنید.
2. اتصال صحیح SDA و SCL را طبق نقشه پایهها بررسی کنید.
3. وجود مقاومتهای Pull-up مناسب را کنترل کنید.
4. آدرس قطعه را با مستندات آن تطبیق دهید و در صورت نیاز از اسکنر I2C استفاده کنید.
5. اگر دستگاه شناسایی نمیشود، سطح ولتاژ خطوط، زمان بالا رفتن سیگنال و سازگاری سرعت باس را بررسی کنید.
6. در صورت وجود چند دستگاه، قطعات را یکییکی جدا کنید تا مشخص شود مشکل از کدام بخش است.
عیبیابی SPI
1. اتصال زمین مشترک و تغذیه قطعه را بررسی کنید.
2. پایههای SCLK، MOSI، MISO و CS را با دیتاشیت قطعه تطبیق دهید.
3. وضعیت فعالبودن CS و قطبیت آن را بررسی کنید.
4. حالت CPOL و CPHA را مطابق نیاز قطعه تنظیم کنید.
5. برای آزمایش اولیه، سرعت کلاک را کاهش دهید.
6. اگر مشکل ادامه دارد، سیگنالها را با اسیلوسکوپ یا تحلیلگر منطقی بررسی کنید و زمانبندی داده را با مشخصات قطعه مقایسه کنید.
در هر دو رابط، بررسی سیگنال واقعی میتواند خطاهایی را آشکار کند که صرفاً از روی کد قابل تشخیص نیستند.
جمعبندی
I2C و SPI هر دو رابطهای مهمی برای اتصال تجهیزات جانبی به میکروکنترلرها هستند، اما برای نیازهای یکسان طراحی نشدهاند.
I2C معمولاً برای اتصال چند قطعه با تعداد سیم کمتر و نرخ انتقال متوسط مناسب است. SPI نیز در بسیاری از کاربردهایی که به انتقال سریع داده، تبادل همزمان یا ارتباط مستقیم با قطعات مجهز به این رابط نیاز دارند، گزینه بهتری محسوب میشود.
پیش از انتخاب نهایی، این موارد را بررسی کنید:
-
نرخ انتقال داده موردنیاز پروژه
-
تعداد پایههای آزاد میکروکنترلر
-
پشتیبانی قطعه جانبی از رابط موردنظر
-
سازگاری ولتاژهای منطقی
-
محدودیتهای طول مسیر، نویز و ظرفیت باس
-
تنظیمات زمانی و سرعت مجاز در دیتاشیت
قاعده عملی این است که ابتدا رابط پشتیبانیشده توسط قطعه جانبی را بررسی کنید، سپس بر اساس سرعت، تعداد پایهها و شرایط الکتریکی مدار تصمیم بگیرید. این روش از انتخاب رابط صرفاً بر اساس سریعتر یا سادهتر بودن آن جلوگیری میکند.
منابع فنی
1. NXP Semiconductors — I²C-bus specification and user manual
2. Analog Devices — SPI/I²C Bus Lines Control Multiple Peripherals



