I2C چیست؟

به صورت خلاصه I2C یک درگاه ارتباط سنکرون است که با استفاده از دو سیم میتواند شبکهای از سختافزارها را به هم متصل کند. اما برای آنکه بدانید دقیقا I2C چیست، چگونه عمل میکند، مزایا و معایب I2C چیست و کاربرد آن در کجاست پیشنهاد میکنیم مقاله زیر را مطالعه کنید.
I2C چیست؟
I2C مخفف عبارت Inter Integrated Circuit بوده و یک درگاه ارتباط سریال سنکرون و half-duplex است که تنها با استفاده از دوسیم میتواند بین شبکهای از سختافزارها ارتباط برقرار کند. I2C در سال 1982 توسط شرکت philips معرفی شد و در سالهای بعد مورد استقبال عمومی از سوی دیگر شرکتهای فعال در حوزه سختافزار قرار گرفت.
اگر در مورد مفاهیم ارتباط سریال، سنکرون بودن و half duplex اطلاعات کافی ندارید میتوانید به توضیحات آنها در مقاله UART چیست مراجعه کنید.
سخت افزار I2C
برای آنکه بدانید I2C چیست و چگونه عمل میکند ابتدا باید از دید سختافزاری نگاهی به آن بیندازیم. I2C برای تبادل اطلاعات تنها به دو پایه نیاز دارد. SDA برای داده و SCA برای کلاک. از آنجا که فقط یک مسیر برای داده وجود دارد و ارسال و دریافت روی همین یک پایه انجام میشود I2C نمیتواند ارسال و دریافت همزمان داشته باشد و بنابراین ارتباط آن از نوع half duplex خواهد بود.
درایو خط کلاک و داده در I2C به صورت open drain (یا open collector) است. این بدان معنی است که ایجاد حالت low توسط اتصال مستقیم به GND ایجاد میشود و ایجاد حالت high با شناور کردن پایه اتفاق میافتد. برای آنکه حالت شناور پایه یک سطح از ولتاژ را داشته باشد باید با یک مقاومت Pull Up آن را به یک ولتاژ مثبت متصل کرد. این مقدار معمولا 3.3v یا 5v است اما میتوان مقادیر دیگری هم انتخاب کرد که به ندرت اتفاق میافتد.

I2C قابلیت باس دارد و میتوان چندین سختافزار را روی یک باس به یکدیگر متصل کرد. هر سختافزار موجود روی این باس را اصطلاحا node مینامند. nodeی که سیگنال کلاک را ایجاد میکند و شروع کننده ارتباط است master نامیده میشود و نودهایی که سیگنال کلاک را دریافت میکنند و به درخواستهی master پاسخ میدهند slave نام دارند. هرچند ارتباط I2C دوسیمه است اما فراموش نکنید چون مسیر از نوع single ended است nodeها باید همگراند باشند و در غیر این صورت نمیتوانند سطح ولتاژ روی bus را تشخیص دهند.

