- ما هو بروتوكول الاتصال I2C؟
- كيف تعمل اتصالات I2C؟
- أين تستخدم اتصالات I2C؟
- I2C على Nuvoton N76E003 - متطلبات الأجهزة
- التفاعل مع AT24LC64 مع Nuvoton N76E003 - مخطط الدائرة
- دبابيس I2C على Nuvoton N76E003
- اتصالات I2C في N76E003
- برمجة N76E003 لاتصالات I2C
- وامض الكود والإخراج
في النظام الواسع للتطبيقات المضمنة ، لا يمكن لأي متحكم تنفيذ جميع الأنشطة بمفرده. في مرحلة ما من الوقت ، يتعين عليه الاتصال بأجهزة أخرى لمشاركة المعلومات ، وهناك العديد من أنواع بروتوكولات الاتصال المختلفة لمشاركة هذه المعلومات ، ولكن أكثرها استخدامًا هي USART و IIC و SPI و CAN. كل بروتوكول اتصال له ميزته وعيوبه. دعونا نركز على جزء IIC في الوقت الحالي لأن هذا هو ما سنتعلمه في هذا البرنامج التعليمي. إذا كنت جديدًا هنا ، فراجع دروس Nuvoton التعليمية حيث ناقشنا كل طرف من وحدات التحكم الدقيقة N76E003 من البرنامج التعليمي الأساسي للبدء. إذا كنت تريد معرفة كيفية استخدام I2C مع متحكمات أخرى ، يمكنك التحقق من الروابط أدناه.
- كيفية استخدام I2C في Arduino: الاتصال بين لوحتي Arduino
- اتصال I2C مع متحكم PIC PIC16F877
- واجهات 16X2 LCD مع ESP32 باستخدام I2C
- اتصال I2C مع MSP430 Launchpad
- واجهات شاشات الكريستال السائل مع NodeMCU دون استخدام I2C
- كيفية التعامل مع الاتصالات المتعددة (I2C SPI UART) في برنامج واحد من Arduino
I2C هو بروتوكول اتصال مهم تم تطويره بواسطة Philips (الآن NXP). باستخدام بروتوكول I2C هذا ، يمكن توصيل MCU بأجهزة متعددة وبدء الاتصال. تعمل I2C مع سلكين فقط ، هما SDA و SCL. حيث SDA تعني البيانات التسلسلية و SCL تعني الساعة التسلسلية. ومع ذلك ، يتطلب هذان الطرفان مقاومات سحب إلى مستوى الجهد VCC ومع وجود مقاوم سحب مناسب ، يمكن أن يدعم الناقل 127 جهازًا بعنوان فريد.
ما هو بروتوكول الاتصال I2C؟
يشير المصطلح IIC إلى " الدوائر المتكاملة المشتركة ". يُشار إليه عادةً باسم I2C أو I تربيع C أو حتى على أنه بروتوكول واجهة بسلكين (TWI) في بعض الأماكن ، لكن كل هذا يعني نفس الشيء. I2C هو بروتوكول اتصال متزامن بمعنى أن كلا الجهازين اللذين يتشاركان المعلومات يجب أن يشتركان في إشارة ساعة مشتركة. يحتوي على سلكين فقط لمشاركة المعلومات ، أحدهما يستخدم لإشارة الساعة والآخر يستخدم لإرسال واستقبال البيانات.
كيف تعمل اتصالات I2C؟
تم تقديم اتصال I2C لأول مرة بواسطة Phillips. كما ذكرنا سابقًا ، يحتوي على سلكين ، وسيتم توصيل هذين السلكين عبر جهازين. هنا أحد الأجهزة يسمى رئيسي والآخر يسمى العبد. يجب أن يحدث الاتصال وسيحدث دائمًا بين اثنين ، السيد والعبد. ميزة اتصال I2C هي أنه يمكن توصيل أكثر من عبد واحد بالسيد.
يتم الاتصال الكامل من خلال هذين السلكين وهما الساعة التسلسلية (SCL) والبيانات التسلسلية (SDA).
Serial Clock (SCL): يشارك إشارة الساعة التي تم إنشاؤها بواسطة السيد مع التابع
Serial Data (SDA): يرسل البيانات من وإلى السيد والعبد.
في أي وقت ، سيتمكن السيد فقط من بدء الاتصال. نظرًا لوجود أكثر من عبد واحد في الحافلة ، يتعين على السيد أن يشير إلى كل عبد باستخدام عنوان مختلف. عند تناول المرهم فقط بهذا العنوان المعين سيرد بالمعلومات بينما يلتزم الآخرون الصمت. بهذه الطريقة ، يمكننا استخدام نفس الناقل للتواصل مع أجهزة متعددة.
أين تستخدم اتصالات I2C؟
يستخدم اتصال I2C فقط للاتصال قصير المدى. إنها بالتأكيد موثوقة إلى حد ما لأنها تحتوي على نبض ساعة متزامن لجعلها ذكية. يستخدم هذا البروتوكول بشكل أساسي للتواصل مع المستشعر أو الأجهزة الأخرى التي يتعين عليها إرسال المعلومات إلى السيد. يكون مفيدًا جدًا عندما يتعين على المتحكم الدقيق الاتصال بالعديد من الوحدات التابعة الأخرى باستخدام الحد الأدنى من الأسلاك فقط. إذا كنت تبحث عن اتصال بعيد المدى ، فيجب أن تجرب RS232 وإذا كنت تبحث عن اتصال أكثر موثوقية ، فعليك تجربة بروتوكول SPI.
I2C على Nuvoton N76E003 - متطلبات الأجهزة
نظرًا لأن متطلبات هذا المشروع هي تعلم اتصال I2C باستخدام N76E003 ، فسوف نستخدم EEPROM الذي سيتم توصيله بخط بيانات I2C. سنخزن بعض البيانات في EEPROM ونقرأها أيضًا ونعرضها باستخدام شاشة UART.
نظرًا لأنه ستتم طباعة القيمة المخزنة في UART ، فإن أي نوع من محول USB إلى UART مطلوب. يمكنك أيضًا التحقق من البرنامج التعليمي على UART مع Nuvoton إذا كنت جديدًا على اتصال UART على N76E003. لتطبيقنا ، سوف نستخدم CP2102 UART لتحويل USB. بخلاف ما سبق ، نطلب أيضًا المكونات التالية-
- إيبروم 24C02
- 2 قطعة 4.7 كيلو مقاومات
ناهيك عن أنه بخلاف المكونات المذكورة أعلاه ، نحتاج إلى لوحة تطوير تعتمد على متحكم N76E003 بالإضافة إلى Nu-Link Programmer. بالإضافة إلى ذلك ، فإن أسلاك التوصيل واللوح مطلوبة أيضًا لتوصيل جميع المكونات.
التفاعل مع AT24LC64 مع Nuvoton N76E003 - مخطط الدائرة
كما نرى في المخطط أدناه ، فإن EEPROM متصل في خط I2C مع اثنين من مقاومات السحب. في أقصى اليسار ، يظهر اتصال واجهة البرمجة.
لقد استخدمت لوح التجارب لـ AT24LC64 IC وقمت بتوصيل IC بلوحة مبرمج nuvoton الخاصة بي باستخدام أسلاك توصيل. يظهر أدناه إعداد الجهاز مع مبرمج الحبر nu-ink.
دبابيس I2C على Nuvoton N76E003
يمكن رؤية مخطط دبوس N76E003 في الصورة أدناه-
كما نرى ، كل دبوس له مواصفات مختلفة ويمكن استخدام كل دبوس لأغراض متعددة. ومع ذلك ، يتم استخدام الدبوس 1.4 كدبوس I2C SDA ، وسوف يفقد PWM والوظائف الأخرى. لكن هذه ليست مشكلة حيث أن وظيفة أخرى غير مطلوبة لهذا المشروع. نفس الشيء سيحدث لـ P1.3 هو دبوس SCL لـ I2C.
نظرًا لأن دبابيس I2C تعمل بمثابة GPIO ، فيجب تكوينها. يمكن تكوين جميع دبابيس GPIO في الوضع الموضح أدناه.
وفقًا لورقة البيانات ، PxM1.n و PxM2. n عبارة عن مسجلين يتم استخدامهما لتحديد عملية التحكم في منفذ الإدخال / الإخراج. في ورقة البيانات ، تم التأكيد على أنه لاستخدام وظيفة I2C ، يجب استخدام أوضاع الإدخال / الإخراج كصرف مفتوح للاتصالات ذات الصلة بـ I2C.
اتصالات I2C في N76E003
يعد الجهاز المحيطي I2C أمرًا مهمًا لأي وحدة متحكم تدعم ميزات I2C. تأتي العديد من أنواع وحدات التحكم الدقيقة المختلفة مزودة بطرف I2C مدمج. ومع ذلك ، في بعض الحالات ، يمكن تكوين I2C يدويًا باستخدام التحكم في البرامج حيث لا يتوفر دعم الأجهزة المتعلقة بـ I2C (على سبيل المثال ، العديد من وحدات التحكم الدقيقة 8051). ومع ذلك ، فإن nuvoton N76E003 يأتي مع دعم I2C المحيطي.
يدعم M76E003 أربعة أنواع من العمليات في أوضاع I2C - Master Transmitter و Master Receiver و Slave Transmitter و Slave Receiver. كما أنه يدعم سرعات قياسية (100 كيلوبت في الثانية) وسريعة (تصل إلى 400 كيلوبت في الثانية) لخط I2C. تعمل I2C مع بعض القواعد العامة في خطوط إشارة SCL و SDA.
بدء وإيقاف الشرط:
إنه شيء مهم في اتصالات I2C. عندما يتم نقل البيانات إلى خط I2C ، فإنها تبدأ بحالة البداية وتنتهي بحالة التوقف.
حالة البدء هي الانتقال من الأعلى إلى المنخفض على SDA عندما يكون خط SCL مرتفعًا وحالة التوقف هي الانتقال من المنخفض إلى العالي على SDA عندما يكون خط SCL مرتفعًا. يتم إنشاء هذين الشرطين من قبل السيد (MCU أو أي شيء يتحكم في الأجهزة التابعة الأخرى). يظل خط الناقل مشغولاً في هذه الحالة عند بدء حالة البدء ويظل حراً مرة أخرى عند بدء حالة التوقف.
يتم عرض حالة البدء والإيقاف بشكل ممتاز في منظور الإشارة في ورقة البيانات N76E003-
عنوان 7 بت مع تنسيق البيانات:
يدعم N76E003 عنوان 7 بت وتنسيق بيانات. بعد بدء حالة البدء ، يحتاج الجهاز الرئيسي إلى إرسال البيانات إلى خط I2C. البيانات الأولى مهمة. إذا لم يتم إنشاء هذه البيانات أو إرسالها بشكل صحيح ، فلن يتم تحديد الجهاز المتصل ولا يمكن إجراء اتصالات أخرى.
تتكون البيانات من عنوان تابع بطول 7 بت ، يُشار إليه باسم SLA. يجب أن يكون هذا العنوان الطويل المكون من 7 بت فريدًا لكل جهاز إذا تم توصيل عدة أجهزة على الناقل. بعد العنوان ذي 7 بتات ، تكون البتة الثامنة هي بت اتجاه البيانات. هذا يعني ، اعتمادًا على البتة الثامنة ، يرسل السيد المعلومات إلى الجهاز التابع حول ما إذا كانت البيانات ستتم كتابتها في الجهاز التابع أم ستتم قراءة البيانات من الجهاز التابع. البتة الثامنة هي بت R / W يشار إليها باسم منبه القراءة أو الكتابة. كما نعلم جميعًا ، يمكن أن تكون معلومات 8 بت 128 نوعًا ، وبالتالي تدعم 128 جهازًا ، لكن I2C يدعم 127 نوعًا من الأجهزة على نفس الناقل ولكن ليس 128. لأن عنوان 0x00 هو عنوان محجوز يسمى عنوان مكالمة عام. إذا كان السيد يريد إرسال المعلومات إلى جميع الأجهزة ،سيعالج 0x00 وسيُعاد تشغيل كل جهاز بنفس الطريقة وفقًا لتكوينات البرامج الفردية.
وبالتالي ، يبدو نقل البيانات كما يلي-
الإقرار:
في صورة عنوان البيانات أعلاه ، يسمى بت 9 متبوعًا بتة R / W بت التسلم. إنه أمر مهم لأنه باستخدام هذا البت ، يستجيب السيد أو العبد لجهاز إرسال البيانات عن طريق سحب خط SDA منخفضًا. للحصول على بت الاستلام ، يحتاج جهاز الإرسال إلى تحرير خط SDA.
برمجة N76E003 لاتصالات I2C
يمكن العثور على البرنامج الكامل المستخدم في هذا البرنامج التعليمي في أسفل هذه الصفحة. شرح المقاطع المهمة في الكود كالتالي-
قم بتعيين الدبابيس كمصفاة مفتوحة وقم بتكوينها لـ I2C:
لنبدأ بقسم دبوس I2C أولاً. كما هو موضح سابقًا ، يجب تكوين منافذ I2C SCL و SDA وتعيينها على أنها تكوين الصرف المفتوح. للقيام بذلك، ونحن تستخدم ملف الرأس I2C.h جنبا إلى جنب مع ملف مصدر I2C.c . يبدو مقتطف الشفرة هكذا-
افعل {P13_OpenDrain_Mode ؛ P14_OpenDrain_Mode ؛ clr_I2CPX؛} بينما (0)
يقوم الكود أعلاه بتعيين P13 و P14 كدبوس Open-Drain ويستخدم clr_I2CPX لتحديد P13 و P14 كدبوس SCL على P1.3 و SDA pin على P1.4.
هذا I2CPX هو بت 0 من I2C سجل التحكم I2CON. إذا تم تعيين I2C_PX على 1 ، يتم تغيير المسامير إلى P0.2 كـ SCL و P1.6 كـ SDA. ومع ذلك ، سوف نستخدم P13 و P14. دبابيس بديلة لا تستخدم هنا.
I2C Control Register I2CON:
سجل التحكم I2C يستخدم I2CON للتحكم في عمليات I2C. البتة الأولى هي بت تحديد دبوس I2C. يؤدي ضبطه على 0 إلى تكوين دبوس I2C كـ P13 و P14.
AA بت هي علامة تأكيد الإقرار ، إذا تم تعيين علامة AA ، فسيتم إرجاع ACK أثناء نبضة ساعة الاستلام لخط SCL. إذا تم مسحه ، فسيتم إرجاع NACK (المستوى العالي على SDA) أثناء نبض الساعة المعترف به لخط SCL.
البتة التالية هي SI وهي مقاطعة حالة I2C. إذا تم تمكين مقاطعة حالة I2C ، يجب على المستخدم التحقق من سجل I2STAT لتحديد الخطوة التي تم اجتيازها ويجب عليه اتخاذ الإجراء.
STO هي علامة STOP التي يتم تعيينها في الوضع الرئيسي. يتم مسح STO تلقائيًا بواسطة الأجهزة بمجرد اكتشاف حالة STOP .
البتة التالية هي بت STA. إذا تم تعيين هذه العلامة ، فإن I2C تنشئ حالة START إذا كانت الحافلة مجانية. إذا كانت الحافلة مشغولة ، ينتظر I2C حالة STOP وينشئ حالة START التالية. إذا تم ضبط STA بينما يكون I2C في الوضع الرئيسي بالفعل وتم إرسال أو استقبال بايت واحد أو أكثر ، فإن I2C يولد حالة START متكررة. يحتاج البرنامج إلى مسح STA يدويًا.
آخر واحد ، I2CEN هو بت تمكين أو تعطيل ناقل I2C.
إيبروم 24C02:
الآن ، قادمًا إلى 24C02. تحتوي حزمة دعم اللوحة N76E003 على رمز I2C لـ 24LC64 ويمكن تعديله بسهولة. ومع ذلك ، سوف نستخدم طريقة بسيطة لفهم وظيفة I2C.
إذا أراد أي شخص استخدام واجهة تفصيلية مع EEPROM 24C02 ، فيمكن استخدام برنامج EEPROM في BSP.
سنقوم فقط بتوصيل 24C02 في I2C حيث سيكون N76E003 سيدًا وسيكون EEPROM تابعًا. وبالتالي ، سنكتب أي بيانات في عنوان EEPROM ونقرأها.
يظهر 24C02 EEPROM pinout أدناه-
A0 و A1 و A2 عبارة عن ثلاثة دبابيس لتحديد العناوين. دبابيس WP هي دبابيس حماية ضد الكتابة وتحتاج إلى الاتصال بـ VSS لتمكين الكتابة في EEPROM.
تظهر وظيفة Byte Write في الصورة أدناه-
تحدث دورة الكتابة الكاملة مع بت البداية. بعد ذلك ، يجب إرسال بايت التحكم. في بايت التحكم ، الأشياء التالية مطلوبة-
بعد بت البداية ، تتكون من عنوان الرقيق. 1010 هو العنوان الثابت و A0 و A1 و A2 هو العنوان المستند إلى اتصال الأجهزة. إذا كانت الدبابيس الثلاثة متصلة بمورد GND أو VSS ، فسيتم قراءتها على أنها 0. وإلا ، إذا كانت متصلة بـ VCC ، فسيتم قراءتها على النحو التالي. في حالتنا ، جميع A0 و A1 و A2 متصلة بـ VSS. وبالتالي كل هذه ستكون 0.
الإنفاق على شرط القراءة أو الكتابة. ستكون قيمة العنوان باستخدام بت القراءة أو الكتابة هي - 0xA0 للكتابة و 0xA1 للقراءة. التالي هو بت الإقرار وبعد ذلك ، سيتم إرسال عنوان 8 بت حيث يجب تخزين البيانات وأخيراً البيانات التي سيتم تخزينها في الموقع المعني. تتم هذه الأشياء بتنسيق خطوة بخطوة في الوظيفة الرئيسية.
الوظيفة الرئيسية وأثناء التكرار:
باطل رئيسي (باطل) {char c = 0x00 ؛ الأولي UART0_Timer3 (115200) ؛ TI = 1 ؛ // هام ، يجب استخدام وظيفة prinft تعيين TI = 1 ؛ I2C_init () ، بينما (1) {EEPROM_write (1،0 × 55) ؛ ج = EEPROM_read (1) ، printf ("\ n القيمة المقروءة هي٪ x"، c & 0xff)؛ } ؛ }
الوظيفة الرئيسية بسيطة ، فهي تكتب القيم باستمرار إلى EEPROM في العنوان 1 وقراءة البيانات. ثم يتم طباعة البيانات باستخدام وظيفة printf. يقوم printf بطباعة القيمة بالنظام السداسي.
تتكون وظيفة الكتابة EEPROM من الأشياء التالية التي تم وصفها في قسم EEPROM-
EEPROM_write باطلة (عنوان حرف غير موقع ، قيمة حرف غير موقعة) {I2C_start () ؛ I2C_write (0xA0) ؛ I2C_write (العنوان) ؛ I2C_write (القيمة) ؛ I2C_stop () ، }
تتكون وظيفة بدء I2C من الأشياء التالية-
I2C_start باطل (باطل) {وقت int = مهلة ؛ مجموعة_STA ؛ clr_SI ؛ while ((SI == 0) && (time> 0)) {time-- ؛ } ؛ }
في هذه الوظيفة ، يتم التحقق من حالة SI جنبًا إلى جنب مع فترة المهلة المحددة مسبقًا (المحددة في I2Ch حيث يتم تعيين الوقت المحدد مسبقًا على 1000). تبدأ وظيفة البدء بضبط STA ومسح SI.
I2C_stop باطل (باطل) {وقت int = timeout ؛ clr_SI ؛ مجموعة_STO ؛ while ((STO == 1) && (time> 0)) {time-- ؛ } ؛ }
يتم استخدام نفس وظيفة البدء والإيقاف. و توقف يبدأ الوظيفة عن طريق إعداد STO تليها تطهير SI. الوظيفة أدناه هي وظيفة قراءة I2C-
char I2C_read غير الموقعة (char ack_mode غير موقعة) {وقت int = timeout ؛ قيمة char غير الموقعة = 0x00 ؛ مجموعة_AA ؛ clr_SI ؛ بينما ((SI == 0) && (t> 0)) {time-- ؛ } ؛ القيمة = I2DAT ؛ إذا (ack_mode == I2C_NACK) {t = timeout_count ؛ clr_AA ؛ clr_SI ؛ بينما ((SI == 0) && (t> 0)) {time-- ؛ } ؛ } قيمة الإرجاع؛ }
و ack_mode و I2C_NACK ، سواء تم تعريفها في ملف الرأس I2C ك 0 و 1 على التوالي.
وبالمثل ، يتم إنشاء وظيفة الكتابة-
I2C_write باطلة (قيمة حرف غير موقعة) {موقّع int time = timeout ؛ I2DAT = قيمة ؛ clr_STA ؛ clr_SI ؛ while ((SI == 0) && (time> 0)) {time-- ؛ } ؛ }
وامض الكود والإخراج
أعاد الكود 0 تحذير و 0 أخطاء وتم وميضه باستخدام طريقة الوميض الافتراضية بواسطة Keil. إذا كنت جديدًا ، فراجع دليل بدء استخدام nuvoton لفهم كيفية تحميل الكود. يمكن العثور على معلومات تجميع الشفرة أدناه.
إنشاء الهدف 'I2C_EEPROM' الذي يجمع I2C_EEPROM.c… تجميع I2C.c… ربط… حجم البرنامج: data = 59.2 xdata = 0 code = 2409 إنشاء ملف سداسي عشري من ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 خطأ (أخطاء) ، 0 تحذير (تحذيرات). وقت الإنشاء المنقضي: 00:00:04 ملخص إصدار الدُفعة: نجح 1 ، فشل 0 ، تم تخطي 0 - الوقت المنقضي: 00:00:04
يتم إعداد الجهاز على لوحة توصيل ويعمل بالشكل المتوقع. كما ترى في الصورة أدناه ، تمكنا من كتابة قيمة على EEPROM وقراءتها مرة أخرى من الذاكرة وعرضها على الشاشة التسلسلية.
تحقق من الفيديو أدناه للحصول على شرح كامل لكيفية عمل اللوحة لهذا الرمز. آمل أن تكون قد استمتعت بالبرنامج التعليمي وتعلمت شيئًا مفيدًا إذا كان لديك أي أسئلة ، اتركها في قسم التعليقات أدناه. يمكنك أيضًا استخدام منتدياتنا لنشر أسئلة فنية أخرى.