جدول المحتويات:

I2C Bus for ATtiny و ATmega: 8 خطوات
I2C Bus for ATtiny و ATmega: 8 خطوات

فيديو: I2C Bus for ATtiny و ATmega: 8 خطوات

فيديو: I2C Bus for ATtiny و ATmega: 8 خطوات
فيديو: #20 Tutorial: Multiple Devices on One Arduino I2C Bus 2024, يوليو
Anonim
I2C Bus لـ ATtiny و ATmega
I2C Bus لـ ATtiny و ATmega

أنا أحب ميكروكنترولر Atmel AVR! منذ بناء نظام تطوير الغيتو الموضح في هذا Instructable ، لم أستمتع بتجربة AVR ATtiny2313 و ATmega168 على وجه الخصوص. حتى أنني ذهبت إلى حد كتابة Instructable حول استخدام المفاتيح كمدخلات ، ووسعت مفهوم Ghetto Development System ليشمل CPLD. خلال مشروع حديث ، كنت بحاجة إلى عدة مفاتيح لضبط قيم التحكم. لم يكن لدى AVRs ما يكفي من دبابيس الإدخال / الإخراج ، لذلك كان علي التفكير في شيء ما. كان بإمكاني تجربة نظام إدخال معقد مع لوحة مفاتيح وشاشة عرض ، لكن ATtiny2313 كان من الممكن أن ينفد من الموارد. لحسن الحظ ، قدم Atmel طريقة للتغلب على هذه المشكلة من خلال تضمين واجهة يمكنها الارتباط بشرائح إضافية (مثل الذاكرة أو منافذ الإدخال / الإخراج) بواجهة بسيطة ثنائية الأسلاك. هذا صحيح ، باستخدام دبابيس I / O فقط على AVR ، يمكننا الوصول إلى العديد من دبابيس الإدخال / الإخراج الإضافية ، والموارد الأخرى أيضًا. تُعرف واجهة السلكين هذه رسميًا باسم ناقل Inter-Integrated Circuit ، أو مجرد ناقل I2C وقد اخترعته NXP عندما كانت لا تزال Philips Semiconductors. إذا كنت تقرأ هذا Instructable ، فمن المحتمل أنك سمعت عن ناقل I2C وربما استخدمته على PIC أو متحكم آخر. على الرغم من كونها بسيطة للغاية من الناحية المفاهيمية ، ومدعومة بمصادر الأجهزة الموجودة في AVRs ، إلا أن برامج تشغيل البرامج لا تزال ضرورية لاستخدام ناقل I2C. يوفر Atmel ملاحظات التطبيق (انظر الموارد لاحقًا في هذا Instructable) ، ولكن هذه غير مكتملة ولا تظهر أي أمثلة تتجاوز الاتصال بجهاز AVR آخر. ليس الغرض من هذا Instructable تعليم أي شخص كيفية إنشاء برامج تشغيل I2C لـ AVRs. بدلاً من ذلك ، سأقدم إصدارات موسعة من برامج تشغيل Atmel لأجهزة ATtiny2313 و ATmega168 ، وسأشرح المتطلبات والقيود التي تنطبق عند استخدام هذه ، وسأعرض لك أمثلة عملية لأجهزة I2C. بعد العمل من خلال Instructable ، ستتمكن من استخدام ناقل I2C بنجاح في مشاريع AVR الخاصة بك. من الواضح أنه يمكنك تجاهل برامج التشغيل الصغيرة أو MEGA إذا كنت مهتمًا بواحد منهم فقط. للراغبين في معرفة المزيد عن حافلة I2C ، سأقدم روابط إلى المواد المناسبة.

الخطوة 1: ما كل هذا I2C Stuff على أي حال؟

ما كل هذه الأشياء I2C على أي حال؟
ما كل هذه الأشياء I2C على أي حال؟
ما كل هذه الأشياء I2C على أي حال؟
ما كل هذه الأشياء I2C على أي حال؟
ما كل هذه الأشياء I2C على أي حال؟
ما كل هذه الأشياء I2C على أي حال؟
ما كل هذه الأشياء I2C على أي حال؟
ما كل هذه الأشياء I2C على أي حال؟