چون باس به صورت open drain درایو میشود سطح منطقی low قدرت زیادی دارد (چون اتصال مستقیم به GND دارد) و سطح منطقی high ضعیف است (چون اتصال آن به VCC از طریق مقاومت است). اگر یک نود حالت low را روی باس ایجاد کند (SDA یا SCK) باس در حالت low قرار میگیرد حتی اگر باقی nodeها سطح high را قرار داده باشند و باس تنها زمانی مقدار high خواهد داشت که همه nodeها حالت high را ایجاد کرده باشند. از آنجا که این رفتار همان رفتار and منطقی است این حالت را wire-and گویند.
نحوه انتخاب یک slave بر روی باس بر اساس آدرس است. هر slave در باس آدرس منحصر به فردی دارد که درون آن ذخیره شده است. این آدرس 7 بیتی است و بنابراین 128 حالت مختلف خواهد داشت.(حالت 10 بیتی از آدرس دهی هم وجود دارد اما معمول نیست و در این نوشته در مورد آن بحث نمیکنیم) آدرس 0 برای اعلان همگانی استفاده میشود و به slave خاصی تعلق ندارد. در نتیجه از نظر فضای آدرس میتوان 127 عدد Slave روی یک باس قرار دارد.
یکی از مشکلاتی که در ایجاد یک باس I2C ممکن است با آن برخورد کنید تشابه آدرسها است. هرچند سازندههای مختلف سعی میکنند دارای آدرسی متفاوت باشند اما قطعات ساخته شده توسط یک سازنده دارای یک آدرس است. سازندگان برای حل این مشکل راه حل های متفاوتی ارائه میدهند. معمولترین این راه حل ها به صورت زیر است:
- با استفاده از یک یا چند پایه روی چیپ قابلیت انتخاب بین دو یا چند آدرس را به کاربر میدهند. به عنوان مثال فرض کنید یک پایه با عنوان Address Select وجود دارد که اگر به GND متصل باشد آدرس 75 خواهد بود و گر به VDD متصل شود آدرس 76 خواهد شد.
- قابلیت تعریف آدرس جدید و ذخیره آن در رجیسترهای درونی را در اختیار کاربر قرار میدهند.
- پارتهای با پسوندهای مختلف ایجاد میکنند که تنها تفاوت آنها در آدرسشان است. به عنوان مثال فرض کنید آیسی با پارت نامبر xxyy در کارخانه به صورت xxyyA و xxyyB تولید میشود که xxyyA دارای آدرس 50 و xxyyB دارای آدرس 60 است.
محدودیت دیگری که تعداد nodeهای باس را تحت تاثیر قرار میدهد خاصیت خازنی باس است. هر node دارای مقدار مشخصی خاصیت خازنی است و خاصیت خازنی کل باس مجموع خاصیت خازنی همه nodeها است. این عدد باید کمتر از 400pF برای کل باس باشد.
یک باس I2C میتواند شامل چند master باشد اما در هرلحظه از زمان فقط یک master اجازه ارسال داده و کلاک روی باس را دارد.

اصطلاحات I2C
برای درک نحوه کار I2C ابتدا باید بدانید با اصطلاحات رایج در I2C آشنا شوید و بدانید مفهوم هر یک از این اصطلاحات در بحث I2C چیست. در ادامه مروری بر این اصطلاحات داریم.
Master
nodی در باس I2C که تولید کننده سیگنال کلاک و شروع کننده و پایان دهنده یک ارتباط است.
Slave
nodی در باس I2C که دریافت کننده سیگنال کلاک و پاسخ دهنده به درخواستهای master است.
فرستنده (Transmitter)
nodی است که در حال ارسال اطلاعات است. این nod میتواند master یا slave باشد.
گیرنده (Receiver)
nodی است که در حال دریافت اطلاعات است. این nod میتواند master یا slave باشد.
انتقال داده (Data Transfer)
در زمان انتقال اطلاعات به ازای هر سیکل کلاک، فرستنده یک بیت داده را روی خط SDA قرار میدهد. قرار دادن یک بیت داده به معنی high یا low کردن پایه SDA است. این عملیات زمانی مجاز است که کلاک در حالت low از سیکل خود قرار داشته باشد. در هر انتقال 8 بیت داده ارسال میشود.

حالت شروع (Start)
یک لبه پایین رونده روی پایه SDA در زمانی که کلاک در حالت high از سیکل خود قرار گرفته است به عنوان حالت شروع شناخته میشود. این حالت، آغاز کننده یک ارتباط است.

حالت توقف(Stop)
یک لبه بالارونده روی پایه SDA در زمانی که کلاک در حالت high از سیکل خود قرار گرفته است به عنوان حالت توقف شناخته میشود. این حالت پایان دهنده یک ارتباط است.

