3.23. أساسيات I2C

إن I2C (Inter-Integrated Circuit، وتُنطق "I-squared-C" أو "I-two-C") ناقل تسلسلي ثنائي الأسلاك مصمم للوصلات قصيرة المدى بين الرقائق على اللوحة نفسها. ويقع بين SPI وUART من حيث الأولويات: أبطأ من SPI لكنه أكثر اقتصادًا في الدبابيس، ومُعنوَن (عدة أجهزة على السلكين نفسيهما) بينما يحتاج SPI إلى خط CS مخصص لكل جهاز.

إن I2C هو الناقل المفضل للمستشعرات منخفضة المعدل -- مقاييس التسارع، ومستشعرات الحرارة، ومستشعرات الرطوبة، ومقاييس المغناطيسية، والساعات اللحظية، وذواكر EEPROM -- حيث يكون توفير الدبابيس وتقليل تعقيد الناقل أهم من الإنتاجية الخام.

3.23.1. سلكان، كلاهما مفتوح المصرف

يحتوي ناقل I2C على إشارتين فقط:

  • SCL (الساعة التسلسلية). يدفعها المتحكم (في معظم الأوقات).

  • SDA (البيانات التسلسلية). يدفعها أيُّ جهاز يتحدث في تلك اللحظة -- المتحكم أثناء العنوان والبيانات الصادرة، والطرفية أثناء القراءات وبتات ACK.

كلا الخطين مفتوح المصرف: فبإمكان كل جهاز على الناقل سحب الخط إلى الأرضي لكنه لا يدفعه أبدًا إلى الحالة المرتفعة. وتجلب مقاومتا سحب لأعلى على الناقل (عادةً ما بين 2.2 و10 إلى قضيب التغذية) الخطين إلى الحالة المرتفعة عندما لا يسحبهما أحد إلى الحالة المنخفضة. وينتج سلوك OR-السلكي عن ذلك -- فأي جهاز يسحب الخط إلى الحالة المنخفضة يفوز، والحالة المرتفعة تعني ببساطة "لا أحد يتحدث".

عادةً ما تكون مقاومات السحب لأعلى الداخلية في المتحكم على دبوسي SCL وSDA غير قوية بما يكفي لتعمل بمفردها كمقاومات سحب لأعلى للناقل؛ وتُحتاج عادةً مقاومات خارجية على الناقل. وتتضمنها العديد من لوحات تفريع المستشعرات سلفًا؛ راجع ورقة البيانات قبل إضافة المزيد.

3.23.2. المعاملة

تتبع كل معاملة I2C الشكل نفسه:

SCL and SDA traces. SDA falls while SCL is high (START), then SCL clocks bytes on SDA -- a 7-bit address byte with a read/write bit and an ACK, then a register byte and an ACK, then a data byte and a NACK, then SDA rises while SCL is high (STOP).

معاملة I2C: START، عنوان من 7 بتات + R/W، ACK، سجل، ACK، بيانات، NACK، STOP.

يتكشف التبادل بتةً بتة:

  • START. يسحب المتحكم SDA إلى الحالة المنخفضة بينما لا تزال SCL مرتفعة. وتُخبر هذه الحافة غير المعتادة كل جهاز على الناقل بأن معاملةً على وشك أن تبدأ.

  • العنوان + R/W. يُوقِّت المتحكم خارجًا عنوان طرفية من 7 بتات متبوعًا ببت قراءة/كتابة واحد (0 للكتابة، و1 للقراءة).

  • ACK / NACK. بعد كل بايت، يدفع المستقبِل SDA لساعة واحدة ليصدر ACK (منخفضة) أو NACK (مرتفعة). وعلى بايت العنوان تُقر الطرفية إذا تعرفت على عنوانها الخاص؛ وإن لم يُقر أي جهاز، يرى المتحكم NACK ويعلم أن العنوان غير موجود على الناقل.

  • بايتات البيانات. يتبع كلًّا منها ACK من المستقبِل. ففي الكتابة، تُقر الطرفية كل بايت؛ وفي القراءة، يُقر المتحكم كل بايت يريد المزيد منه ويصدر NACK للبايت الأخير ليُخبر الطرفية بالتوقف.

  • STOP. يحرر المتحكم SDA إلى الحالة المرتفعة بينما SCL مرتفعة، منهيًا المعاملة.

البدء المتكرر هو START ثانٍ يُصدَر دون STOP بينهما -- إذ يبدِّل المتحكم الاتجاه (عنوان كتابة، ثم عنوان قراءة) على الطرفية نفسها دون التخلي عن الناقل.

3.23.3. العنونة

يغطي فضاء العناوين ذو 7 بتات النطاق 0x08 -- 0x77؛ والقيم عند الطرفين محجوزة لأغراض خاصة. ويُضبط عنوان كل جهاز من قِبل مصمم الرقاقة؛ وتسمح أجزاء كثيرة بتغيير بعض البتات المنخفضة على مستوى اللوحة (بربط دبوس بالحالة المرتفعة أو المنخفضة) كي يتمكن مستشعران من النوع نفسه من التواجد على الناقل نفسه.

إذا تشارك جهازان عنوانًا واحدًا فلا توجد طريقة للتحدث إلى أحدهما دون أن يتداخل الآخر، لذا راجع ورقة البيانات قبل إقران الأجزاء. وتمر i2c.scan() (المشروحة في I2C في الشيفرة) عبر فضاء العناوين وتُبلِّغ عن العناوين التي تستجيب، وهي الطريقة المعيارية لمعرفة ما هو موجود على الناقل.

3.23.4. نقاط القوة والضعف

تحدد نقاط قوة الناقل وضعفه مجاله المناسب:

  • دبوسان لأجهزة كثيرة. يمكن لزوج SCL/SDA واحد أن يحمل عشرات المستشعرات. بينما يحتاج SPI إلى دبوس CS إضافي لكل جهاز.

  • سرعات معيارية. تغطي 100 kHz ("الوضع المعياري") و400 kHz ("الوضع السريع") كل مستشعر تقريبًا. ويمكن بلوغ 1 MHz لكنها تبدأ بطلب المزيد من سعة الناقل وتحجيم مقاومات السحب لأعلى.

  • بطيء نسبةً إلى SPI. أي شيء ينقل أكثر من بضع مئات الكيلوبت في الثانية يستدعي SPI بدلًا منه.

  • تعارضات العناوين. وجود جهازين بالعنوان نفسه على ناقل واحد خطأ عتادي لا يستطيع البروتوكول الالتفاف حوله.