پروتکل I2C (مخفف Inter-Integrated Circuit) یا پروتکل باس I2C یک پروتکل ارتباطی Master/Slaveی دو سیمۀ پر استفاده است. این پروتکل ارتباطی در سال 1982 توسط شرکت Philips Semiconductor (نام امروزی: NXP Semiconductor) ابداع شده است. از ویژگی های این پروتکل می توان به سنکرون بودن، قابلیت اتصال چند Slave، قابلیت Multi-Master و … اشاره کرد. این ویژگی ها سبب شده که این پروتکل از پر استفاده ترین پروتکل ها برای برقراری ارتباط بین المان های دیجیتال مثل میکروکنترلرها با یکدیگر و ارتباط آنها با انواع آی سی ها، حافظه ها، ماژول های فرستنده و گیرنده، سنسورها، نمایشگرها و … در فواصل نزدیک شود. از اواسط دهۀ 1990، چند شرکت از جمله Siemens و NEC و TI و STMicroelectronics و Motorola و Nordic Semiconductor و Intersil، محصولات سازگار با پروتکل I2C را به بازار معرفی کرده اند. باس I2C به عنوان یک پروتکل ارتباطی در چندین معماری استفاده می شود. CBUS و SMBus و PMBus و IPMI و ATCA و DDC از این جمله اند. پروتکل I2C را هم به شکل I2C می نویسند و I-squared-C تلفظ می کنند، هم IIC می نویسند و I-I-C تلفظ می کنند. همچنین برای راحتی آن را I2C می نویسند و I-two-C تلفظ می کنند. در این نوشته به معرفی I2C، عملکرد I2C، ویژگی ها و مشخصات و نحوۀ انتقال داده در آن و فرمت فریم I2C می پردازیم. در مدهای مختلف I2C شرایطی وجود دارد که خارج از حوصلۀ این نوشته است. بنابراین در این نوشته به طور کلی دربارۀ پروتکل I2C و مشخصات آن بحث می شود. برای مطالعۀ بیشتر به دیتاشیت قطعات و همچنین اسناد شرکت NXP Semiconductor مراجعه نمایید.
فیلم آموزش میکروکنترلرهای AVR مقدماتی
تصویر 1 – لوگوی باس I2C
تاریخچه پروتکل I2C
باس I2C در اوایل دهۀ 1980 توسط Philips Semiconductor ساخته شد. هدف اصلی آن تهیۀ روشی آسان برای اتصال CPU به تراشه های وسایل جانبی در یک تلویزیون بود. برای حل مشکلات ارتباط موازی، تحقیقاتی در آزمایشگاه های Philips در Eindhoven هلند انجام شد. نتیجۀ این تحقیقات، در نهایت پروتکل I2C بود. نام این باس، Inter-IC، توضیح دهندۀ هدف آن یعنی ایجاد لینک ارتباطی بین مدارهای مجتمع (IC) است.
- در سال 1982 سیستم I2C اصلی با نرخ 100 کیلو بیت بر ثانیه به عنوان یک سیستم سادۀ باس داخلی ایجاد شد. این سیستم برای ساخت وسایل الکترونیکی کنترل با تراشه های مختلف Philips، ایجاد شد.
- در سال 1992 نسخۀ اول ساخته و نرخ 400 کیلو بیت بر ثانیه (مد Fast یا Fm) و آدرس دهی 10 بیتی به آن اضافه شد. این نسخه از پروتکل I2C، اولین نسخۀ استاندارد بود.
- در سال 1998 نسخۀ دوم ساخته و نرخ تبادل 3.4 مگا بیت بر ثانیه (مد High-Speed یا Hs) و صرفه جویی انرژی برای ولتاژ و جریان الکتریکی اضافه شد.
- در سال 2000 نسخۀ 2.1 ارائه شد.
- در سال 2007 نسخۀ 3 ساخته شد. در این نسخه نرخ دادۀ 1 مگا بیت بر ثانیه (Fm+) با درایورهای 20 میلی آمپری و مکانیزم ID اضافه شد.
- در سال 2012 در نسخۀ 4، نرخ 5 مگابیت بر ثانیه (مد Ultra-fast یا UFm) برای خطوط داده و کلاک USDA و USCL با استفاده از منطق پوش پول بدون مقاومت های پول آپ اضافه شد. همچنین یک جدول ID سازنده، به این نسخه اضافه گردید. این باس یک طرفه است.
- در سال 2012 نسخۀ 5 ارائه شد.
- در سال 2014 نسخۀ 6 ارائه شد که در آن دو نمودار تصحیح شدند. آخرین استاندارد پروتکل I2C، نسخۀ 6 آن است.
تصویر 2 – خلاصۀ تاریخچۀ پروتکل I2C
ویژگی های پروتکل I2C
برخی ویژگی های پروتکل I2C به شرح زیر هستند:
- تنها به دو خط SDA (خط Serial Data) و SCL (خط Serial Clock) نیاز است.
- هر وسیله ای که به باس متصل می شود به صورت نرم افزاری آدرس پذیر است. همچنین در هر لحظه یک رابطۀ Master/Slaveی وجود دارد. Masterها می توانند به عنوان Master-transmitter و Master-receiver عمل کنند.
- باس I2C یک باس Multi-master با آشکارسازی برخورد و حکمیت (Arbitration) برای جلوگیری از مخدوش شدن داده هنگام آغاز تبادل داده توسط دو یا چند Masterبه صورت هم زمان است.
- انتقال داده به صورت 8 بیتی جهت دار سریال و دو طرفه تا سرعت 100 کیلو بیت بر ثانیه در Standard-mode، تا سرعت 400 کیلو بیت بر ثانیه در Fast-mode، تا سرعت 1 مگا بیت بر ثانیه در Fast-mode Plus و تا سرعت 3.4 مگا بیت بر ثانیه در High Speed-mode.
- انتقال داده به صورت 8 بیتی جهت دار سریال و یک طرفه تا سرعت 5 مگابیت بر ثانیه در Ultra Fast-mode.
- فیلتر کردن به صورت On-chip برای حذف Spikeهای روی خط داده و حفظ یکپارچگی داده.
- تعداد آی سی های متصل به باس تنها محدود به حداکثر ظرفیت خازنی باس است. ظرفیت خازنی بیشتر ممکن است تحت برخی شرایط مجاز باشد.
- پیاده سازی به صورت نرم افزاری در میکروکنترلرها. با این ویژگی می توان تنها توسط دو پایۀ IO (مثلاً پورت IO در AVR) در یک شبکۀ I2C به تبادل داده پرداخت.
تصویر 3 – پیاده سازی نرم افزاری پروتکل I2C در دو میکروکنترلر AVR
ویژگی های آی سی های سازگار با پروتکل I2C
آی سی های سازگار با پروتکل I2C به طراحی سیستم اجازه می دهند که به سرعت از یک بلوک دیاگرام کاربردی به یک نمونۀ اولیه پیشرفت کند. علاوه بر این، از آنجایی که مستقیماً و بدون هیچ رابط اضافی به باس I2C متصل می شوند، با اضافه شدن به باس یا برداشته شدن از آن، به نمونۀ اولیه اجازه می دهند که به سادگی تغییر یا ارتقا پیدا کند. برخی ویژگی های آی سی های سازگار با پروتکل I2C و آثار استفاده از آنها عبارتند از:
- تطابق بلوک های موجود در بلوک دیاگرام با آی سی های واقعی؛ طراحی به سرعت از بلوک دیاگرام منجر به شماتیک نهایی می شود.
- عدم نیاز به طراحی باس؛ زیرا باس I2C به صورت یکپارچه روی چیپ موجود است.
- آدرس دهی یکپارچه و پروتکل انتقال داده اجازه می دهند که سیستم ها کاملاً نرم افزار محور باشند.
- انواع یکسان ICها می توانند کاربردهای بسیار متفاوتی داشته باشند.
- زمان طراحی کاهش می یابد. چون طراحان به سرعت توسط آی سی های سازگار با پروتکل I2C، با بلوک هایی که مرتباً استفاده می کنند، آشنا می شوند.
- آی سی ها می توانند به سیستم اضافه یا از آن حذف شوند. بدون این که تأثیری روی مدارات دیگر روی باس داشته باشند.
- تشخیص خطا و اشکال زدایی ساده است. نقص عملکرد بلافاصله قابل ردیابی است.
- با جمع آوری کتابخانه ای از ماژول های نرم افزاری قابل استفادۀ مجدد، می توان زمان توسعه نرم افزار را کاهش داد.
همچنین آی سی های CMOS سازگار با پروتکل I2C ویژگی های دیگری را ارائه می دهند. همگی آنها ویژگی های زیر را دارند:
- مصرف جریان بسیار کم؛
- مصونیت بالا در برابر نویز؛
- محدودۀ ولتاژ تغذیۀ وسیع؛
- محدودۀ دمای عملیاتی وسیع.
تصویر 4 – سه نمونه EEPROM سازگار با I2C ساخت Microchip با فناوری CMOS
کاربردهای پروتکل I2C
پروتکل I2C برای کاربردهایی ساده و مواقعی که هزینۀ کم نسبت به سرعت مهمتر است، مناسب است. از جمله کاربردهایی که برای پروتکل I2C ذکر شده، می توان به موارد زیر اشاره کرد:
- عملکرد SPD در EEPROMهای روی ماژول های حافظۀ DIMM؛
- عملکرد EDID برای مانیتور توسط کانکتورهای VGA و DVI و HDMI؛
- مدیریت سیستم برای PC با استفاده از SMBus؛
- دسترسی به آی سی های RTC و NVRAM؛
- دسترسی به ADCها و DACهای کم سرعت؛
- تنظیم کنتراست، رنگ و تعادل رنگ در مانیتورها (با استفاده از DDC)؛
- تنظیم حجم صدا در اسپیکرهای هوشمند؛
- کنترل و نمایش در نمایشگرهای OLED و LCD؛
- خواندن خروجی سنسورها؛
- روشن و خاموش کردن منبع تغذیه برای قطعات سیستم.
پروتکل I2C کاربردهای گسترده ای دارد و هر جایی که نیاز باشد داده ای منتقل شود، می توان از پروتکل I2C استفاده کرد. البته در صورتی که مشخصات و ویژگی های I2C بتواند الزامات انتقال داده را فراهم کند. یکی از کاربردهای I2C توسعۀ پایه های IO است. آی سی هایی برای این کاربرد ساخته شده اند که PCF8574 و MCP23017 و MAX7321 از این جمله اند. یکی از کاربردهایی که در پروژه ها ممکن است با آن برخورد کنیم، انتقال داده های LCD با I2C است. آی سی PCF8574 برای این کاربرد استفادۀ فراوانی دارد. برخی کاربردهای دیگر عبارتند از:
- آی سی های ADC مثل ADC121C021 و AD7992؛
- آی سی های DAC مثل MCP4728 و DAC70501؛
- آی سی های RFID مثل N24RF16E و MFRC522؛
- آی سی های مانیتور جریان و توان مثل LTC2945 و INA233؛
- آی سی های PWM و راه انداز LED مثل LP5009 و PCA9685؛
- آی سی های PLL مانند MC44824 و تولید کنندۀ کلاک مثل CY22150؛
- سنسورهای دما مثل MCP9808 و TMP117؛
- سنسورهای دما و رطوبت مثل HDC1080 و SI7006؛
- سنسور شتاب ADXL345 و BMA250؛
- سنسور جایروسکوپ MPU-6050 و L3GD20؛
تصویر 5 – آی سی MPU-6050 و یک ماژول L3GD20
عبارات و اصطلاحات I2C
در پروتکل I2C عبارات و اصطلاحاتی وجود دارد که آشنایی با آنها خالی از لطف نیست. در این بخش به توضیح مختصر این اصطلاحات می پردازیم.
Master: المان دیجیتالی است که باس I2C را کنترل می کند. همچنین تبادل داده بین Master و Slave است.
Slave: المان دیجیتالی است که با Master به تبادل داده می پردازد. Slave در باس I2C یک آدرس منحصر به فرد دارد و روی تبادل داده هیچ کنترلی ندارد.
Multi-master: هنگامی که از این قابلیت استفاده شود، چند المان دیجیتال می توانند Master باشند. در سیستم های چند Masterی در یک زمان، تنها یک المان می تواند Master باشد. در این زمان باقی المان ها Slave هستند.
Arbitration: یا حَکَمیَّت، در سیستم های چند Masterی معنا دارد. حکمیت یک المان دیجیتال در یک سیستم چند Masterی به معنای Master ماندن آن تا تبادل آخرین داده اش با Slave است. در صورتی که قرار باشد این المان دیجیتال حکمیت خود را از دست بدهد (یعنی یک المان دیجیتال دیگر بخواهد Master شود)، باید به مد Slave برود.
General Call Address (یا GCA): در پروتکل I2C این امکان وجود دارد که Master برای تمام Slaveها دادۀ یکسانی بفرستد. در این صورت به جای آدرس یک Slave خاص، 0x00 را می فرستد. Slaveهایی که برای پاسخ به GCA پیکربندی شده اند، داده های Master را دریافت خواهند کرد. در انتقال داده به صورت GCA، تنها انتقال داده از Master به Slaveها معنا دارد. GCA در ادامه بیشتر توضیح داده خواهد شد.
خط SDA: مخفف Serial Data، خطی است که داده ها به صورت سریال روی آن قرار می گیرند.
خط SCL: مخفف Serial Clock، خطی است که کلاک باس I2C روی آن قرار می گیرد. خط SCL را گاهی SCK نام گذاری می کنند.
تصویر 6 – سیگنال های SDA و SCL در پروتکل I2C
عبارات اصلاحات مربوط به سیگنال های پروتکل I2C
شرایط Start (نمایش با حرف S): قبل از تبادل داده، Master این شرایط را ایجاد می کند. مدتی پس از ایجاد شرایط Start، برای تبادل داده، کلاک روی خط SCL ایجاد می شود.
شرایط Stop (نمایش با حرف P): پس از تبادل داده، Master برای خاتمۀ عمل تبادل داده، این شرایط را ایجاد می کند. پس از Stop، باس I2C آزاد می شود.
شرایط Repeated Start (نمایش با Sr): پس از تبادل داده، Master برای آغاز تبادل جدید بدون ایجاد Stop، این شرایط را ایجاد می کند. پس از شرایط Repeated Start آدرس Slave جدید فرستاده می شود و باس I2C همچنان اشغال می ماند.
بیت R/W: پس از شرایط Start یا Repeated Start آدرس به همراه این بیت فرستاده می شود. اگر این بیت صفر باشد، به معنای Write است و Master بایت های داده را برای Slave می فرستد. اگر یک باشد، به معنای Read است و Master بایت های داده از Slave دریافت می کند.
Acknowledge (نمایش با ACK): بیت یا سیگنال Acknowledge، پاسخ گیرنده به بایتی است که از فرستنده دریافت کرده است. این پاسخ یک بیت صفر روی خط SDA است.
Not Acknowledge (نمایش با NACK): بیت یا سیگنال Not Acknowledge، یک سطح منطقی High روی خط SDA است. این پاسخ نشان دهندۀ شرایطی از قبیل عدم وجود گیرندۀ مورد نظر روی باس، عدم توانایی پاسخ گیرنده به بایت ارسالی از فرستنده، دریافت دادۀ غیر قابل فهم توسط گیرنده، عدم توانایی گیرنده در دریافت بایت های بیشتر و تعیین آخرین بایت ارسالی از Slave به Master توسط Master است.
تصویر 7 – بیت های ACK و NACK در پروتکل I2C
باس، اتصالات و شبکۀ I2C
یک شبکۀ I2C به طور معمول شامل یک Master و تعدادی Slave است. پایه های SDA و SCL المان های موجود در شبکه به ترتیب با خطوط SDA و SCL به یکدیگر متصل اند. علاوه بر این، خطوط SDA و SCL هر کدام با مقاومت به VCC مدار متصل شده اند. تعداد المان های موجود در شبکه علاوه بر محدودیت در آدرس دهی، به خاصیت خازنی باس هم محدود است. در آدرس دهی 7 بیتی به صورت تئوری 128 عدد Slave می توانند در باس I2C قرار گیرند. اما در عمل این تعداد کمتر از 128 است. زیرا تعدادی از آدرس ها رزرو شده اند. همچنین مقدار خاصیت خازنی باس I2C اجازه نمی دهد که تعداد Slaveها بیشتر شود. چرا که هر Slave که به باس اضافه می شود، مقداری خاصیت خازنی به باس اضافه می شود. در تصویر زیر یک شبکۀ سادۀ I2C را مشاهده می کنید. با توجه به این که شبکۀ I2C می تواند Multi-master باشد، امکان دارد در هر لحظه هر کدام از المان ها Master نیز باشند. البته در صورتی که توانایی Master بودن را داشته باشند. مثلاً در یک شبکۀ I2C شامل یک میکروکنترلر AVR و یک نمایشگر OLED SSD1306، نمایشگر OLED نمی تواند Master باشد.
تصویر 8 – یک شبکۀ سادۀ I2C و اتصالات آن
گسترش شبکۀ I2C
پروتکل I2C را می توان توسط المان هایی مانند Hubها، Repeaterها، Extenderها و مالتی پلکسرها و سوییچ ها گسترش داد. همچنین می توان پروتکل باس I2C را با المان هایی به ارتباط SPI یا UART یا حتی USB تبدیل کرد. برای مثال آی سی FT201X یک مبدل USB به I2C با تعدادی پایۀ IO است. المان هایی نیز به نام I2C Bus Controller هستند که داده های موازی را به داده هایی روی یک باس I2C و بالعکس تبدیل می کنند. آی سی PCA9564 یک I2C Bus Controller است. I2C Hub المانی است که در باس I2C اصلی قرار می گیرد و باس I2C اصلی را با باس های I2C فرعی دیگر مرتبط می کند. برای مثال آی سی PCA9518 یک I2C Hub است که SDA0 و SCL0 آن با یک کردن پایه هایی، به SDA1 و SCL1 تا SDA4 و SCL4 متصل می شود. I2C Repeaterها المان هایی هستند که باس I2C اصلی در یک طرف و یک باس I2C دیگر در طرف دیگر آن قرار می گیرد. از این المان ها برای تبدیل سطح (Level translating) ولتاژهای باس I2C نیز استفاده می شود. آی سی PCA9517 نمونه ای از آنهاست. I2C Extenderها نیز المان هایی هستند که انتقال داده را در مسافت های طولانی تر امکان پذیر می کنند. آی سی P82B715 نمونه ای از این المان هاست. I2C Multiplexer/Switchها هم المان هایی هستند که خطوط SCL و SDA باس اصلی را بین خطوط SCL و SDA باس های فرعی سوییچ می کند. آی سی PCA9540 از این جمله است. در تصویر زیر نمونه ای از یک شبکۀ گستردۀ I2C مشاهده می کنید.
تصویر 9 – یک نمونه شبکۀ گستردۀ I2C
سیگنال های SDA و SCL و قالب بندی در پروتکل I2C
خطوط SCL و SDA توسط دو مقاومت پول آپ در سطح High نگه داشته شده اند. پیش از شروع شرایط Start، هر دو خط SDA و SCL در سطح High قرار دارند. شرایط Start عبارت است از لبۀ پایین روندۀ SDA وقتی که SCL در سطح High قرار دارد. شرایط Stop نیز عبارت است از لبۀ بالا روندۀ SDA وقتی که SCL در سطح High قرار دارد. این دو وضعیت هر دو توسط Master ایجاد می شوند. پس از شرایط Start باس I2C اشغال می شود. این وضع تا زمانی که شرایط Stop به وجود بیاید، ادامه پیدا می کند. تغییرات سیگنال SDA در صورتی که Start و Stop و Repeated Start نباشد، تغییر سطح دادۀ سریال تلقی می شوند. و این تغییرات در زمانی که سطح سیگنال کلاک، Low است، اتفاق می افتد. در زمانی که سیگنال کلاک، High است، سطح سیگنال SDA که بیانگر بیتی از داده است، باید ثابت بماند. این موضوع بدین معناست که تغییر سطح SDA که بیانگر بیت های دادۀ سریال است، تنها زمانی اتفاق می افتد که سطح سیگنال کلاک، Low باشد. تغییرات سطح SDA در زمانی که SCL در سطح High است، بسته به نوع لبۀ سیگنال SDA، یکی از شرایط Start، Stop یا Repeated Start است. در تصویر زیر، در سمت چپ شرایط Start و Stop نمایش داده شده است. در سمت راست نیز زمان تغییر سطح ناشی از تغییرات دادۀ سریال نشان داده شده است. همان طور که مشخص است، تغییر سطح SDA در زمانی که SCL در سطح High است، شرایط Start و Stop هستند. تغییر سطح SDA نیز در زمانی که SCL در سطح Low است، تغییرات دادۀ سریال است.
تصویر 10 – شرایط Start و Stop (سمت چپ) و زمان تغییرات دادۀ سریال (سمت راست)
قالب بندی آدرس و داده در پروتکل I2C
در پروتکل I2C ابتدا بیت پر ارزش فرستاده می شود. زمانی پس از ایجاد شرایط Start، خط SCL نیز Low می شود و روی این خط یک کلاک به وجود می آید. در زمانی که یک بیت داده روی SDA قرار می گیرد، روی SCL یک پالس کلاک شامل یک لبۀ بالا رونده و یک لبۀ پایین رونده به همراه سطوح High و Low اتفاق می افتد. در این حالت در زمانی که خط SCL در وضعیت High قرار دارد، وضعیت خط SDA ثابت می ماند. تغییر سطح دادۀ روی SDA همان طور که گفته شد، در لحظاتی است که کلاک در سطح Low است. پس از اتمام ارسال بایتِ آدرس و بیت R/W توسط Master و قرار گرفتن ACK روی SDA توسط Slave، خط SCL برای مدت زمانی در سطح Low قرار می گیرد. پس از آن بیت های دادۀ سریال با هر کلاک SCL یک به یک روی SDA قرار می گیرند. هر 8 بیت که منتقل می شود، ACK آنها توسط گیرنده روی SDA قرار می گیرد. پس از انتقال آخرین بایت و ACK (یا NACK) آن روی SDA، شرایط Stop یا Repeated Start روی باس به وجود می آید.
تصویر 11 – سیگنال های باس I2C در انتقال یک بایت داده
انتقال داده با پروتکل I2C
همان طور که گفته شد پروتکل I2C یک پروتکل Master/Slaveی است. در ارسال و دریافت در I2C چهار مد وجود دارد که عبارتند از: مد Master-transmitter، مد Master-receiver، مد Slave-transmitter و مد Slave-receiver. این مدها دو به دو با یکدیگر وجود دارند. وقتی Master فرستنده (در مد Master-transmitter) است، Slave گیرنده (در مد Slave-receiver) است. وقتی Master گیرنده (در مد Master-receiver)، است، Slave فرستنده (در مد Slave-transmitter) است. شروع کننده و تمام کنندۀ انتقال، Master است. همچنین این که Slave فرستنده یا گیرنده قرار گیرد، توسط Master با بیت R/W تعیین می شود. مراحل انتقال داده در پروتکل I2C به طور کلی به صورت زیر خلاصه می شود:
- Master شرایط Start را ایجاد می کند.
- Master آدرس Slaveرا به همراه بیت R/W می فرستد و منتظر ACK می ماند.
- Slave آدرس خودش را به همراه بیت R/W دریافت و ACK را می فرستد.
- Master پاسخ ACK را تشخیص می دهد و الف) در صورتی که بیت R/W صفر بوده باشد، مد Master-transmitter و Slave-receiver به وجود می آید. بایت (های) داده از Master به Slave فرستاده می شود و Master منتظر ACK از سمت Slave می ماند. ب) در صورتی که بیت R/W یک بوده باشد مد Master-receiver و Slave-transmitter ایجاد می شود. بایت (های) داده از Slave به Master فرستاده می شود و Slave منتظر ACK(یا NACK) از سمت Master می ماند.
- Masterالف) در مد Master-transmitter و Slave-receiver، پس از ارسال آخرین بایت و دریافت یا عدم دریافت آخرین ACK، شرایط Stop یا Repeated Start را ایجاد می کند. ب) در مد Master-receiver و Slave-transmitter، پس از دریافت آخرین بایت مورد نیاز، یک NACK روی SDA قرار می دهد. سپس Master شرایط Stop یا Repeated Start را به وجود می آورد.
تصویر 12 – تبادل داده در پروتکل I2C در مدهای مختلف
آدرس دهی در پروتکل I2C
آدرس دهی را در پروتکل I2C می توان به دو نوع آدرس دهی 7 بیتی و 10 بیتی، دسته بندی کرد. در پروتکل I2C تعدادی آدرس رزرو شده وجود دارد. در جدول زیر این آدرس ها را به همراه بیت R/W مشاهده می کنید.
توضیحات | R/W bit | Slave Address |
آدرس فراخوانی عمومی (GCA) | 0 | 0000 000 |
شرایط Start | 1 | 0000 000 |
آدرس CBUS | X | 0000 001 |
رزرو برای قالب باس متفاوت | X | 0000 010 |
رزرو برای اهداف آینده | X | 0000 011 |
کد Master در مد Hs | X | 0000 1XX |
آی دی دستگاه | 1 | 1111 1XX |
آدرس دهی 10 بیتی Slave | X | 1111 0XX |
جدول 1 – آدرس های رزرو شده در پروتکل I2C
قالب آدرس دهی 7 بیتی به صورت زیر است. پس از شرایط Start آدرس 7 بیتی به همراه بیت R/W فرستاده می شود. بیت R/W در جایگاه LSB قرار دارد و آدرس 7 بیتی، بیت های 1 تا 7 را به خود اختصاص می دهد.
تصویر 13 – قالب بایت آدرس در آدرس دهی 7 بیتی
آدرس دهی 10 بیتی باعث گسترش باس I2C می شود. دستگاه هایی با آدرس 10 بیتی و دستگاه هایی با آدرس 7 بیتی، می توانند روی یک باس قرار گیرند. پس از شرایط Start یا Repeated Start، دو بایت اول، قالب آدرس را شکل می دهند. بایت اولِ آدرس در آدرس دهی 10 بیتی مقدار رزرو شدۀ p1111 0XXاست. دو بیت XX، بیت های پر ارزش آدرس 10 بیتی هستند. بیت LSB این بایت، بیت R/W است. بایت دوم کلاً به آدرس اختصاص داده شده و بیت R/W ندارد و هر 8 بیت آن مربوط به آدرس Slave است. در تصویر زیر مراحل انتقال داده را در آدرس دهی 10 بیتی در چهار مد مختلف Master-transmitter/receiver و Slave-receiver/transmitter مشاهده می کنید.
تصویر 14 – تبادل داده در آدرس دهی 10 بیتی
قابلیت Multi-master در پروتکل I2C
پروتکل I2C می تواند شامل چند المان باشد که هر کدام در زمان های خاصی Master باشند. در یک لحظه تنها یک المان می تواند Master باشد و باقی المان ها باید Slave باشند. اما همین Slaveها پس از آزاد شدن باس می توانند در مد Master قرار گیرند. به این سیستم که چند المان در زمان های متفاوت می توانند Master باشند، سیستم چند Masterی یا Multi-master می گویند. در سیستم های Multi-master دو موضوع سنکرون سازی کلاک و حکمیت (Arbitration) وجود دارد. این دو موضوع به همراه خاصیت Wired-AND (یا AND سیمی) خطوط SCL و SDA، به وجود می آیند. زمانی که دو Master به طور (تقریباً) همزمان یک کلاک روی خط SCL ایجاد کنند، خاصیت AND منطقی خط SCL باعث می شود سیگنال کلاک روی SCL، نتیجۀ AND دو سیگنال کلاک دو Master باشد.
تصویر 15 – خط SCL و سیگنال سنکرون شدۀ روی آن در پروسۀ حکمیت
البته در سیستم های چند Masterی همواره یک Master حکمیت را در اختیار می گیرد (Master برنده) و Master(های) دیگر حکمیت را از دست می دهند و به مد Slave می روند. هر Master پس از قرار دادن یک مقدار روی خط SDA، مقدار روی SDA را می خواند. اگر با مقداری که خودش قرار داده بود، مطابقت نداشت، حکمیت را از دست می دهد. این عملیات ممکن است طی زمان چند کلاک انجام شود. سپس آن Masterی که حکمیت را از دست می دهد، خط SDA را High می کند. در این حالت Master برنده در قرار دادن مقادیر (با توجه به خاصیت AND سیمی خط SDA)، دچار اختلال نمی شود. Masterی که حکمیت را از دست داده در این مرحله باید سریعاً به مد Slave برود. در این حالت امکان دارد Master برنده این Slave را آدرس دهی کرده باشد. حکمیت تا زمانی که شرایط Stop ایجاد شود، در اختیار Master برنده خواهد بود.
تصویر 16 – پروسۀ حکمیت و از دست رفتن حکمیت Master شمارۀ 1
مشخصات الکتریکی در پروتکل I2C
مشخصات ورودی/خروجی های پایه های SDA و SCL را در جدول زیر می بینید. این مشخصات برای مدهای Standard و Fast و Fast-mode Plus هستند.
جدول 2 – مشخصات ورودی/خروجی های SDA و SCL در پروتکل I2C
تصویر 17 – دیاگرام سخت افزاری پروتکل I2C
مشخصات خطوط SCL و SDA در پروتکل I2C
این مشخصات برای سه مد Standard و Fast و Fast-mode Plus در جدول زیر آمده است.
جدول 3 – مشخصات خطوط SCL و SDA در پروتکل I2C
تصویر 18 – مشخصات سیگنال های خطوط SCL و SDA در مدهای Standard و Fast پروتکل I2C
مقدار مقاومت های پول آپ خطوط SCL و SDA در پروتکل I2C
مقدار خاصیت خازنی باس در پروتکل I2C شامل مجموع خاصیت خازنی سیم ها، اتصالات و پین هاست. این خاصیت خازنی مقدار حداکثر مقاومت های پول آپ را به علت مقادیر خاص Rise time محدود می کند. در تصویر زیر (سمت چپ) حداکثر مقدار مقاومت پول آپ را نسبت به مقدار خاصیت خازنی باس نشان می دهد. فرمول هایی نیز برای محاسبۀ مقدار مقاومت پول آپ وجود دارد که مقادیر VIL = 0.3VDD و VIH = 0.7VDD در آنها در نظر گرفته می شوند. مقدار Rise Time که ان را با T نمایش می دهیم، به صورت زیر محاسبه می شود.
بنابراین حداکثر مقدار مقاومت پول آپ از فرمول زیر به دست می آید. tr مقدار Rise time و Cb مقدار خاصیت خازنی باس I2C است.
مقدار حداقل مقاومت پول آپ نیز از فرمول زیر به دست می آید. در تصویر زیر (سمت راست) حداقل مقدار مقاومت پول آپ نسبت به مقدار VDD نمایش داده شده است.
تصویر 19 – نمودار مقدار حداکثر و حداقل مقاومت پول آپ نسبت به خاصیت خازنی باس و VDD در پروتکل I2C
چند نکته دربارۀ پروتکل I2C
در این بخش به ذکر چند نکته دربارۀ پروتکل I2C می پردازیم.
Bit-banging در I2C: به صفر و یک کردن پایه های GPIO برای پیاده سازی یک پروتکل ارتباطی Bit-banging می گویند. پروتکل I2C را می توان به صورت نرم افزاری پیاده کرد. بدین صورت که پایه های GPIO را برای عملکرد SDA و SCL پیکر بندی و عملیات صفر و یک کردن آنها را به صورت نرم افزاری انجام داد. در نرم افزار کدویژن برای پیاده سازی پروتکل I2C نرم افزاری، این کار توسط کدویزارد قابل انجام است.
تفاوت TWI و I2C: کلمۀ TWI مخفف Two Wire Interface به معنای رابط کاربری دو سیمه است. TWI توسط برخی شرکت ها مانند Atmel برای اشاره به رابط دو سیمۀ خود استفاده می شود تا از مشکلات قانونی با Philips جلوگیری کند. زیرا I2C یک علامت تجاری ثبت شده به نام Philips است. برخی از تولید کنندگان مانند Atmel ویژگی هایی اختصاصی در TWI خود پیاده سازی کرده اند. TWI در خیلی از مشخصات مانند پروتکل I2C است، اما تفاوت هایی نیز دارد. مثلاً TWI در AVR مد Ultra Fast ندارد. یا این که آدرس دهی 10 بیتی در آن وجود ندارد.
Clock Stretching: شرایطی وجود دارد که Slave(ها) در باس I2C می توانند روی کلاک SCL تأثیر بگذارند. بعضی اوقات Slave نمی تواند با سرعت کلاک ایجاد شده توسط Master، تبادل داده انجام دهد. در این هنگام Slave با مکانیزمی به نام Clock Stretching سطح سیگنال کلاک را صفر نگه می دارد. Master نیز برای این که نوسان کلاک را ادامه دهد، نیاز دارد که سطح سیگنال کلاک High شده باشد. بنابراین تا زمانی که Slave سیگنال کلاک را صفر کرده، نوسانی روی SCL وجود نخواهد داشت.
تصویر 20 – Clock Stretching در پروتکل I2C
نتایج پروتکل I2C
- پروتکل ارتباطی I2Cیک پروتکل دو سیمۀ Master/Slaveی پر استفاده است.
- I2C یا IIC یا I2C مخفف Inter-Integrated Circuit یا Inter-IC است.
- پروتکل باس I2C در سال 1982 توسط Philips Semiconductor ابداع شده است.
- I2C در انواع آی سی های حافظه، ماژول های فرستنده/گیرنده، سنسورها، ADC و DAC و PLL و نمایشگرها و … کاربرد دارد.
- I2C شش نسخه دارد که نسخۀ 6 آن در سال 2014 ارائه شده است. این نسخه در حال حاضر (تیر 1399) کامل ترین نسخۀ I2C است.
- برخی ویژگی های I2C عبارتند از: تنها نیاز به دو خط SDA و SCL، آدرس پذیری نرم افزاری دستگاه هاس متصل، مدهای انتقال دادۀ Master-transmitter/receiver و Slave-receiver/transmitter، قابلیت Multi-master، نرخ های تبادل داده 100 کیلو بیت بر ثانیه، 400 کیلو بیت بر ثانیه، 1 مگا بیت بر ثانیه، 3.4 مگا بیت بر ثانیه و 5 مگابیت بر ثانیه، فیلتر برای حذف Spikeها، پیاده سازی به صورت نرم افزاری (Bit-banging) و … .
- یکی از ویژگی های مهم I2C، پیشرفت از بلوک دیاگرام های کاربردی به نمونه های اولیۀ کاربردی است.
- در سیستم های چند Masterی، حکمیت با Masterی است که تبادل داده را به اتمام می رساند.
- کنترل باس I2C از جمله ایجاد کلاک و شرایط Start و Repeated Start و Stop و همچنین تعیین جهت تبادل داده (یا مد انتقال) توسط Master انجام می شود.
- با استفاده از المان هایی مانند Hubها، Repeaterها، Extenderها و … می توان باس I2C را گسترش داد.
- لبۀ پایین رونده و بالا روندۀ SDA در هنگامی که SCL در سطح High است، به ترتیب شرایط Start (یا Repeated Start) و Stop هستند.
- تغییر سطح منطقی SDA که به منزلۀ دادۀ سریال باشد، تنها در زمانی که SCL در سطح Low باشد، امکان پذیر است.
- پس از هر شرایط Start یا Repeated Start، آدرس Slave به همراه بیت R/W توسط Master فرستاده می شود.
- مراحل انتقال داده در I2C به طور کلی عبارتند از: شرایط Start، ارسال آدرس Slave به همراه بیت R/W توسط Master، دریافت ACK از Slave توسط Master، تبادل داده و دریافت ACK توسط فرستنده از گیرنده، انتقال آخرین بایت، شرایط Stop.
- در I2C دو نوع آدرس دهی وجود دارد. در آدرس دهی 7 بیتی، 7 بیت آدرس به همراه بیت R/W فرستاده می شود. در آدرس دهی 10 بیتی ابتدا دو بیتِ آدرس در فرمت p11110XX به همراه بیت R/W و سپس 8 بیت دیگرِ آدرس در قالب یک بایت فرستاده می شود.
- خاصیت Wired-AND در I2C باعث سنکرون سازی کلاک می شود و به فرایند Arbitration کمک می کند.
- مشخصات الکتریکی و زمانی و … در مد (سرعت) های مختلف در I2C با یکدیگر متفاوت هستند.
- ماکزیمم مقدار مقاومت پول آپ روی SDA و SCL به مقدار خاصیت خازنی باس و مینیمم آن به VDD بستگی دارد.
- پروتکل TWI توسط برخی شرکت ها برای جلوگیری از مشکلات قانونی با Philips به کار برده شده است.
- قابلیت Clock Stretching این امکان را به شبکه I2C می دهد که Slaveهایی که نمی توانند با سرعت Master کار کنند، با Master به تبادل داده بپردازند.
سلام. مطلب جامعی درباره i2c نوشتید. clock stretching باعث نمیشه سرعت تبادل داده کم بشه؟
سلام. ممنون لطف دارید. بله. باعث کم شدن سرعت تبادل داده میشه. هر چقدر هم تعداد تبادل داده با slaveی که سرعتش کمه بیشتر باشه، میزان کمتر شدن سرعت تبادل داده چشمگیر تره
سلام جناب مهندس. از اول شروع کردم به خوندن و پیش خودم گفتم خب این مباحثی مثل تاریخچه و ویژگیها که ترجمه هم هستن حالا چه کار مهمی انجام شده؟! و اصلا چه نیازی به مطرح کردنشون بوده. بعد که تا آخر رسیدم چند لحظه تامل کردم نظرم عوض شد. وقتی به فیلمای آموزشی یوتیوب یا مطالب و پروسیجرای آموزشیشون نگاه میکنم میبینم با ریزترین جزئیات و ساده ترین شکل مطالبشونو آموزش میدن. البته من فقط آخرشونو دوست دارم ببینم و اصلا حوصله ندارم وارد مباحث پایه ایشون بشم. خب این اخلاق من و نظری که راجع به این چیزا دارم باعث شد درباره متن شما هم چنین احساسی پیدا کنم. بعد از کاربردای i2c متوجه شدم که احتمالا دارم اشتباه میکنم. و درنهایت هم نظرم اینه : خیلی خوب بود. ممنون
سلام. ممنون از وقتی که برای مطالعۀ این نوشته گذاشتید. شاید لازم به تاریخچه نبوده ولی اینا رو بیان کردم که اگه کسی براش سوال پیش اومد تا حدی توی همین نوشته پاسخ داده بشه. سعی میکنیم مطالبی که می نویسم حداقل حول موضوعش تا جایی که امکان داشته باشه کامل باشه. ولی خب به هر حال خیلی از موضوعات مثل همین I2C کامل توضیح دادنش توی یه نوشته نمیگنجه. بحث طولانی و گسترده ای هستش. هدف این نوشته آشنایی با I2C هستش و مطالبش هم در راستای همین هدف بوده. حالا اگه صرفاً ترجمه بتونه ما رو به این هدف برسونه، ما هم صرفا ترجمه می کنیم. و این موضوع از نظر بنده مشکلی نداره. دربارۀ کتاب ها و ویدئوها و جزوات و دستورالعمل های خارجی زبان هم درست می فرمایید. مثلاً توی دستور کار آزمایشگاه الکترونیکی که برای بردهای Labvolt هست، وقتی یه موضوعی توضیح داده میشه خیلی شفاف و ساده هستش. حالا ممکنه ما تا جاییش رو انجام داده باشیم و اطلاع داشته باشیم و برامون کسل کننده باشه. از نظرتون هم خیلی ممنونم. شما لطف دارید. خواهش میکنم.
سلام. با i2c حداکثر تا چند متر میشه دیتا منتقل کرد؟
سلام. بستگی داره. حداکثر طول کابلی که میتونیم برای انتقال دادۀ I2C از اون استفاده کنیم (بدون در نظر گرفتن مبحث نویز) به ظرفیت خازنی کابل و مقاومت اون در هر متر و ولتاژ High و Low بستگی داره. همچنین این حداکثر طول کابل برای مدهای مختلف استاندارد و Fast و … با توجه به فرکانس اونا متفاوته. برای مثال برای انتقال در مد استاندارد با فرکانس 100 کیلوهرتز اگه بخوایم از کابل های زوج به هم تابیده با شیلد با ظرفیت خازنی 100 تا 240 پیکوفاراد بر متر استفاده کنیم، حداکثر طول کابل حدود 1 متره. اگر با همین کابل فرکانس 10 کیلوهرتز باشه، حداکثر طول کابلی که میتونیم باهاش داده رو منتقل کنیم، میشه 10 متر.
سلام.
امکانش هست رابطه دقیق تری رو برای جواب سوال ایشون بدین. من هدفم کار بر روی سنسور aht10 با پروتکل i2c است؟
سلام. متاسفانه فرمول یا رابطه ای برای حداکثر فاصلۀ ارتباط I2C پیدا نکردم. اما میشه محاسباتی رو انجام داد. با توجه به مقدار ظرفیت خازنی و افت ولتاژ کابل در هر متر و مشخصات الکتریکی و زمانی I2C توی میکروکنترلر و هر کدوم از المان های روی باس، میشه محدودۀ ظرفیت خازنی و افت ولتاژ کابل قابل قبول برای باس I2C رو بدست آورد و از روی اون طول کابل رو بسته به جنس و نوعش پیدا کرد. مثلا اگر توی دیتاشیت یه قطعه گفته شده باشه که حداکثر Fall time باید 50 نانوثانیه باشه، میشه حداکثر ثابت زمانی باس رو به دست آورد و با توجه به اون، حداکثر ظرفیت خازنی و حداکثر طول کابل رو به دست آورد. البنه fall time رو مثال گفتم. عوامل دیگه ای هم توی این موضوع دخیل هستند. به مشخصات زمانی و الکتریکی قابل قبول برای باس I2C میکروکنترلر مورد نظرتون مراجعه کنید.
سلام. میشه بفرمایید I2C چطور ادغامی از spi و یوزارته؟ ممنون
سلام. ادغامی از USART و SPI به این معنی نیست که فیلیپس این دو پروتکل رو ادغام کرده باشه و به I2C رسیده باشه. I2C ویژگی هایی داره که SPI و USART در مجموع با هم میتونن داشته باشن. مثلاً I2C برای ارتباط از دو سیم استفاده میکنه. USART هم از دو سیم. یا توی I2C مثل SPI قابلیت آدرس دهی وجود داره. منظور از ادغام، ادغام در ویژگی های این پروتکل هاست. با این که تفاوت هایی هم وجود داره، اگه به طور کلی به ویژگی ها نگاه کنیم، میشه اونا رو ادغامی از ویژگی های دو پروتکل SPI و USART در نظر بگیریم.
سلام. چطور میتونم دیوتی سایکل کلاک i2c رو برای میکروکنترلر stm32f103 تغییر بدم؟ ممنون
سلام. توی این میکروکنترلر امکان تغییر Duty Cycle سیگنال SCL نیست. در مد استاندارد، برابر 50 درصده. چون هم THigh و هم TLow با استفاده از مقدار CCR ضربدر فرکانس PCLK1 بدست میان.
THigh = TLow = CCR * Tpclk1
بنابراین مقدار THigh تقسیم بر دورۀ تناوب سیگنال SCL (یعنی THigh+TLow) میشه 0.5.
اما در مد Fast امکانش هست که با بیت DUTY مقدار Duty Cycle رو روی یکی از مقادیر 2/3 یا 9/16 قرار بدید. خواهش میکنم.
سلام. توی stm32 نحوه تعیین فرکانس کلاک باس i2c به چه شکله؟ هر چی دیتاشیت رو میخونم متوجه نمیشم. ممنون میشم راهنمایی کنید
سلام. بنده نمیدونم برای چه شماره ای کد می نویسید. اما خودم برای STM32F103VE که کد I2C نوشتم به این صورت بود:
اگه فرکانس SCL برابر 100 کیلوهرتز و کمتر از اون باشه، رجیستر CCR میشه مقدار فرکانس PCLK1 تقسیم بر دو برابر فرکانس SCL یعنی به این شکل:
I2Cx->CCR |= Fpclk1 / (2 * Fscl);
همچنین در این حالت باید بیت FS صفر بشه.
اگه فرکانس SCL بزرگتر از 100 کیلوهرتز تا 400 کیلوهرتز باشه، باید بیت FS یک بشه. مقدار CCR هم میشه:
الف) وقتی که بیت DUTY رو صفر کرده باشیم:
I2Cx->CCR |= Fpclk1 / (3 * Fscl);
ب) وقتی بیت DUTY رو یک کرده باشیم:
I2Cx->CCR |= Fpclk1 / (25 * Fscl);
همچنین مقدار رجیستر TRISE از فرمول زیر به دست میاد:
I2Cx->TRISE &=~(1<<1);
I2Cx->TRISE |= (Fpclk1/(10 * Fscl)) + 1;
نکته ای که باید توجه کنید اینه که این رجیسترها به مقدار فرکانس PCLK1 وابسته هستن، نه فرکانس واحد I2C. البته یک سری محدودیت ها هم برای فرکانس واحد I2C هست:
فرکانس واحد I2C باید حداقل 2 مگاهرتز باشه.
فرکانس واحد I2C نمیتونه بیشتر از 50 مگاهرتز و بیشتر از فرکانس PCLK1 باشه.
برای رسیدن به فرکانس های SCL مناسب هم یه سری محدودیت ها برای فرکانس PCLK1 وجود داره:
برای رسیدن به فرکانس های مد استاندارد، فرکانس PCLK1 باید حداقل 2 مگاهرتز باشه.
برای رسیدن به فرکانس های مد Fast، فرکانس PCLK1 باید حداقل 4 مگاهرتز باشه.
برای رسیدن به 400 کیلوهرتز، فرکانس PCLK1 باید ضریبی از 10 مگاهرتز باشه.
خواهش میکنم
سلام. ممنون از مطالبتون. تو آردوینو پروتکل i2c هست یا twi؟
سلام. خواهش میکنم. توی بردهای آردوینویی که میکروکنترلرشون AVRه، TWI به صورت سخت افزاری وجود داره و I2C ندارن. اما I2C نرم افزاری هم وجود داره. منظور همون پیاده سازی I2C به صورت نرم افزاریه. Bit banging
خیلی ممنون خدا خیرتون بده
سلام. خواهش میکنم. زنده باشید
خیلی عالی بود.
یه سوال
امکانش هست چندتا آی سی که بصورت شبکه ۴۸۵ به همدیگه متصل شدن رو با یک آی سی دیگه که از spi درحال استفاده میباشه رو شبکه کرد به طور همزمان؟
سلام وحسته نباشین، آیا میشه همزمان پروتکل usart وi2c را با هم روی میکرو avr پروگرام کرد ؟؟!! و سوال دوم اینه که چجوری میشه آیسی bs808 که مربوط به سنسور تاچ لمسی هست رو با میکرو سریال کرد ؟! ممنون میشم پاسخ بدین واقعا خیلی برام حیاتیه، پروژه دارم همینطوری موندم چکار کنم ،