Acknowledge (یا به اختصار ACK)
به معنای low کردن SDA پس از هر انتقال داده توسط گیرنده است. با این عمل فرستنده از رسیدن دادهها به گیرنده اطمینان حاصل میکند.
مراحل کار I2C چیست
برای شروع یک ارتباط مراحل زیر به ترتیب اجرا میشوند. دقت داشته باشید در I2C آدرس و دادهها به صورت MSB first ارسال میشوند.
- 1 – master از طریق مانیتور کردن پایه SDA چک میکند که باس آزاد است یا آنکه تبادل دادهای در حال انجام است. این کار به این علت صورت میگیرد که ممکن است master دیگری نیز روی باس باشد و باس را در اختیار گرفته باشد. اگر باس مشغول باشد master باید صبر کند تا باس آزاد شود.
- 2 – master یک حالت شروع، روی باس ایجاد میکند.
- 3 – بلافاصله پس از ایجاد حالت شروع، master یک فریم 8 بیتی روی باس قرار میدهد که 7 بیت ابتدایی آدرس slave مورد نظر است و بیت هشتم مشخص کننده این است که master قصد خواندن دارد یا نوشتن. اگر این بیت 1 باشد به معنی قصد خواندن و اگر 0 باشد به معنی قصد نوشتن است.
- 4 – پس از این 8 بیت master پایه SDA را در حالت high قرار میدهد و وضعیت آن را مانیتور میکند. اگر این پین low شود به معنای ACK است. یعنی یک slave با آدرس ارسالی مطابقت داشته و آن slave خط SDA را در حالت low قرار داده است. اگر همچنان high بماند به معنای NACK است یعنی این که یا slaveی با این آدرس وجود ندارد و یا اینکه آن slave مشغول انجام کاری با اولویت بالاتر است.
- 5 – پس از دریافت ACK در master، اگر قصد نوشتن باشد به تعداد بایت مورد نیاز داده و کلاک در باس توسط master قرار داده میشود. به ازای هر بایت داده یک بیت ACK نیز باید وجود داشته باشد که مجموعا 9 بیت برای انتقال یک بایت باید مصرف شود. اگر قصد خواندن باشد master فقط کلاک را ایجاد خواهد کرد و به ازای هر 8 بیت که میخواند باید یک بیت ACK روی باس ایجاد کند.
- 6 – پس از آنکه به تعداد بایت مورد نظر master داده انتقال داده شد master یک حالت Stop روی باس ایجاد میکند.
با فرض یک بایت انتقال داده، بلوک دیاگرام فرایند ذکر شده در مراحل فوق به صورت زیر است

همچنین از نظر سیگنالی میتوان شکل زیر را متصور شد

نکتهای که باید به آن توجه داشت این است که به صورت معمول هر slave خود دارای رجیسترهایی است که آدرس مخصوص به خود را در درون آن slave دارند و برای تبادل داده با آنها باید مراحل بیشتری طی شود. در ادامه به این مورد میپردازیم.
مراحل نوشتن درون یک رجیستر از slave
برای نوشتن درون رجیستر یک slave باید مراحل زیر به ترتیب طی شود
- 1 – master آزاد بودن باس را چک میکند.
- 2 – در صورت آزاد بودن باس یک حالت شروع، توسط master ایجاد میشود.
- 3 – 8 بیت شامل 7 بیت آدرس slave مورد نظر و 1 بیت با مقدار 0، به معنای تقاضای write توسط master ارسال میشود.
- 4 – SDA توسط master در حالت high قرار میگیرد و master منتظر ACK از طرف slave میماند. (low شدن SDA توسط slave)
- 5 – master پس از دریافت ACK اقدام به قرار دادن آدرس رجیستر مورد نظر روی باس مینماید و منتظر ACK میماند.
- 6 – master پس از دریافت ACK، به تعداد بایتهای مورد نظر داده روی باس قرار میدهد.
- 7 – پس از انتقال تمام دادهها توسط master یک حالت توقف، روی باس ایجاد میشود.

مراحل خواندن یک رجیستر از slave
مراحل خواندن از یک رجیستر درون slave اندکی متفاوت مراحل نوشتن درون است. در این حالت ابتدا باید آدرس رجیستر مورد نظر به slave ارسال شود و سپس بدن ایجاد حالت توقف، یک حالت شروع دیگر اینبار با تقاضای خواندن از آدرس همان slave ایجاد شود. این مراحل به ترتیب زیر انجام میشوند
- 1 – master آزاد بودن باس را چک میکند.
- 2 – در صورت آزاد بودن باس یک حالت شروع، توسط master ایجاد میشود.
- 3 – 8 بیت شامل 7 بیت آدرس slave مورد نظر و 1 بیت با مقدار 0، به معنای تقاضای write توسط master ارسال میشود.
- 4 – SDA توسط master در حالت high قرار میگیرد و master منتظر ACK از طرف Slave میماند. (low شدن SDA توسط slave)
- 5 – master پس از دریافت ACK اقدام به قرار دادن آدرس رجیستر مورد نظر روی باس مینماید و منتظر ACK میماند.
- 6 – master پس از دریافت ACK، یک حالت شروع ایجاد میکند.
- 7 – master مجددا 8 بیت داده روی باس قرار میدهد که 7 بیت آن آدرس Slave مورد نظر است اما بیت هشتم مقدار 1 به معنای قصد خواندن است.
- 8 – master به تعدا بایت مورد نظر کلاک روی خط SCL ایجاد میکند و پس از خواندن هر بایت داده، ACK را برای slave میفرستد.
- 9 – پس از خواندن آخرین بایت، master حالت NACK را روی باس ایجاد کرده و با یک حالت توقف به ارتباط خاتمه میدهد.

