سنتعلّم في هذا المقال عن بروتوكول الاتّصال I2C (بروتوكول الدارة المتكاملة، the Inter-Integrated Circuit)، المُستخدم في المشاريع التي تتضمّن شاشات OLED وأجهزة استشعار الضغط الجوي ووحدات الجيرسكوب/مقياس التسارع.
يجمع I2C بين أفضل ميزات بروتوكولات الاتصال SPI وUARTs، فيمكن باستخدام I2C توصيل أكثر من تابع (slave) بسيد (master) واحد (مثل SPI) كما يمكن أن تملك أكثر من سيد يتحكم بتابع واحد أو أكثر، وهذا مفيد جداً عند وجود أكثر من متحكم يسجل بيانات على بطاقة ذاكرة واحدة أو يعرض نص على شاشة (LCD) واحدة.
نستخدم خطين (سلكين) فقط في I2C لنقل البيانات بين الأجهزة كما هو الحال في UART وهما:
البيانات التسلسلية SDA (Serial Data): الخط المستخدم لنقل البيانات بين السيد والتابع.
نبضات الساعة التسلسلية SCL (Serial Clock): الخط الذي يحمل إشارة الساعة.
يُعَدّ I2C بروتوكول اتّصال متسلسل، لذلك تنقل البيانات بت (bit) بعد بت عبر خط واحد (خط SDA)، ويكون الاتّصال في I2C كما في SPI متزامن، أي أنّ البتات المخرجة متزامنة مع عينة من البتات عن طريق إشارة ساعة مشتركة بين التابع والسيد، ويتحكّم السيد دوماً بهذه الإشارة.
يبين الجدول التالي مواصفات I2C:
الخطوط المستخدمة | |
السرعة القصوى | الوضع القياسي =100 kbps |
الوضع السريع = 400 kbps | |
وضع السرعة العالية = 3.4 Mbps | |
وضع السرعة الفائقة = 5 Mbps | |
متزامنة أو غير متزامنة؟ | متزامنة |
متسلسلة أو متوازية؟ | متسلسلة |
العدد الأقصى للأسياد | لانهائي |
العدد الأقصى للخدم | 1008 |
كيف يعمل I2C
تُنقل البيانات في I2C عبر رسائل، وتنقسم هذه الرسائل إلى إطارات (frames) من البيانات؛ إذ تحتوي كلّ رسالة على إطار العنوان الذي يحتوي على العنوان الثنائي للتابع، إضافةً إلى بت أو أكثر يحتوي على البيانات المرسلة، كما تتضمّن الرسالة شرطي البدء والتوقف، وبتات القراءة/الكتابة، وبتات ACK/NACK (بتات تأكيد أو رفض استلام البيانات) بين كل جزء من البيانات:
شرط البدء: يتبدّل خط SDA من مستوى جهدٍ مرتفع إلى منخفض قبل تبدّل خط SCL من مستوى الجهد المرتفع إلى المنخفض.
شرط التوقُّف: يتبدّل خط SDA من مستوى جهد منخفض إلى مرتفع بعد أن تبدل خط SCL من مستوى الجهد المنخفض إلى المرتفع.
إطار العنوان: يحتوي على سلسلة مكونة من 7 أو 10 بتات فريدة لكل تابع، تُستخدم لتحديد التابع الذي يريد السيد التواصل معه.
بتّ القراءة/الكتابة: يتكوّن من بت واحد يحدّد ما إذا كان السيد يريد إرسال بيانات للتابع (مستوى الجهد منخفض) أو طلب بيانات منه (مستوى الجهد مرتفع).
بت ACK/NACK: يتبع كلّ جزء من الرسالة بت تأكيد/عدم تأكيد (acknowledge/no-acknowledge)، فعند استقبال جزء العنوان أو البيانات بنجاح يعيد الجهاز المستقبل إرسال بت ACK للجهاز المرسل.
العنونة
لا يوجد في I2C خطاً لاختيار التابع كالموجود في SPI، لذا يحتاج لطريقة أخرى لإعلام التابع بأنّ البيانات تُرسل إليه وليس لتابع آخر، ويحدثُ هذا عن طريق العنونَة، فيكون إطار العنوان هو الإطار الأول دوماً بعد بت البدء في أي رسالة جديدة.
يُرسل السيد عنوان التابع الذي يريد التواصل معه للتوابع المتصلة به كافّة، ليقوم كلّ تابع بمقارنة العنوان المرسل بعنوانه الخاص، فإذا تطابقت يقوم بإرسال بت ACK بجهدٍ منخفض للسيد، أمّا بقية التوابع فلا تفعل شيئاً ويبقى خط SDA بحالة الجهد المرتفع.
بت قراءة/كتابة
يحتوي إطار العنوان في نهايته على بت مسؤول عن إعلام التابع فيما إذا كان السيد يريد منه كتابة أو قراءة البيانات، في حال أراد السيد إرسال بيانات للخادم يكون بت القراءة/كتابة في حالة جهدٍ منخفض، أمّا إذا أراد طلب بيانات فيكون البت في حالة جهد مرتفع.
إطار البيانات
يصبح أول إطار بيانات جاهزاً للإرسال عند تلقي السيد بت ACK من التابع. يتكوّن إطار البيانات من 8 بتات، ويرسل البت الأكبر أولاً، ويتبع كلّ إطار بيانات بت ACK/NACK للتأكُّد من استلام الإطار بنجاح، ويجب استلام بت ACK من قبل التابع أو السيد (بناءً على مرسل البيانات) قبل إرسال الإطار التالي.
يمكن للسيد إرسال شرط التوقف للتابع بعد الانتهاء من إرسال جميع الإطارات، وشرط التوقف هو تحوّل في الجهد من الحالة المنخفضة إلى المرتفعة على خطّ SDA يتبع تحوّل مماثل من الحالة المنخفضة إلى المرتفعة على خط SCL مع بقاء خط SCL في الحالة المرتفعة.
خطوات نقل البيانات في I2C
- يرسل السيد شرطَ البدء للتوابع المتصلة به كافّة، وذلك بتبديل جهد الخط SDA من المرتفع إلى المنخفض قبل تبديل جهد SCL من مرتفع إلى منخفض:
- يرسل السيد عنوان التابع الذي يريد التواصل معه والذي يتكوّن من 7 أو 10 بتات لجميع التوابع إضافةً إلى بت القراءة/كتابة:
- يقوم كلّ تابع بمقارنة العنوان المُرسَل من قبل السيد مع عنوانه الخاص، فإذا كانا متطابقَين يرسل بت ACK ليعلم السيد بأنّه استلم الرسالة بنجاح، ويحدث ذلك عن طريق خفض جهد بت واحد على خط SDA، ويبقى الخطّ بحالة الجهد المرتفع في حالة التوابع الأخرى.
- يقوم السيد بإرسال أو استلام أوّل إطار من البيانات:
- يعيد الجهاز المستقبل بت ACK بعد كلّ عملية نقل لإطار من البيانات للمرسل لإعلامه بأنّه استلم الإطار بنجاح:
- يرسل السيد شرط التوقُّف للتابع لإيقاف تبادل البيانات، وذلك من خلال رفع جهد SCL ثم رفع SDA:
اتّصال سيد واحد بأكثر من تابع
يمكن لسيد واحد التحكم بأكثر من تابع في I2C باستخدام العنونة؛ إذ يوجد 128 (27) عنوان مختلف في حال استخدام عنوان مكوّن من 7 بتات، و1024 (210) عنوان مختلف في حال استخدام عنوان مكون من 10 بتات وهو غير شائع.
لوصل أكثر من تابع مع سيد واحد يجب أن تصل خطي SDA وSCL بالمنبع Vcc مع استخدام مقاومة رفع (4.7K Ohm):
اتّصال أكثر من سيد وتابع
يمكن وصل أكثر من سيد بتابع واحد أو مجموعة توابع، وتكمن مشكلة وجود أكثر من سيد لنفس النظام في حال محاولة سيدين إرسال أو استقبال البيانات في الوقت نفسه على خط SDA، ولحل هذه المشكلة يجب على كلّ سيد التحقّق فيما إذا كان الخط في حالة جهد مرتفع أو منخفض قبل إرسال رسالة، فإذا كان الخط بحالة الجهد المنخفض هذا يعني أن الخط مشغول ويُستعمل من قبل سيد آخر في هذا الوقت ويجب الانتظار، أمّا إذا كان الخط بحالة الجهد المرتفع يكون من الآمن إرسال الرسالة فوراً.
استخدم المخطط التالي لوصل مجموعة أسياد مع مجموعة توابع، مع مقاومة رفع (4.7K Ohm) تصل خطي SDA وSCL بالمنبع Vcc:
إيجابيات بروتوكول الاتصال I2C وسلبياته:
يمكن أن يبدو بروتوكول I2C معقداً مقارنةً ببروتوكولات الاتصال الأخرى، إلا أنّ هنالك العديد من الأسباب التي تحدّد رغبتك في استخدامه أم
الإيجابيات
- يستخدم سلكين فقط.
- يدعم استخدام أسياد وتوابع متعددة.
- يؤكّد بت ACK/NACK نجاح نقل البيانات.
- المعدات أقلّ تعقيداً من المستخدمة في UARTs.
- بروتوكول معروف وشائع الاستخدام
السلبيات
- أقلّ سرعة في نقل البيانات مقارنةً بـ SPI.
- حجم إطار البيانات محدد بـ 8 بت.
- يتطلّب معدات (Hardware) أكثر تعقيداً لتطبيقه مقارنةً بـ SPI.
ترجمة: | علي حمّود |
مراجعة: | أماني صالح |
تدقيق لغوي: | تيماء العبيد |
تحرير: | محمد حنان |