آموزش الکترونیکالکترونیک

ارتباط I2C چیست؟ مبانی پروتکل ارتباط سریال I2C

ما در مورد اصول ارتباط SPI و ارتباطات UART صحبت کرده ایم ، بنابراین بیایید به ارتباط I2C بپردازیم. در پروژه هایی که سنسور های فشار بارومتری یا ماژول های ژیروسکوپ / شتاب سنج در آن Slaveد دارند ، اغلب از ارتباط I2C استفاده میشود.

پیشنهاد میکنم قبل از خواندن ادامه مطلب، نگاهی به مقاله انواع ارتباط سریال بیاندازید.

ارتباط I2C چیست؟

ارتباط I2C توسط Phillips Semiconductor ساخته شد و سالها بعد اینتل پروتکل SMBus را به عنوان I2C تعریف کرد.  I2C بهترین ویژگی های SPI و UART را با هم ترکیب می کند. با استفاده از I2C می توانید چندین Slave به یک Master واحد متصل کنید (مانند SPI) و همچنین می توانید چندین Master را کنترل کنید که یک یا چند Slave را کنترل کنند. این امر درصورتی مفید است که می خواهید بیش از یک میکروکنترلر در پروژه خود استفاده کنید.

مانند ارتباطات UART ، ارتباط I2C نیز فقط از دو سیم برای انتقال داده بین دستگاه ها استفاده می کند:

انواع ارتباط سریال

برای یادگیری کامل آردوینو (برنامه نویسی حرفه ای، ارتباط با اندروید، ساخت ربات) ، روی دوره آموزش آردوینو کلیک کنید.

همچنین اگر میخواهید الکترونیک را با فیلم های آموزشی یاد بگیرید، روی دوره آموزش الکترونیک کلیک کنید.

  • SDA (Serial Data) : خطی برای Master و Slave برای ارسال و دریافت داده ها.
  • SCL (Serial Clock) : خطی که سیگنال ساعت را حمل می کند.

I2C یک پروتکل ارتباطی سریال است ، بنابراین داده ها نوبتی در امتداد یک سیم (خط SDA) منتقل می شوند.

مانند SPI ، ارتباط I2C نیز همگام است ، بنابراین خروجی بیت ها با نمونه برداری از بیت ها توسط یک سیگنال ساعت مشترک بین Master و Slave هماهنگ می شوند. سیگنال ساعت همیشه توسط Master کنترل می شود.

مشخصات ارتباط سریال I2C

I2C چگونه کار می کند؟

با استفاده از I2C ، داده ها در پیام ها منتقل می شوند. پیام ها به فریم های داده تقسیم می شوند. هر پیام دارای یک فریم آدرس است که شامل آدرس باینری Slave و یک یا چند فریم داده است که حاوی داده های منتقل شده است. این پیام همچنین شامل شرایط شروع و توقف ، بیت های خواندن / نوشتن و بیت های ACK / NACK بین هر قاب داده است:

I2C چگونه کار می کند؟

  • شرایط شروع: خط SDA از سطح ولتاژ بالا به سطح ولتاژ پایین تغییر می کند قبل از اینکه خط SCL از بالا به پایین تغییر کند.
  • شرایط توقف: خط SDA پس از اینکه خط SCL از کم به زیاد تغییر می کند از سطح ولتاژ پایین به سطح ولتاژ بالا تبدیل می شود.
  • فریم آدرس: توالی 7 یا 10 بیتی منحصر به فرد برای هر Slave که وقتی که Master می خواهد با آن صحبت کند ، Slave را مشخص می کند.
  • بیت خواندن / نوشتن: یک بیت واحد که مشخص می کند Master داده را به Slave ارسال می کند (سطح ولتاژ پایین) یا از آن داده می خواهد (سطح ولتاژ بالا).
  • بیت ACK / NACK: هر فریم در پیام با یک بیت تأیید / عدم تأیید دنبال می شود. اگر یک فریم آدرس یا یک فریم داده با موفقیت دریافت شود ، یک بیت ACK از دستگاه گیرنده به فرستنده بازگردانده می شود. در صورت عدم تایید، بیت NACK فرستاده میشود.
مطلب پیشنهادی:  PWM چیست ؟ آموزش انواع پالس PWM