ناقل I2C عبارة عن اتصال بسيط ثنائي الأسلاك يمكنه ربط أجهزة متعددة معًا والسماح لها بتبادل البيانات. في أبسط أشكاله ، يوجد جهاز رئيسي واحد يتصل بأجهزة تابعة متعددة. جميع الأجهزة متصلة بالتوازي مع سلكي ناقل I2C. يُعرف السلكان باسم SCL و SDA. SCL هو خط الساعة ويتم التحكم فيه بواسطة الجهاز الرئيسي. SDA هو خط البيانات ثنائي الاتجاه. لنقل البيانات ، يرسل السيد عنوانًا تابعًا مع علم قراءة / كتابة بت واحد. إذا كانت الكتابة مطلوبة ، فسيستمر السيد في إرسال البيانات إلى العبد المقصود. إذا تم طلب قراءة ، فسوف يستجيب التابع بالبيانات. لتنسيق المعاملات ، يتم التعامل مع خطوط SCL و SDA بواسطة السيد والرقيق للإشارة إلى عدة شروط. وتشمل هذه START و STOP و ACK (إقرار) و NAK (بدون إقرار). يتم التعامل مع تفاصيل هذه الشروط من قبل السائقين. يمكن للمهوسين الحقيقيين بينك معرفة جميع التفاصيل في الروابط المقدمة في نهاية Instructable. المتطلبات الكهربائية بسيطة جدًا. يجب أن يستخدم السيد والعبيد نفس المستوى لـ Vcc ، ويجب توصيل الأسس ، ويجب سحب خطوط SCL و SDA إلى Vcc. يتم تحديد قيمة مقاومات السحب بدقة من خلال حساب يعتمد على السعة الإجمالية للحافلة ، ولكن يمكن عمليًا أن تكون أي قيمة بين 1.8 كيلو و 10 كيلو. أبدأ بـ 5.1K وأستخدم قيمًا أقل حتى تعمل. هذه ليست مشكلة عادة إلا إذا كان لديك الكثير من الأجهزة أو أطوال طويلة من الأسلاك بين الأجهزة. معدل البيانات الاسمي على ناقل I2C هو 100 كيلو بت / ثانية. معدلات 400 كيلو بت / ثانية ، 1 ميجابت / ثانية ، وأكثر ممكنة أيضًا ، لكنها غير مدعومة من قبل السائقين في هذا Instructable. ستعمل جميع أجهزة I2C بسرعة 100 كيلوبت / ثانية. يقوم كل من ATtiny2313 و ATmega168 بتنفيذ ناقل I2C بشكل مختلف. يستخدم ATtiny2313 أجهزة الواجهة التسلسلية العالمية (USI) - والتي يمكن استخدامها أيضًا لناقل SPI. يحتوي ATmega168 على أجهزة مخصصة لناقل I2C المعروف باسم Two Wire Interface (TWI). بمجرد كتابة برامج التشغيل ، تكون هذه الاختلافات في الغالب شفافة للمستخدم. يكمن أحد الاختلافات المهمة في البرنامج: يتم مقاطعة محرك ATmega168 I2C بينما لا يتم تشغيل محرك ATmega168 I2C. هذا يعني أن برنامج ATmega168 ليس مضطرًا إلى انتظار حدوث عمليات نقل بيانات I2C ، ولكنه يحتاج فقط إلى الانتظار قبل بدء عملية نقل أخرى ، أو حتى وصول البيانات من عملية القراءة. يجب أن توضح الأمثلة والمناقشة التي يجب اتباعها أن يكون طول عناوين I2C 7 بتات ، لذلك يمكن أن يكون هناك ما يصل إلى 127 جهازًا في الحافلة إذا كان لكل منها عنوان فريد. كما هو موضح في الشكل ، يتم إزاحة العنوان ذي 7 بتات لليسار بتة واحدة ويتم استخدام البت الأقل أهمية للإشارة إلى قراءة أو كتابة للجهاز على العنوان. وبالتالي فإن عنوان الرقيق الكامل هو 8 بت بايت. يتم تحديد العنوان الفعلي جزئيًا داخليًا للجهاز ولا يمكن تغييره (4 بتات الأكثر أهمية) ، ويتم تحديده جزئيًا بواسطة وحدات البت التي قد تكون متصلة بدبابيس الجهاز (3 بتات أقل أهمية) والتي يمكن ربطها بدرجة عالية أو منخفضة للتعيين عنوان محدد. يبدو الأمر محيرًا ، لكن مثالاً سيوضح ذلك. تُظهر ورقة البيانات PCA8574A أن أهم أربع وحدات بت لعنوان I2C ستكون دائمًا 0111. يتم تحديد البتات الثلاث التالية بواسطة الإعدادات الموجودة على المسامير AD0 و AD1 و AD2. يمكن ربط هذه المسامير بالأرض أو بمصدر الجهد الموجب (5 فولت) لتمثيل 0 أو 1 على التوالي. لذا فإن نطاق العناوين المحتملة هو 38 إلى 3F سداسي عشري ، كما هو موضح في الشكل الآخر من ورقة البيانات PCA8574. لذلك من خلال تغيير إعدادات بت العنوان ، يمكن أن يكون ما يصل إلى 8 PCA8574As على ناقل I2C في نفس الوقت. كل سوف يستجيب لعنوان الرقيق الخاص به فقط. إذا كانت هناك حاجة إلى المزيد من منافذ الإدخال / الإخراج ، فيمكن استخدام PCA8574. الاختلاف الوحيد بين PCA8574 و PCA8574A هو أن نطاق عناوين الرقيق I2C لـ PCA8574 يتراوح من 20 إلى 27 سداسي عشري. قد يكون تحديد عنوان جهاز معين مربكًا نظرًا لأن بعض أوراق البيانات تعتبر بت القراءة / الكتابة جزءًا من عنوان. اقرأ ورقة البيانات بعناية وتذكر أن عنوان الرقيق سيكون بطول 7 بتات. يجب التعامل مع بت القراءة / الكتابة بشكل منفصل. مرة أخرى ، سوف يساعد المثال. تشير ورقة البيانات الخاصة بـ 24C16 EEPROM التي سنجربها إلى أن أول (أهم) أربع بتات من عنوان الرقيق هي 1010. ويمكن تحديد البتات الثلاثة التالية بواسطة A0 و A1 و A2 ؛ لكن لاحظ أن ورقة البيانات تغطي أيضًا من 24C01 إلى 24C08 وهي وحدات EEPROM أصغر حجمًا. يوضح الشكل من ورقة البيانات أنه يتم تجاهل إعدادات بتات العنوان هذه مع زيادة الحجم ويتم تجاهلها تمامًا لـ 24C16. وهذا يعني أن البتات الثلاثة الأخيرة غير مهمة ويستخدم 24C16 حقًا جميع عناوين I2C التابعة من 50 إلى 57 سداسيًا عشريًا. سيعالج نطاق عناوين الرقيق أقسامًا مختلفة داخل 24C16. أول 256 بايت في العنوان 50 ساعة ، 256 بايت التالية عند 51 ساعة ، وهكذا حتى آخر 256 بايت عند 57 ساعة - بإجمالي 2 كيلو بايت. نظرًا لأن عنوان PCF8570 RAM الذي نجربه أيضًا موجود في هذا النطاق ، فلا يمكن استخدام 24C16 و PCF8570 معًا.

الخطوة 2: اطلب بعض أجهزة I2C