در زبانهای برنامه نویسی سطح بالا کتابخانههای قدرتمندی برای کار با I2C قرار دارد و شما در اکثر مواقع با تمام جزئیات مراحل فوق درگیر نخواهید شد. مطالعه مراحل فوق به شما دید خواهد داد اما آنچه باید به خاطر بسپارید این است که:
- برای نوشتن درون رجیستر یک slave، ابتدا باید طی یک ارتباط نوشتنی آدرس رجیستر مورد نظر را درون آن بنویسید و سپس در ادامه همان ارتباط، دادهها را بنویسید.
- برای خواندن از رجیستر یک slave، ابتدا باید طی یک ارتباط نوشتنی، آدرس رجیستر مورد نظر را درون آن بنویسید و سپس طی یک ارتباط خواندنی دادههای مورد نظر را بخوانید.
مدهای I2C چیست
از زمان معرفی I2C توسط شرکت Philips در سال 1982 تا کنون تغییراتی در آن به وجود آمده است تا بتوان سرعت آن را افزایش داد. هر یک از سرعتها به نام mode شناخته میشوند. جدول modeهای I2C که در ادامه آورده شده است مشخص میکند تفاوت مدهای مختلف I2C چیست.

استفاده از مدهای Standard mode، Fast Mode و Fast Mode Plus رایجتر از دیگر مدها است.
مزایا و معایب I2C چیست
مزایا
- تنها نیازمند دو سیم برای ارتباط
- هزینه ساخت پایین
- ناچیز بودن سختافزار خارجی مورد نیاز (دو عدد مقاومت)
- مکانیزم ACK برای تشخیص رسیدن دادهها
- پشتیبانی از Multi slave
- پشتیبانی از Multi master
- پشتیبانی از 127عدد slave روی یک باس
- قابلیت اضافه یا کم کردن slaveهای روی باس بدون ایجاد اختلال در کارکرد
- ولتاژ باس قابل انتخاب به علت استفاده از درایور open drain
معایب
- نرخ انتقال داده پایین
- قابل استفاده در مسافتهای کوتاه
- عدم پشتیبانی از Full duplex
- نداشتن مکانیزم تشخیص خطا
کاربردهای I2C کجاست
- درگاه داده در EEPROMها
- استفاده در سیستمهای کامپیوتری به فرمت SMBUS
- درگاه داده در چیپهای RTC
- درگاه داده درADCها و DACهای سرعت پایین
- درگاه تنظیمات در LCDها
- درگاه تنظیمات صدا در سیستمهای صوتی هوشمند
- درگاه داده در LCDها و OLEDهای کوچک
- درگاه داده در سنسورهای با نرخ داده پایین (مانند Compass، دما، Gyro، شتاب، فشار، رطوبت و …)
در انتها
در این مقاله سعی کردیم در مورد این موضوع که I2C چیست، چگونه عمل میکند، مزایا و معایب I2C چیست و کاربردهای آن کجاست اطلاعات کاربردی و مفیدی را در اختیار شما قرار دهیم. برای مطالعه عمیقتر میتوانید به رفرنسهایی مانند I2C-wikipedia مراجعه کنید. همچنین از شما دعوت میکنیم نظرات خود در مورد این مقاله و همچنین تجربیات ارزشمندتان در مورد I2C را در بخش نظرات این نوشته با ما و دیگر دوستانتان به اشتراک بگذارید.
دیدگاهتان را بنویسید