ارتباط به طریق پروتکل I2C فقط به دو سیم نیاز دارد. اما این دو سیم در بهترین حالت توانایی آدرس دهی 1024 وسیله را دارند. این پروتکل برعکس SPI می تواند چند master داشته باشد. اما اآنها قادر به صحبت با یکدیگر نیستند و از یک باس برای ارتباط با slave ها استفاده می کنند. وسایل متصل به I2C میتوانند با فرکانس 100kHz تا 400kHz با هم ارتباط برقرار کنند که کمتر از سریال آسنکرون و SPI است. در این پروتکل بعد از ارسال هر 8 بیت داده یک بیت فراداده ACK یا NACK نیز فرستاده می شود. سخت افزار مورد نیاز برای استفاده از I2C پیچیده تر از SPI ولی ساده تر از سریال آسنکرون است و به لحاظ نرم افزاری به سادگی قابل اجرا است.

سیگنالها و سخت افزار

هر باس I2C از دو سیگنال تشکیل شده است: SCL که کلاک سیگنال است و SDA که داده سیگنال است. کلاک توسط master تولید می شود. برعکس آسنکرون و SPI درایورهای باس در I2C از نوع Open Drain هستند. یعنی می توانند خط سیگنال را low کنند اما توانایی high کردن آن را ندارند. بنابراین امکان آسیب دیدن درایور وسایل زمانی که یکی بخواهد سیگنال را high و دیگری بخواهد آن را low کند وجود ندارد و اتلاف توان هم کاهش می یابد. هر سیگنال با مقاومت پول آپ شده است تا در صورتی که هیچ وسیله ای نخواهد آن را low کند ، خود به خود high شود.

مقاومتهای پول آپ معمولا 4.7k هستد و در صورت نیاز کاهش می یابند. این پروتکل در فواصل کوتاه 2 تا 3 متری قابل استفاده است اما برای فواصل زیاد و یا سیستمی با تعداد زیادی وسیله مرتبط به باس، باید مقدار پول آپ را کاهش داد.

سطح ولتاژ سیگنالها

با توجه به اینکه درایورها سیگنال را high نمی کنند امکان اتصال وسایل با سطح ولتاژ ورودی و خروجی متفاوت وجود دارد. مثلا اگر ولتاژ تغذیه دو وسیله با هم تفاوت داشته باشند مقاومت پول آپ را به ولتاژ تغذیه پایین تر وصل می کنیم. البته این کار تنها زمانی مقدور است که این ولتاژ به اندازه کافی برای high کردن ورودی دستگاه دیگر بالا باشد. در غیر این صورت حتما باید از یک مدار یا قطعه تغییر سطح یا level shifter استفاده نمود.

پروتکل

پیام از دو قاب تشکیل می شود: قاب آدرس که master در آن مشخص می کند که پیام به کدام slave ارسال می شود و قاب ( یا قابهای ) داده که به صورت 8 بیتی تبادل می شوند. وقتی که SCL پایین می شود داده روی SDA قرار می گیرد و پس از بالا شدن SCL نمونه برداری می شود. زمان بین لبه کلاک و نوشتن یا خواندن داده تسط دستگاههای روی باس تعیین می شود و بسته به چیپ ها تغییر می کند.

شرایط شروع

برای آغاز یک قاب آدرس دستگاه master پایه SCL را بالا و SDA را پایین نگه می دارد. این باعث می شود همه slave ها متوجه شوند که قرار است یک داده تبادل شود. اگر دو تا master به طور همزمان بخواهند کنترل باس را در اختیار بگیرند دستگاهی که زودتر SDA را پایین نگه دارد کنترل باس را در اختیار می گیرد.

قاب آدرس

برای یک آدرس 7 بیتی ابتدا پرارزشترین بیت ارسال می شود و سپس بیت خواندن و نوشتن ارسال می شود که مشخص می کند قرار است داده خوانده یا نوشته شود ، 0 به معنای نوشتن و 1 به معنای خواندن است. بیت نهم این قاب بیت ACK و یا NACK است. وقتی هر هشت بیت قاب فرستاده شدند، دستگاه گیرنده کنترل SDA را به عهده می گیرد. اگر گیرنده پیش از نهمین پالس کلاک خط SDA را پایین نکشد به این معنی است که گیرنده داده را دریافت نکرده یا نمی داند چگونه آن را تجزیه و تحلیل کند. در این صورت فرایند متوقف می شود و بر عهده master است که در این باره تصمیم گیری کند.

قاب های داده

وقتی قاب آدرس فرستاده شد، ارسال داده می تواند اغاز شود. Master پالسهای کلاک را با فواصل زمانی مشخص تولید می کند و داده با توجه به وضعیت بیت R/W توسط master و یا slave روی خط SDA قرار می گیرد. تعداد قاب های داده دلخواه است و رجیستر داخلی بیشتر دستگاه های slave به طور خودکار افزایش می یابد.

شرایط توقف

وقتی همه قاب های داده فرستاده شدند، master شرایط توقف را تولید می کند. به این طریق که ابتدا SCL از 0 به 1 می رود و در همین وضعیت می ماند و SDA نیز از 0 به 1 می رود.