الآن بعد أن عرفت القليل عن I2C Bus وترغب في استخدامه ، فلماذا لا تطلب بعض أجهزة I2C لتجربتها الآن حتى تتمكن من الوصول إليك أثناء تجهيز البرنامج؟ تشتمل الأجهزة المناسبة على I / O Interface Expander (المفضل لدي) ، ذاكرة الوصول العشوائي الثابتة ، و EEPROM. هناك الكثير ، لكن هذه بداية رائعة. معالجات AVR التي سنستخدمها هي ATtiny2313 و Atmega168 (المستخدمة في Arduino). إذا كنت جديدًا على هؤلاء ، فقم بإلقاء نظرة على هذا Instructable الرائع للتعرف عليها وبناء نظام تطوير Ghetto الخاص بك. يوضح الرسم التخطيطي لـ ATmega168 في Instructable الحالي كيفية تنفيذ نظام تطوير Ghetto لهذا المعالج. كابل المنفذ المتوازي هو نفسه كبل ATtiny2313. (لم أجرب إصدار USB من Ghetto Development System ، لذلك لست متأكدًا من كيفية الوصول إلى ناقل I2C عليه. نفس الشيء بالنسبة لـ Arduino.) إليك أرقام جزء Digikey. Port Expander: IC I2C I / O الموسع 568-4236-5-NDRam: IC SRAM 256X8 W / I2C 568-1071-5-NDEEPROM: IC EEPROM SERIAL 16K CAT24C16LI-G-ND

الخطوة 3: برامج تشغيل I2C

فيما يلي أوصاف وظائف السائق لحافلة I2C. تم تطوير هذه باستخدام Atmel Apps Notes للمبتدئين. لم أكن لأفعل هذا بدونهم كقاعدة للبناء عليها. تم التطوير باستخدام WinAVR ومترجم دول مجلس التعاون الخليجي. يتم وصف قيود معدل الساعة أدناه لكل معالج. نظرًا لأنني غير قادر على اختبار جميع مجموعات نكهة المعالج / معدل الساعة الممكنة ، فسألتزم فقط بما يمكنني اختباره بالفعل وأحاول الإشارة إلى القيود والقيود ، وإليك وظائف السائق وكيفية استخدامها. يرجى إلقاء نظرة على الأمثلة لمزيد من التفاصيل ولرؤية الوظائف قيد الاستخدام في البرامج الكاملة. بالنسبة إلى ATtiny2313: متطلبات الساعة: تم تصميم برامج التشغيل لمعدل ساعة يبلغ 1 ميجاهرتز (المعدل الافتراضي) لـ ATtiny2313. إذا كنت ترغب في الجري بمعدلات أخرى ، فسيتعين عليك تعديل الثوابت في برامج التشغيل. أرسل لي إذا كنت بحاجة إلى مساعدة للقيام بذلك. يمكنك أيضًا الحصول على بعض التلميحات من ملاحظات تطبيقات Atmel في الروابط الموجودة في خطوة الموارد USI_TWI_Master_Initialise () تقوم هذه الوظيفة بتهيئة جهاز USI لتشغيل وضع I2C. اتصل به مرة واحدة في بداية البرنامج الخاص بك. تقوم هذه الوظيفة بإرجاع معلومات خطأ I2C ولا توجد أية وسيطات. نظرًا لأن هذه الوظيفة لا تعرض سوى رمز خطأ ، فأنا أستخدم الوظيفة TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) لإصدار وميض مؤشر LED للخطأ. تم تعريف رموز الخطأ في USI_TWI_Master.h. وإليك كيفية تسميتها: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () تُستخدم هذه الوظيفة لقراءة وكتابة بايت واحد على أجهزة I2C. كما أنها تستخدم لكتابة عدة بايت. هناك 6 خطوات لاستخدام هذه الوظيفة. حرف غير موقعة messageBuf (MESSAGEBUF_SIZE) ؛ 2) ضع العنوان التابع كأول بايت في المخزن المؤقت. انقلها قليلاً لليسار و OR في بت القراءة / الكتابة. لاحظ أن بت القراءة / الكتابة ستكون 1 للقراءة و 0 للكتابة. هذا المثال لقراءة. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (TRUE << TWI_READ_BIT) ، 3) عند القيام بالكتابة ، ضع البايت المراد كتابته في الموقع التالي في المخزن المؤقت.4) اتصل بوظيفة USI_TWI_Start_Read_Write باستخدام مخزن الرسائل المؤقت وحجم الرسالة كوسائط. temp = USI_TWI_Start_Read_Write (messageBuf، 2)؛ 5) يمكن اختبار القيمة المعادة (درجة الحرارة في هذه الحالة) لمعرفة ما إذا كان هناك خطأ. إذا كان الأمر كذلك ، يتم التعامل معها على النحو الذي تمت مناقشته أعلاه. انظر الأمثلة في البرامج.6) إذا تم طلب قراءة ، فستكون قراءة البايت في الموقع الثاني في المخزن المؤقت. إذا تمت كتابة عدة بايت (على سبيل المثال على جهاز ذاكرة) ، فيمكن استخدام نفس الإجراء. يختلف إعداد المخزن المؤقت واستدعاء الروتين قليلاً. سيكون البايت الثاني في المخزن المؤقت هو عنوان ذاكرة البداية المراد الكتابة إليه. ستكون البيانات المراد كتابتها بالبايتات اللاحقة. سيكون حجم الرسالة هو الحجم بما في ذلك جميع البيانات الصالحة. لذلك إذا تمت كتابة 6 بايت ، فسيكون حجم الرسالة 8 (عنوان الرقيق + عنوان الذاكرة + 6 بايت من البيانات). USI_TWI_Start_Random_Read () تُستخدم هذه الوظيفة لقراءة وحدات البايت المتعددة من جهاز I2C ، وعادة ما تكون ذات معنى فقط لـ ذكرى من نوع ما. استخدام هذا الروتين مشابه جدًا للروتين السابق ، مع استثناءين. لا يهم إعداد بت القراءة / الكتابة. سيؤدي استدعاء هذا الروتين دائمًا إلى إجراء عملية قراءة. يجب أن يكون حجم الرسالة 2 بالإضافة إلى عدد البايتات المراد قراءتها ، وفي حالة عدم حدوث أخطاء ، ستكون البيانات في المخزن المؤقت بدءًا من الموقع الثاني. تم تصميم برامج التشغيل بمعدل ساعة 4 ميجا هرتز لـ ATmega168. يوضح رمز المثال كيفية ضبط معدل الساعة هذا. إذا كنت ترغب في الجري بمعدلات أخرى ، فسيتعين عليك تعديل الثوابت في برامج التشغيل. أرسل لي بريدًا إلكترونيًا إذا كنت بحاجة إلى القيام بذلك. WI_Master_Initialise () تعمل هذه الوظيفة على تهيئة جهاز TWI لتشغيل وضع I2C. اتصل به مرة واحدة في بداية البرنامج الخاص بك. إنها ترجع باطلة ولا توجد حجج. تأكد من تمكين المقاطعات عن طريق استدعاء swi () بعد التهيئة. TWI_Get_State_Info () تقوم هذه الوظيفة بإرجاع معلومات خطأ I2C ويتم استخدامها في حالة حدوث خطأ أثناء معاملة I2C. نظرًا لأن هذه الوظيفة لا تعرض سوى رمز خطأ ، فأنا أستخدم الوظيفة TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) لإصدار وميض مؤشر LED للخطأ. تم تعريف رموز الخطأ في TWI_Master.h ، ولكن تم تعديلها للإشارة على مؤشر LED للخطأ. انظر رمز المثال للحصول على التفاصيل. إليك كيفية تسميتها: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) لاحظ أن التحقق من الأخطاء يتم عن طريق التأكد من اكتمال معاملة I2C (الوظيفة الموضحة أدناه) ثم اختبار بعض الشيء في كلمة الحالة العامة. وظيفتان تعملان بنفس الوظائف المقابلة الموصوفة أعلاه ولكن مع استثناءات قليلة. لا تُرجع أي قيم خطأ. لا يتم نقل البيانات المقروءة إلى المخزن المؤقت. سيتم القيام بذلك باستخدام الوظيفة الموضحة لاحقًا. عند استدعاء TWI_Start_Random_Read ، يجب أن يكون حجم الرسالة هو عدد بايتات البيانات المطلوبة بالإضافة إلى واحد ، وليس اثنين. بمعنى ، يتم بدء معاملات I2C ثم تنفيذها بشكل مستقل بينما يستمر الروتين الرئيسي في العمل. عندما يريد الروتين الرئيسي بيانات من معاملة I2C التي بدأها ، يجب أن يتحقق لمعرفة ما إذا كانت البيانات متاحة. الوضع هو نفسه بالنسبة لفحص الأخطاء. يجب أن يتأكد الروتين الرئيسي من اكتمال معاملة I2C قبل التحقق من الأخطاء. يتم استخدام الوظيفتين التاليتين لهذه الأغراض. WI_Transceiver_Busy () اتصل بهذه الوظيفة لمعرفة ما إذا كانت معاملة I2C قد اكتملت قبل التحقق من الأخطاء. تُظهر برامج الأمثلة كيفية استخدام this. TWI_Read_Data_From_Buffer () استدعاء هذه الوظيفة لنقل البيانات من المخزن المؤقت لتلقي برنامج تشغيل I2C إلى المخزن المؤقت للرسائل. ستعمل هذه الوظيفة على التأكد من اكتمال معاملة I2C قبل نقل البيانات. بينما يتم إرجاع قيمة بواسطة هذه الوظيفة ، أجد التحقق من بت الخطأ مباشرة ليكون أكثر موثوقية. إليك كيفية تسميتها. يجب أن يكون حجم الرسالة أكبر من عدد بتات البيانات المطلوبة. ستكون البيانات في messageBuf بدءًا من الموقع الثاني.

الخطوة 4: لنبني

لنبني!
لنبني!
لنبني!
لنبني!
لنبني!
لنبني!
لنبني!
لنبني!

ابدأ بتنزيل الملف I2C Schematics.zip. قد ترغب في إنشاء مجلد I2C في منطقة عملك للاحتفاظ بالمخططات ومثال ملفات البرامج. قم بفك ضغط الخطط في هذا الدليل. ستجد مجلدًا يسمى مخططات I2C. افتح الملف المسمى I2C.pdf الصغير. يوضح هذا التخطيطي ATtiny2313 Ghetto Development System و PCA8574A I / O Port Expander (يحتوي على مربع متقطع كبير حوله). تم بناء دائرة Port Expander على لوح توصيل. ألق نظرة على الصور لترى كيف تبدو هذه الدوائر. إنها حقًا بسيطة جدًا. جزء ATtiny2313 من المخطط هو مجرد نظام تطوير غيتو مع ثلاثة مصابيح وامضة (LED1 و 2 و 3 ، بالإضافة إلى R4 و 5 و 6) وزر ضغط (S1) مرتبط به ، بالإضافة إلى واحد تفاصيل إضافية. هذه التفاصيل هي إضافة وصلات العبور (JP4 و 5 و 6) التي يمكن إزالتها للسماح بتوصيل خطوط ناقل I2C SCL و SDA. يجب أن تكون وصلات العبور في مكانها للبرمجة ، ثم إزالتها بحيث يمكن توصيل SCL و SDA. تظهر الصور وصلات العبور في مكانها وإزالتها. إن وضع وصلات العبور هذه متروك لك ، ما عليك سوى وضعها على نظام تطوير Ghetto إذا كنت تريد استخدام ناقل I2C. يجب فصل ناقل I2C ووضع وصلات العبور في مكانها للبرمجة. لاحظ أنك تحتاج فقط إلى القلق بشأن JP4 و JP6 لحافلة I2C. ضع JP5 إذا كنت تعتقد أنك ستحتاج في أي وقت إلى استخدام ناقل SPI. يعد استخدام لوحة التوصيل في PCA8574A I / O Port Expander أمرًا بسيطًا للغاية. قم بتوفير توصيلات Vcc (+5 فولت) و Gnd (أرضي) وقم بتوصيل AD0 و 1 و 2 بالأرض (يجعل عنوان I2C التابع 38 ست عشري). ثم قم بتوصيل 4 مصابيح وامضة و 4 مفاتيح DIP. (إذا لم يكن لديك مفاتيح DIP ، يمكنك فقط استخدام الأسلاك. اربطها بالأرض أو اتركها عائمة للإشارة قيد التشغيل أو الإيقاف على التوالي.) أخيرًا ، قم بتوصيل مقاومات السحب (R11 و 12) من SDA و SCL إلى Vcc. تظهر هذه على أنها 3.3 كيلو ، ولكن أي قيمة من 1.8 كيلو إلى 5.1 كيلو يجب أن تعمل (ربما تصل إلى 10 كيلو لكني لم أجرب ذلك). بمجرد برمجة ATtiny2313 ، يمكنك إزالة وصلات العبور وتوصيل SDA و SCL للاختبار. التجعد الوحيد هنا هو أنك ربما لم تقم ببناء نظام تطوير غيتو لهذا المعالج. إذا كان الأمر كذلك ، فإن المخطط الذي أقدمه (MEGA I2C.pdf) سيوضح لك كيفية القيام بذلك. هذا مجرد تبديل لإصدار ATtiny2313. إذا كنت تخطط مسبقًا ، يمكنك التأكد من أن كابل البرمجة يناسب كلا النظامين. الفرق الرئيسي هو إضافة C2 و C3. انظر إلى الصور لوضعها ، يجب أن تكون قريبة جدًا من الشريحة ؛ واحد منهم في الواقع تحت الرقاقة. هذه تساعد على إبقاء الضوضاء بعيدًا عن المحول التناظري إلى الرقمي على وجه الخصوص. لا تحتاج إلى وضع وصلات العبور إلا إذا كنت تخطط لاستخدام ناقل SPI نظرًا لأنها ليست ضرورية لحافلة I2C على هذه الشريحة. لاحظ أنه لن يتم تغيير لوحة توصيل الدوائر PCA8754A. سوف تقوم فقط بتوصيل SDA و SCL وتذهب بعيدًا! سهل ، هاه؟