آدرس دهی

I2C خطوط انتخاب Slave (مانند خط SS در SPI) را ندارد ، بنابراین به راه دیگری نیاز دارد تا Slave بداند داده ها برای Slave مورد نظر ارسال می شود و نه Slave دیگری. این کار را با آدرس دهی انجام می دهد. فریم آدرس همیشه بعد از بیت شروع قرار دارد.

Master آدرس Slave را که می خواهد با آن ارتباط برقرار کند برای هر Slave ای که با آن ارتباط دارد ارسال می کند. سپس هر Slave آدرس ارسالی از Master را با آدرس خود مقایسه می کند. اگر آدرس مطابقت داشته باشد ، یک بیت ولتاژ پایین ACK را به Master ارسال می کند. اگر آدرس مطابقت نداشته باشد ، Slave کاری انجام نمی دهد و خط SDA همچنان بالا میماند.

بیت خواندن/نوشتن

فریم آدرس شامل یک بیت واحد در انتها است که به Slave اطلاع می دهد آیا Master می خواهد برای آن داده بنویسد یا از آن داده بگیرد. اگر Master بخواهد داده ها را به Slave ارسال کند ، بیت خواندن / نوشتن یک سطح ولتاژ پایین است. اگر Master درخواست داده از Slave را دارد ، بیت یک سطح ولتاژ بالا است.

فریم داده ها

بعد از اینکه Master بیت ACK را از Slave تشخیص داد ، اولین فریم داده آماده ارسال میشود.

فریم داده همیشه 8 بیت است و ابتدا با مهمترین بیت ارسال می شود. هر فریم داده بلافاصله با یک بیت ACK / NACK دنبال می شود تا بررسی شود که فریم با موفقیت دریافت شده است یا خیر. قبل از ارسال فریم داده بعدی ، بیت ACK باید توسط Master یا Slave دریافت شود (بسته به اینکه چه کسی داده ها را ارسال می کند).

همچنین اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید

پس از ارسال همه فریم های داده ، برنامه اصلی می تواند برای متوقف کردن انتقال ، یک شرط توقف به Slave ارسال کند. شرط توقف یک انتقال ولتاژ از پایین به زیاد در خط SDA پس از یک انتقال کم به زیاد در خط SCL است ، با اینکه خط SCL همچنان بالا است. برای متوجه شدن این تغییر سطح ولتاژ ها، مراحل انتقال داده در I2C را بخوانید.

مراحل انتقال داده I2C

1. Master قبل از تغییر خط SCL از بالا به پایین ، با شروع تغییر خط SDA از سطح ولتاژ بالا به سطح ولتاژ پایین ، شرایط شروع را برای هر Slave متصل ارسال می کند:

مراحل انتقال داده I2C

2. Master به هر Slave آدرس 7 یا 10 بیتی Slave را که می خواهد با آن ارتباط برقرار کند ، همراه با بیت خواندن / نوشتن ارسال می کند:

ارسال بیت آدرس توسط ارتباط I2C

3- هر Slave آدرس ارسالی از Master را با آدرس خود مقایسه می کند. اگر آدرس مطابقت داشته باشد ، Slave با پایین آوردن خط SDA برای یک بیت ، ACK را برمی گرداند. اگر آدرس ارسالی با آدرس خود Slave مطابقت نداشته باشد ، Slave خط SDA را بالا میبرد.

تایید آدرس صحیح توسط Slave

4. Master فریم داده را ارسال یا دریافت می کند:

انتقال داده از Master به Slave با I2C

5. پس از انتقال هر فریم داده ، دستگاه گیرنده بیت ACK دیگری را به فرستنده بازمی گرداند تا دریافت موفقیت آمیز فریم را تأیید کند:

مطلب پیشنهادی:  اپتوکوپلر چیست؟ انواع اپتوکوپلر و کاربرد در AC/DC

تایید دریافت صحیح اطلاعات I2C

6. برای متوقف کردن انتقال داده ، Master با تغییر دادن SCL بالا قبل از تغییر SDA بالا، یک حالت توقف برای Slave ارسال می کند:

توقف انتقال داده در ارتباط سریال I2C

اتصال یک Master به چند Slave در ارتباط I2C

