سلام خدمت همه عزیزان. در مطالب قبلی به بررسی و معرفی بستر ارتباطی RS232 پرداخته شد و توضیحاتی ذکر گردید. در این مطلب به بررسی و معرفی باس ارتباطی و پروتکل I2C پرداخته خواهد شد. پس با من تا انتهای مطلب همراه باشید. همچنین شما میتونید سایر مطالب من رو از این لینک مطالعه و بررسی کنید.
مقدمه ای در باره I2C
در بحث RS232 به مزایا و معایب پروتکل سریال و موازی پرداخته شد. با توجه به اینکه این پروتکل برای ارتباط device to device تا حدود 15متر با چندین خط در نظر گرفته شده بود که در برخی ارتباطات این امکانات ضرورتی نداشت و درصورت تطبیق سطوح ولتاژی میتوانستیم از USART/UART استفاده کنیم اما همچنان قابلیت هایی مانند multi masters/slaves در آن ممکن نبود.
باس یا رابط سریال I2C اولین بار توسط شرکت فیلیپس درسال 1982 طراحی شد. این واسط از طریق دو سیم با نام های SDA و SCL که یکی برای انتقال اطلاعات و دیگری برای انتقال کلاک (پالس ساعت) میباشد تشکل شده است.
ویژگی های ارتباط سریال 2 سیمه یا I2C
- رابطی انعطاف پذیر و بسیار ساده اما درعین حال قدرتمند که فقط نیاز به دو خط انتقال دارد.
- قابلیت پشتیبانی از مد های master و slave در حالت های فرستنده و گیرنده در I2C.
- فضای آدرس هفت بیتی یا ده بیتی
- دارای قابلیت multi masters
- سرعت انتقال اطلاعات متفاوت برای سازگاری با پریفرال های مختلف.
- دارای قابلیت boardcast (فراخوانی عمومی)
- در برخی میکروکنترلر ها قابلیت بیدار شدن از مد sleep با تشخیص آدرس خود
در تاریخ 2021 داکیومنت مربوطه بروزرسانی شده و ورژن 7 آن منتشر گردید که مبنای این مطلب و توضیحات مربوط به I2C در آن، بر اساس آخرین نسخه میباشد. ارتباط سریال دو سیمه I2C شاید به بیش از 1000 نوع مختلف در 50 کمپانی پیاده سازی شده که معماری اصلی پروتکل هایی نظیر PMBUS ،SMBUS ،IPMI ،DDC ،ATCA نیز میباشد.
شایان ذکر است که I2C با I3C که در سال 2017 توسط NXP و MIPI معرفی شده نیز سازگار است. از این رو میتوان گفت که با یک باس و ارتباط قدرتمندی روبه رو هستیم.
نحوه اتصال پریفرال ها در ارتباط سریال دو سیمه I2C
آنچه که تعداد پریفرال ها را در ارتباط سریال دو سیمه I2C محدود میکند، ظرفیت خازنی خط و نیز تعداد بیت آدرس دهی (7بیتی یا 10 بیتی) میباشد که میتوان حداکثر طول 2 الی 3متری را برای آن متصور شد. سرعت ارتباط نیز مطابق جدول زیر است.
به دلیل طراحی open drain یا open collector بودن باس I2C نیاز داریم که آن را توسط مقاومتی pull up کنیم. همچنین به دلیل قابلیت wired-and ما مشکلی بابت اتصال چندین master /slave نخواهیم داشت. البته این ویژگی ها به ما این قابلیت را میدهد تا حدودی بتوان بدون تغییر سطوح ولتاژ، پریفرال های متفاوت باهم ارتباط برقرار نمایند. مانند پریفرالی که با ولتاژ 5 ولت و میکروکنترلری که با 3.3 ولت کار میکند.
اعتبار داده ها
هر بایت داده بر روی خط SDA باید 8 بیت طول داشته باشد. همچنین هیچ محدودیتی در مورد تعداد بایت های ارسالی توسط یک فرستنده برروی SDA وجود ندارد. باید توجه داشت که خط SDA نباید هنگامی که clock در سطح high است تغییر کند (شکل زیر). مگر در دو حالت start و stop condition.
تعریف Start & Stop Condition
همواره انتقال داده ها با Start آغاز شده و به stop ختم خواهند شد. زمانیکه SCL یا همان کلاک در ارتباط I2C در حالت high قرار دارد اگر SDA از high به low تغییر وضعیت دهد start تلقی خواهد شد. بنابر تعریف ذکر شده نیز درصورتی که SCL در وضعیت high قرار داشته باشد، اگر SDA از low به high تغییر وضعیت دهد stop تفسیر میگردد.
تعریف Acknowledge (ACK) & Not Acknowledge (NACK)
بعد از هر بایت ارسال شده جهت تعیین اینکه این بایت توسط گیرنده پذیرش شده است یا نه، یک بیت دیگر در پالس بعدی ارسال میشود. که به N/ACK معروف است که عملکرد آن بصورت زیر است.
- فرستنده خط SDA را آزاد میکند تا در پالس نهم، گیرنده با قرار دادن و نگاه داشتن خط بصورت low در زمانیکه که کلاک به high میرود (مانند start condition) به معنای ACK تفسیر گردد.
- درصورتی که در پالس نهم خط SDA در مقدار high قرار بگیرد به معنای NACK است.
پنج حالت ممکن برای رخ دادن NACK
- هیچ گیرنده ای در باس با آدرس ارسالی برای پاسخگویی و تایید وجود ندارد.
- گیرنده قادر به دریافت یا ارسال نیست زیرا برخی عملکرد های real time را انجام میدهد و آماده شروع ارتباط با کنترلر نیست.
- درحین انتقال، گیرنده داده یا دستوراتی را دریافت میکند که متوجه نمیشود.
- درحین انتقال، گیرنده نمیتواند بایت داده بیشتری دریافت کند.
- ارتباط ناقص صورت میگیرد و پایان انتقال مشخص نیست.
مسئله Arbitration یا Clock stretching زمانیکه چندین master وجود داشته باشد مطرح میشود در آینده به آن خواهیم پرداخت. همچنین از نسخه 3 به بعد مکانیزم device id نیز اضافه شده است که 3 بایت (غیر قابل تغییر) بصورت زیر است.
- 12 بیت: بیت های مرتبط با نام سازنده قرار دارد مانند NXP
- 9 بیت مربوط به شناسایی ایسی میباشد مانند PCA9698
- 3 بیت بعدی مربوط به ورژن میباشد مانند RevX
اجازه بدهید نگاه عمیق تری به بیت های مربتط با چندین کمپانی سازنده داشته باشیم:
بی شک پارامترهای دیگری که شاید هنگام استفاده از میکروکنترلر مشهود نباشد. اما در FPGA و کاربرد های متنوع حائز اهمیت هستند که صرفا به ارائه این مشخصات برای سه مد Fast ،Standard و Fast-mode Plus در جدول زیر آمده است و به آن بسنده میکنیم.
- جداول زیر برای مد High Speed میباشد.
همانطور که در بالا اشاره شد این جداول هنگامی اهمیت می یابد که شما بخواهید این پروتکل و باس را در FPGA یا کاملا نرم افزاری پیاده سازی کنید.
جمع بندی
در این مطلب به معرفی و بررسی ارتباط سریال دو سیمه I2C پرداخته شد و نکات ابتدایی و اصول آن ذکر گردید. در مطالب بعدی به موارد باقی مانده و نحوه ارتباط با ایسی AT24Cxx که یک حافظه EEPROM میباشد پرداخته خواهد شد.
امیدوارم از این مطلب کمال بهره را برده باشید. در صورت داشتن هرگونه نظر یا سوال درباره این مطلب یا تجربه مشابه اون رو در انتهای همین صفحه در قسمت دیدگاه ها قرار بدید. در کوتاه ترین زمان ممکن به اون ها پاسخ خواهم داد. اگر این مطلب براتون مفید بود، اون رو به اشتراک بگذارید تا سایر دوستان هم بتوانند استفاده کنند. همینطور میتونید این مطلب را توی اینستاگرام با هشتگ microelecom# به اشتراک بگذارید و پیج مایکروالکام (microelecom@) رو هم منشن کنید.