الخطوة 5: دعنا نبرمج ونختبر

دعونا نبرمج ونختبر!
دعونا نبرمج ونختبر!
دعونا نبرمج ونختبر!
دعونا نبرمج ونختبر!
دعونا نبرمج ونختبر!
دعونا نبرمج ونختبر!

حان الوقت لبناء برامج التشغيل وبرامج الأمثلة. سنبدأ باللوحة ATtiny2313 و PCA8574A التي أنشأناها للتو. قم بتنزيل الملف I2C.zip في دليل عمل I2C وفك ضغطه. سيكون لديك مجلد جديد يسمى I2C. ستجد فيه USI I2C (لـ ATtiny2313) و TWI I2C (لـ ATmega168). في USI I2C ، ستجد مجلد منفذ I_O. يحتوي هذا المجلد على رمز برنامج المثال الأول لدينا ، وبرامج التشغيل USI I2C. باستخدام WinAVR ، قم بترجمة الكود وتحميله في ATtiny2313. خذ نفسًا عميقًا وقم بتشغيل الطاقة. إليك ما يمكن توقعه: عند التشغيل ، يومض مؤشر LED 1 على المنفذ PD6 من ATtiny2313 مرتين ، ولن يحدث أي شيء آخر حتى تضغط على الزر (S1). في كل مرة يتم فيها الضغط على الزر ، تتم قراءة المفاتيح وسيتم عرض إعدادها على مصابيح LED المتصلة بـ PCA8574A. قم بتغيير قيمة المفاتيح ، واضغط على الزر ، ويجب أن تتغير مصابيح LED. استمر في القيام بذلك حتى تتغلب على التشويق برؤيتها تعمل. إذا (لا سمح الله!) الأشياء لا تعمل كما هو متوقع ، تحقق بعناية من الأسلاك الخاصة بك. سيتم الإشارة إلى أخطاء I2C من خلال وميض LED3 (PD4) وربما يعني أنك بحاجة إلى التحقق من أن SDA و SCL متصلان بالمسامير الصحيحة ويتم سحبهما بشكل صحيح.إذا لم تنجح الأمور ، فاقرأ بقية هذا القسم للتعرف على تصحيح الأخطاء ، والآن عد إلى الوراء ودعنا نلقي نظرة على الكود. افتح الملف USI_I2C_Port.c. هذا هو رمز البرنامج المثال. (يحتوي USI_TWI_Master.c و USI_TWI_Master.h على برامج التشغيل - يمكنك تجاهلها ما لم تكن فضوليًا.) استخدم المثال لتوجيه تطبيقات I2C الخاصة بك. في الغالب ، يوضح لك البرنامج كيفية تهيئة واستخدام برامج تشغيل I2C ، بما في ذلك الإعداد حتى العنوان التابع وبقية المخزن المؤقت للرسالة ، وإخراج البيانات منه. سترى أيضًا كيف أقوم بخفض الزر وإعداد حلقة while. هناك بعض التفاصيل عن البرنامج جديرة بالذكر. لاحظ أنه يتم عكس البيانات من المفاتيح قبل كتابتها إلى مصابيح LED الموجودة في Port Expander. لاحظ أيضًا أنه يجب كتابة منافذ الإدخال في Port Expander على أنها عالية لجعلها تعمل بشكل صحيح. هذه التفاصيل موصوفة في ورقة البيانات PCA8574A. قم دائمًا بقراءة أوراق البيانات بعناية! والأكثر أهمية هو استخدام التصحيح الشرطي. بالقرب من بداية ملف البرنامج توجد العبارة // # حدد DEBUG وتنتشر في جميع أنحاء الكود عبارة #ifdef DEBUG. طالما لم يتم تعريف DEBUG (تجعل الشرطتان المائلتان السطر تعليقًا ويمنعانه من التحديد) ، فلن يتم تجميع الكود الموجود في عبارات #ifdef إلى #endif. ولكن إذا لم تسر الأمور كما تتوقع ، فأعد ترجمة الكود وإعادة تحميله باستخدام #define DEBUG بدون تعليق. ستحصل على الكثير من الومضات على مصابيح LED والتي يمكنك فك تشفيرها لمتابعة تنفيذ برنامجك ومساعدتك في العثور على المكان الذي تسوء فيه الأمور بالضبط. في الواقع ، أوصيك بتجربة هذا فقط لترى ما سيحدث. ما ستراه هو أن مؤشر LED 2 (في PD5) سوف يومض مع تقدم التنفيذ من خلال البرنامج. سيتم وميض القيمة التي تمت قراءتها من المفاتيح على مؤشر LED 1 (PD6) قبل عرضها على مصابيح LED الخاصة بموسع المنفذ. يجب أن تكون قادرًا على تتبع البرنامج أثناء تشغيله باستخدام هذه المصابيح ، وسنعمل مع ATmega168 بعد ذلك ؛ تخطي هذا القسم إذا كنت مهتمًا فقط بـ ATtiny2313. مازلت معي؟ حسن. انتقل إلى مجلد TWI_I2C ، وقم بتغيير دليل العمل الخاص بك إلى IO_Port ، وقم بترجمة وتحميل TWI_I2C_Port.c في ATmega168. افصل خطوط SDA و SCL عن ATtiny2313 وقم بتوصيلها بـ ATmega168. قم بتوصيل الطاقة والأرض ، وتشغيل الطاقة. يجب أن تكون العملية هي نفسها! العب حتى تهدأ الإثارة ، ثم دعنا ننظر إلى الكود. افتح TWI_I2C_Port.c. الرمز متطابق تقريبًا باستثناء معالجة الأخطاء واستيعاب برامج التشغيل التي تعمل بالمقاطعة. فيما يلي الاختلافات: لاحظ أنه يجب ضبط الساعة على 4 ميجا هرتز حتى يعمل ناقل I2C بشكل صحيح. سي () ؛ بيان يتحول على المقاطعات بعد تهيئة السائقين I2C. للتحقق من وجود أخطاء ، يتم اختبار بت حالة معينة. أثناء القراءة ، يجب استدعاء وظيفة TWI_Read_Data_From_Buffer لنقل البيانات المقروءة إلى المخزن المؤقت للرسائل. أثناء الكتابة ، يجب استخدام (TWI_Transceiver_Busy ()) للتأكد من اكتمال النقل قبل التحقق من الأخطاء. تم وصف هاتين الوظيفتين أعلاه في وصف برامج التشغيل. بخلاف ذلك ، فإن الشفرة هي نفسها إلى حد كبير مثل ATtiny2313. يعمل DEBUG بالطريقة نفسها أيضًا إذا كنت تريد تجربة ذلك.

الخطوة السادسة: استخدام ذاكرة I2C

استخدام ذاكرة I2C
استخدام ذاكرة I2C
استخدام ذاكرة I2C
استخدام ذاكرة I2C
استخدام ذاكرة I2C
استخدام ذاكرة I2C
استخدام ذاكرة I2C
استخدام ذاكرة I2C

الآن بعد أن تعلمنا استخدام ناقل I2C لقراءة وكتابة I / O Port Expander ، دعنا ننتقل إلى استخدام ذكريات I2C ، كل من ذاكرة الوصول العشوائي و EEPROM. يتمثل الاختلاف الرئيسي في أنه يمكن قراءة وحدات البايت المتعددة أو كتابتها من الذكريات باستخدام أمر I2C واحد. للاستعداد لهذه التجارب ، نحتاج إلى تعديل الأجهزة قليلاً وبناء دائرتين جديدتين على لوح التجارب. احتفظ بدائرة Port Expander لأننا سنستخدمها لعرض بعض قيم الذاكرة. قم بإزالة مفاتيح DIP من PCA8574A وضع مصابيح وامضة على تلك المسامير. إذا لم يكن لديك ما يكفي من الأضواء الوامضة ، فقم بتحريك الأضواء الموجودة على P4 إلى P7 إلى P0 حتى P3. (القيم المراد عرضها صغيرة بما يكفي). الآن انظر إلى I2C Ram.pdf التخطيطي وقم بتوصيل PCF8570 على اللوح. الق نظرة على الصورة ايضا تأكد من ربط الدبوس 7 بـ Vcc. قم بتشغيل الأسلاك لـ SDA و SCL من PCA8574A. ليست هناك حاجة لمقاومات سحب إضافية. إذا كنت مهتمًا أيضًا بـ EEPROM ، فقم ببناء هذه الدائرة أيضًا باستخدام I2C EEPROM.pdf لـ 24C16 ، ولكن كن حذرًا من أن المثال يستخدم ATmega168. هذه الدائرة بسيطة حقًا. كما نوقش أعلاه ، يجب تجاهل بتات العنوان. فقط قم بتوصيل الطاقة والأرض. لا تقم بتوصيل SDA و SCL حتى الآن لأننا لم ننتهي من تجربة ذاكرة الوصول العشوائي. سنبدأ تجارب الذاكرة الخاصة بنا مع ATtiny2313 المتصل بـ PCA8574A Port Expander و PCF8570 Ram. سيقوم البرنامج بكتابة بعض الأرقام إلى ذاكرة الوصول العشوائي ، ثم قراءتها مرة أخرى وعرضها على Port Expander. قم بتغيير دليل العمل الخاص بك إلى RAM ضمن USI I2C. استخدم ملف التكوين لترجمة وتحميل USI_I2C_RAM.c. لاحظ أن ملفات برنامج تشغيل I2C مماثلة لتلك التي استخدمناها سابقًا. قم بتوصيل الطاقة وسترى وميض واحد على مؤشر LED 1 (PD6). ستتم كتابة البيانات في أول 4 بايت من الذاكرة. اضغط على الزر وستتم قراءة وحدتي بايت مرة أخرى وعرضها. يجب أن ترى ضوء LED واحدًا على Port Expander (P0) ، وقفة لمدة ثانيتين ، ثم مصباحان LED (P0 و P1). توقف لمدة ثانيتين أخريين ويجب أن تنطفئ مصابيح LED. اضغط على الزر مرة أخرى لبدء التسلسل. التصحيح مشابه للطريقة الموضحة أعلاه ، دعنا نلقي نظرة على الكود. افتح USI_I2C_RAM.c. يجب أن يبدو مشابهًا تمامًا للكود السابق. الاختلافات الرئيسية هي تفاصيل ذاكرة القراءة والكتابة. انظر إلى الطريقة التي يتم بها تحميل المخزن المؤقت للرسائل قبل المكالمة التي تقوم بالكتابة بالفعل. البايت الأول هو عنوان الرقيق مع تعيين بت القراءة / الكتابة بشكل مناسب. لكن البايت التالي هو عنوان الذاكرة الذي تبدأ عنده كتابة البيانات. ثم تأتي البيانات الفعلية التي سيتم تحميلها بالتسلسل في الذاكرة بدءًا من العنوان الذي حددناه. نحدد حجم الرسالة كـ 6. لذلك نبدأ الكتابة على العنوان 00 ونكتب القيم 01 و 03 و 02 و 06 في مواقع الذاكرة من 00 إلى 03. لقراءة البيانات مرة أخرى من الذاكرة ، يجب استخدام وظيفة USI_TWI_Start_Random_Read. يحصل المخزن المؤقت للرسائل على عنوان الرقيق في البايت الأول وعنوان البداية في البايت الثاني. ثم استدع الوظيفة مع ضبط حجم الرسالة على عدد البايتات للقراءة زائد 2. لاحظ أن بت القراءة / الكتابة لا يهم لأن القراءة ستتم بغض النظر. ستبدأ البيانات التي يتم إرجاعها في الموقع الثاني في مخزن الرسائل المؤقت. بمجرد قراءة البيانات ، يتم قلبها للعرض على Port Expander وكتابتها بايت واحد في كل مرة مع توقف مؤقت بين القيم. أخيرًا ، تم إيقاف تشغيل مصابيح Port Expander LED. عمليات الكتابة إلى Port Expander مطابقة لما تم القيام به في الأمثلة السابقة. من أجل المتعة ، يمكنك إلغاء التعليق على عبارة #define DEBUG على النحو الوارد أعلاه ورؤية الكثير من مصابيح LED الوامضة. مليئة بالإثارة بعد تجربة ناجحة أخرى ، دعنا ننتقل إلى ATmega168 و EEPROM. قم بتغيير دليل العمل الخاص بك إلى EEPROM ضمن TWI I2C. استخدم ملف الإنشاء لترجمة وتنزيل TWI_I2C_EEPROM.c. لاحظ أن ملفات برنامج تشغيل I2C مطابقة لتلك التي استخدمناها سابقًا لـ PCA8574A. لاختبار البرنامج ، افصل ATtiny2313 وقم بتوصيل ATmega168. اترك ناقل I2C موصلاً بذاكرة الوصول العشوائي وشغله. النتائج مختلفة لأننا نكتب الآن ونقرأ المزيد من البيانات. يجب أن يومض مؤشر LED 1 على PD7 عند التهيئة. اضغط على الزر وستتم قراءة البيانات مرة أخرى من الذاكرة وعرضها. يجب أن تومض مصابيح LED الموجودة على PCA8574 بالتسلسل التالي: P1، P0 & P2، (الكل متوقف)، P0 & P1، P1 & P2. أخيرًا ، يجب أن تنطفئ مصابيح LED الخاصة بالمنافذ. اضغط على الزر مرة أخرى لتكرار هذا ، لكن انتظر ، تقول. أليس هذا البرنامج لـ EEPROM؟ نظرًا لأننا نقوم بالوصول إلى جهاز ذاكرة على نفس عنوان I2C ، فإن نفس البرنامج يعمل لكل من ذاكرة الوصول العشوائي و EEPROM. أوقف الطاقة وانقل SDA و SCL من ذاكرة الوصول العشوائي إلى ذاكرة EEPROM وقم بتشغيل البرنامج مرة أخرى. يجب أن تعمل بالضبط نفس الشيء. لاحظ أنه لا يمكن توصيل EEPROM وذاكرة الوصول العشوائي بحافلة I2C في نفس الوقت لأنهما يشتركان في نفس العنوان. (قد يفكر الأشخاص الأذكياء منكم في تغيير بتات العناوين القابلة للبرمجة على ذاكرة الوصول العشوائي ، لكن هذا لا يزال غير ناجح. يستخدم 24C16 مجموعة العناوين الكاملة التي يمكن برمجتها من أجل ذاكرة الوصول العشوائي.) حسنًا ، دعنا ننظر إلى هذا البرنامج الأخير. افتح TWI_I2C_EEPROM.c. أول شيء يجب ملاحظته هو أنني أشرت إلى كيفية معالجة 24C16 EEPROM الكامل. يمكن الوصول إليه في كتل 256 بايت في 8 عناوين تابعة I2C مختلفة. انظر كيف يتم تعريف MEMORY_ADDR كعنوان البداية عند 50 سداسي عشري ؛ هذا هو سبب عمل الكبش. إذا كنت ترغب في الوصول إلى كتل أخرى من 24C16 ، فاستخدم العناوين الأخرى كما أشرت. ألق نظرة على كيفية إعدادي للكتابة في الذاكرة. أولاً يتم وضع عنوان الرقيق مع مجموعة بت القراءة / الكتابة في المخزن المؤقت ، ثم عنوان البداية 00 ، ثم 16 بايت من البيانات. يتم استدعاء الوظيفة TWI_Start_Read_Write لكتابة البيانات (كما كان من قبل) مع ضبط حجم الرسالة على 18. عند الضغط على الزر ، نستخدم TWI_Start_Random_Read و TWI_Read_Data_From_Buffer لقراءة البيانات مرة أخرى. يتم عرض كل بايت ثالث على مصابيح LED الخاصة بتوسيع المنفذ. أخيرًا ، يتم إيقاف تشغيل مصابيح LED في انتظار الضغط على الزر التالي. قد تتساءل لماذا اخترت كتابة 16 بايت. إذا قرأت ورقة البيانات بعناية ، فسترى أن 24C16 يقوم بدورة كتابة كلما استقبل 16 بايت حتى لو تم إرسال المزيد من البايتات. لذلك يبدو أن هذا رقم رائع للاستخدام. إذا اخترت زيادة هذا ، فسيتعين عليك تغيير حجم MESSAGEBUF_SIZE. سيكون عليك أيضًا تغيير القيمة TWI_BUFFER_SIZE في TWI_Master.h. وذلك لأن برنامج التشغيل ينسخ البيانات من المخزن المؤقت للرسائل لاستخدامها من قبل روتين خدمة المقاطعة. تهانينا! أنت الآن جاهز لاستخدام ناقل I2C في مشاريعك الخاصة!

الخطوة 7: موارد الويب

فيما يلي روابط لأوراق البيانات للأجزاء المستخدمة للتجارب. يجب أن تحصل عليها بالتأكيد إذا لم تحصل على أي شيء آخر. (إنهم يحبون استخدام الأقواس المربعة في عناوين URL الخاصة بهم ، لذلك لا يمكنني تضمينها هنا بشكل صحيح. معذرة.] للوصول إلى منطقة I2C ، حدد الواجهة من قائمة المنتجات. ستتمكن من الوصول إلى موقع I2C الخاص بهم و الوصول إلى جميع أوراق البيانات وملاحظات التطبيقات التي يقدمونها.يوجد هنا وصف ناقل I2C والتفاصيل الفنية على وجه الخصوص. احصل على أوراق بيانات ATtiny2313 و ATmega168 (دفاتر البيانات؟) من Atmel. ملاحظات تطبيق Atmel هنا. انظر إلى AVR310 و AVR315. احصل على الكود أيضًا ، ألق نظرة هنا لمزيد من عناصر I2C.

الخطوة 8: ملاحظات للمهوسين

بالنسبة للمهوس الحقيقي الذي يريد معرفة التفاصيل ، إليك بعض الأشياء التي يجب وضعها في الاعتبار إذا نظرت إلى Atmel Apps Notes ورمز برنامج التشغيل: - طريقة معالجة والتحكم في جهاز I2C ليست جزءًا من المواصفات! بخلاف عنوان الرقيق وبت القراءة / الكتابة ، لم يتم تحديد الأوامر والأوضاع وما إلى ذلك وهي خاصة بجهاز معين. لتوضيح ذلك تمامًا ، لاحظ أن المخطط المستخدم في مثال Atmel ينطبق فقط على هذا المثال ، وهو غير قياسي إلى حد كبير. - يختلف تطبيق USI عن تنفيذ TWI في بعض الطرق المهمة. + مع USI ، يتم توفير تسجيل الوقت بواسطة البرنامج ؛ مع TWI ، يتم توفيره بواسطة منشئ معدل البت. + طريقة USI لا تستخدم المقاطعات ؛ TWI يفعل. هذا أمر منطقي نظرًا لأن عائلة Mega (باستخدام TWI) يمكن أن تفعل الكثير من الأشياء الأخرى ولا ينبغي أن تتأثر بنقل I2C. من المؤكد أن إصدارًا مدفوعًا بالمقاطعة لـ USI ممكن ، لكنه لم يتم تنفيذه في Instructable. + لم يتم تحسين جهاز USI لـ I2C ويمكنه فقط التعامل مع عمليات نقل 8 بت. هذا يعني أنه يلزم إجراء عمليتي نقل لإرسال البت التاسع (إما NACK أو ACK). يتعامل جهاز TWI مع هذا تلقائيًا. هذا يجعل تنفيذ برنامج تشغيل USI أكثر تعقيدًا قليلاً. + يتم التعامل مع اكتشاف الأخطاء لـ TWI في الأجهزة. يتطلب USI التعامل مع البرامج مما يعقد الأمور إلى حد ما. + يتحكم جهاز TWI في تكوين المنفذ مباشرة. تتطلب أجهزة USI أن يتم تكوين بتات المنفذ قبل استخدام المنفذ. سترى هذا في روتين Master_Initialize لـ USI. - تدعي Atmel أنه من الممكن استخدام عمليات سحب منفذ AVR لعمليات سحب الحافلات I2C. لم أجد طريقة لجعل هذا النهج يعمل. يبدو استخدام مقاومين خارجيين مخططًا بسيطًا جدًا ، لذلك لم أقضي الكثير من الوقت في هذا الأمر.

موصى به: