ورود

ثبت نام




                 telegram 1      linkedin 1      facebook 1      instagram 1

سبد خرید شما خالی می باشد.

I2C Protocol

این مورد را ارزیابی کنید
(0 رای‌ها)

I2C Protocol


در این آموزش درباره پروتکل I2C و نحوه کار و ایجاد آن توسط میکروکنترلر برای ارتباط با قطعات جانبی توضیحاتی داده میشود.

پروتکل I2C که مخفف Inter-integrated Circuit میباشد. رابطی است که به ما اجازه ارتباط یک یا چند Slave با یک یا چند Master را میدهد. از این رابط برای مسیرهای کوتاه میشود استفاده کرد و تنها از دو پایه SCL و SDA برای ارتباط استفاده میشود.

I2C ProtocolI2C Protocol

 

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

 

سیگنال ها:
 
هر رابط I2C شامل دو خط ارتباطی SCL و SDA میباشد. SCL سیگنال Clock و SDA سیگنال دیتا میباشد.
سیگنال Clock همیشه توسط Master ایجاد میشود و Slave ها میتوانند Clock را Low کنند (جهت ایجاد تاخیر در ارسال اطلاعات ) به این عمل clock stretching میگویند که در ادامه توضیح داده میشود.
 
بر خلاف رابط های UART و SPI سیگنالهای I2C بصورت Open Drain طراحی شده اند به این معنا که این پروتکل میتواند سیگنالها را Low کند ولی قابلیت High کردن آن را ندارد (سیگنالها یا Low هستند یا بصورت باز (بدون اتصال) میباشند. بنابراین برای کارکرد درست باید هر دو پایه را Pull Up کرد. مقدار مقاومت Pull Up بستگی به تعداد قطعات روی bus و طول آن دارد بهتر است ابتدا با مقاومت 4.7k شروع کرد و در صورت نیاز مقدار آن را کاهش داد. هر چه تعداد قطعات بیشتر و طول bus بیشتر شود مقدار مقاومت باید کاهش یابد.
 
 
سطح سیگنال ها:
 
از آنجایی که پروتکل I2C در حقیقت توانایی High کردن سیگنالها را ندارد میتوان قطعات با سطح ولتاژ متفاوت را روی یک bus به یکدیگر متصل کرد. و برای این کار نیازی به اضافه کردن مبدل سطح ولتاژ (مثلا مداری که 5 را به 3.3 تبدیل کند یا برعکس) نیست و راه حل این است که مقاومت Pull Up را به کمترین ولتاژ متصل کرد البته در صورتی که تفاوت سطح ولتاژ زیاد باشد مثلا یکی 2.5 ولت و دیگری 5 ولت به مدار مبدل سطح ولتاژ نیاز خواهیم داشت.
 
 
پروتکل:
 
برقراری ارتباط با پروتکل I2C نسبت به رابط هایی مثل UART یا SPI پیچیده تر است. و این بدین دلیل است که هر قطعه ای دارای روش مخصوص خودش است و ممکن است با دیگر قطعات متفاوت باشد. بصورت کلی دو مدل پروتکل Basic و Advanced در اکثر قطعات استفاده میشود که در ادامه توضیح داده خواهند شد.

 

  • پروتکل Basic:
 
روش برقراری ارتباط در پروتکل Basic در کل بصورت تصویر زیر است
 
I2C Protocol BasicI2C Protocol Basic
 
پیام ارسالی در این پروتکل به دو بخش تقسیم میشود:
 
1 . آدرس: آدرس توسط master ارسال میشود و حاوی آدرس قطعه ای است که میخواهد با آن ارتباط برقرار کند.
2. دیتا: یک یا چند بایت اطلاعات که از master به slave و یا برعکس ارسال میشود.
 
ارسال دیتا روی خط SDA پس از Low شدن SCL انجام میشود و خواندن دیتا از خط SDA نیز پس از High شدن SCL انجام میشود. تاخیر زمانی برای ارسال و یا دریافت دیتا پس از اینکه SCL تغییر وضعیت میدهد (از High به Low برای ارسال و یا Low به High برای دریافت) در قطعات مختلف متفاوت است و معمولا در دیتاشیت قطعه مورد نظر درج میشود.
 
 
در زیر به توضیح قسمتهای مختلف این پروتکل میپردازیم.
 
  • شروع (Start Condition):
برای شروع فریم آدرس Master باید خط SCL را High کند و پس از آن SDA را Low کند. با انجام این کار Slave های روی bus متوجه میشوند که اطلاعاتی قرار است روی bus قرار گیرد. در صورتی که بیش از یک master روی bus داشته باشیم و همزمان قصد ارسال اطلاعات را داشته باشند هرکدام که سریع تر خط SDA را Low کند میتواند کنترل bus را در اختیار گرفته و شروع به ارسال اطلاعات کند.
 
  • بخش آدرس (Address Frame):
در هر توالی ارتباط (هر پکت اطلاعات) آدرس اولین چیزی است که از طرف master ارسال میشود. آدرس 7 بیت میباشد که بصورت MSB ارسال میشود (بیت با ارزش بالاتر ابتدا ارسال میشود) پس از ارسال این 7 بیت یک بیت R/W ارسال میشود. برای عمل خواندن 1 و برای عمل نوشتن مقدار 0. 
نهمین بیت از هر فریم که هم در آدرس و هم در دیتا وجود دارد NACK/ACK نامیده میشود. پس از ارسال 8 بیت کنترل SDA به Slave سپرده میشود در صورتی که یکی از Slave ها پیام را بدرستی دریافت کرده باشد قبل از نهمین پالس از SCL خط SDA را Low میکند. بنابراین در صورتی که قبل از نهمین پالس SCL و یا پس از ارسال 8 بیت اطلاعات خط SDA دارای مقدار High باشد بدین معناست که هیچ کدام از Slave ها پیام را دریافت نکرده است. با بروز این شرایط تبادل اطلاعات متوقف می شود.
 
  • بخش اطلاعات (Data Frame):
پس از ارسال آدرس میتوان اطلاعات ارسال و یا دریافت کرد. بدین منظور master پالس clock را روی خط SCL بصورت منظم و با فرکانسی ثابت تولید میکند و data هم با توجه به اینکه عمل خواندن باشد یا نوشتن از طرف master و یا slave با هر پالس SCL روی خط SDA قرار میگیرد. تعداد بایت های ارسالی و یا دریافتی در قطعات و عملیات های مختلف متفاوت است و تعداد مشخص و یا محدودی ندارد.
 
  • پایان (Stop condition):
پس از پایان یافتن ارسال و یا دریافت اطلاعات بیت stop از طرف master ارسال میشود. برای ارسال این بیت master ابتدا SCL را از Low به High تغییر داده سپس SDA را هم از Low به High تغییر میدهد و پس از این عمل ارتباط پایان یافته و bus آزاد میشود.
برای جلوگیری از ایجاد یک شرایط stop اشتباه در طول عمل نوشتن خط SDA در زمانی که SCL دارای مقدار High است نباید تغییر کند.
 

 
پروتکل پیشرفته یا Advanced:
در این پروتکل آدرس شامل 10 بیت میباشد و برای ارسال آن از دو فریم استفاده میشود. اولین فریم آدرس شامل پنج بیت 11110 بصورت ثابت به علاوه 2 بیت از آدرس که بصورت MSB ارسال میشود و یک بیت R/W میباشد. پس از R/W تمام slave هایی که 2 بیت باارزشتر آدرسشان با این 2 بیت یکی باشد بیت ACK را پاسخ میدهند (پایه SDA را Low میکند) و پس از آن فریم دوم آدرس ارسال میشود. این فریم شامل 8 بیت باقیمانده از آدرس بعلاوه بیت ACK میباشد.
 
فریم دیتا در این پروتکل مشابه پروتکل Basic میباشد.

 
شرایط شروع مجدد (Repeeted Start Conditions):
شروع مجدد بدین معناست که master پس از ارسال یک پیام و بدون واگذاری bus به master دیگری شروع به ارسال پبام بعدی کند. این شرایط بعضی مواقع پیش میآید و لازم میشود که به دیگر master ها اجازه داده نشود که bus را در اختیار بگیرند. در واقع پس از پایان یافتن یک پکت (شامل آدرس و دیتا) بیت پایان ارسال نمیشود و بلافاصله بیت Start بعدی فرستاده میشود
برای ایجاد این شرایط بعد از اینکه فریم Data پایان یافت و در زمانی که SCL پایین یا low است SDA را High میکنیم سپس SCL را High میکنیم و پس از آن SDA را Low میکنیم. بدین صورت بدون ارسال Stop بیت Start دیگری ارسال شده و پس از آن میتوان آدرس و ... را ارسال کرد. از آنجا که بیت Stop ارسال نشده هیچ master دیگری نمیتواند کنترل bus را بدست گیرد.
برای درک بهتر این موضوع تصویر زیر را ببینید.
 
I2C Repeated Start ConditionsI2C Repeated Start Conditions
 

تعداد شروع های دوباره محدودیتی ندارد و تا زمانی که بیت Stop ارسال نشود کنترل bus در اختیار master است.

 

کشش پالس (Clock Stretching):

برخی مواقع پیش می آید که نرخ ارسال اطلاعات master که در واقع به معنی فرکانس پالس SCL میباشد از سرعت و توانایی Slave بیشتر است و یا Slave نیاز به زمان بیشتری برای آماده کردن اطلاعات دارد (برای ارسال اطلاعات) مثلا زمانی که slave یک ADC است و master درخواست مقدار تبدیل شده را دارد ولی slave هنوز عمل تبدیل را به پایان نبرده و اطلاعات آماده نیست. در چنین مواقعی پس از پایان یافتن یک فریم slave کنترل SCL را در دست گرفته و آن را در وضعیت Low قرار میدهد بدین صورت Master دیگر قادر به ارسال فریم جدیدی نیست تا زمانی که Slave خط SCL را رها کند.

 

 

برای ارسال نظر وارد سایت شوید