از آنجا که I2C از آدرس دهی استفاده می کند ، Slave های متعدد را می توان از یک Master کنترل کرد. با یک آدرس 7 بیتی ، 128 آدرس منحصر به فرد در دسترس هستند. یعنی میتوان بیشتر از 100 Slave را به یک Master متصل کرد. برای اتصال چندین Slave به یک Master واحد ، آنها را به این صورت سیم کشی کنید. با مقاومت های پول آپ 4.7K اهم خطوط SDA و SCL را به Vcc متصل کنید.

اتصال یک Master به چند Slave در ارتباط I2C

اتصال چند Master به چند Slave در I2C

چندین Master می توانند به یک Slave یا چند Slave متصل شوند. اما مشکل چندین Master در یک سیستم زمانی ایجاد می شود که دو Master سعی می کنند همزمان داده را از طریق خط SDA ارسال یا دریافت کنند. برای حل این مشکل ، هر Master باید قبل از ارسال پیام تشخیص دهد که آیا خط SDA کم است یا زیاد. اگر خط SDA کم باشد ، این بدان معناست که Master دیگری کنترل مسیر را دارد و Master باید منتظر ارسال پیام باشد.

اگر خط SDA زیاد باشد ، انتقال پیام ایمن است. برای اتصال چندین Master به چندین Slave ، از مدار زیر با مقاومت های پول آپ 4.7K اهم استفاده کنید که خطوط SDA و SCL را به Vcc متصل می کند:

اتصال چند Master به چند Slave در I2C

مزایا و معایب ارتباط I2C

I2C چیزهای زیادی دارد که ممکن است در مقایسه با پروتکل های دیگر پیچیده به نظر برسد ، اما دلایل خوبی وجود دارد که باعث شود شما از I2C برای اتصال به یک دستگاه خاص استفاده کنید:

مزایا ارتباط I2C:

  • فقط از دو سیم استفاده می کند.
  • پشتیبانی از چندین Master و چندین Slave
  • بیت ACK / NACK تأیید می کند که هر فریم با موفقیت منتقل می شود.
  • سخت افزار نسبت به UART پیچیدگی کمتری دارد.

معایب ارتباط سریال I2C:

  • سرعت انتقال اطلاعات کندتر از SPI است
  • اندازه فریم داده به 8 بیت محدود می شود
  • سخت افزار پیچیده تری نسبت به SPI برای اجرا نیاز است.

بعد از خواندن این مقاله پیشنهاد میکنم مقاله ارتباط UART و ارتباط SPI را نیز بخوانید.

از این نکات می توان فهمید که I2C به ویژه هنگامی که شبکه ارتباطی پیچیده ، متنوع یا گسترده ای داشته باشید ، مناسب است. از ارتباط UART معمولاً برای اتصالات نقطه به نقطه استفاده می شود زیرا روش استانداردی برای آدرس دهی دستگاه های مختلف یا اشتراک پین وجود ندارد. SPI زمانی عالی است که شما یک Master و چند Slave داشته باشید ، اما هر کاربر به یک سیگنال جداگانه “SS” احتیاج دارد ، که منجر به استفاده از پین های زیادی میشود. همچنین ارتباط SPI از چند Master پشتیبانی نمیکند.

اگر توان عملیاتی مساله اصلی باشد ، ممکن است لازم باشد که از I2C استفاده نکنید. SPI فرکانس های بالاتر ساعت را پشتیبانی می کند و سربار را به حداقل می رساند. همچنین ، طراحی سخت افزار سطح پایین برای SPI (یا UART) بسیار ساده تر است ، بنابراین اگر در حال کار با FPGA هستید و رابط سریال خود را از ابتدا توسعه می دهید ، احتمالاً I2C آخرین راه محسوب می شود.

میخواهید برنامه نویسی STM32 را یاد بگیرید؟

دوره آموزش STM32

میخواهید الکترونیک را یاد بگیرید؟

دوره آموزش الکترونیک
دوره آموزش آردوینو

میخواهید آردوینو را به صورت پروژه محور یاد بگیرید؟ برای مشاهده توضیحات روی دوره مورد نظر کلیک کنید

محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید) سعی میکنم تمام نظرات را پاسخ دهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *