geniusse01

اساسيات بروتوكول I2C لنقل البيانات

9 ردود في هذا الموضوع

السلام عليكم

قد تحتاج كثير من التطبيقات العملية الى ربط المتحكم (مثل البيك والاتمل وغيره) مع عناصر خارجية لاداء الوظيفة المطلوبة .. وكلما كان عدد الاطراف اللازمة للتوصيل اقل ما يمكن كلما كان هناك توفير في عدد اطراف المتحكم وبالتالي تستخدم لاداء الوظائف الاخرى للمشروع المطلوب .. حيث تعتمد هذه الطريقة على نقل الداتا بشكل تسلسلي من خلال الطرف المحدد لذلك.

من هنا كان اختيار بروتوكول الربط I2C من اكثر الطرق المستخدمة للربط بين المتحكمات وبين العناصر الالكترونية المختلفة مثل الذاكرة الخارجية التسلسية (EEPROM) ومثل ساعة الزمن الحقيقي (DS1307) وغيرها الكثير .

تتألف طريقة الربط بواسطة I2C من طرفين للتوصيل :

1 - طرف لتوصيل نبضات الساعة SCL.

2 - طرف لتوصيل الداتا SDA.

668468733.png

يمكن من خلال بروتوكول I2C توصيل عناصر متعددة الى نفس الطرفين والتخاطب معها جميعا بدون ان يحدث تداخل بينها .

والسؤال الذي يطرح نفسه : في حال كان لدي عدة عناصر الكترونية (مثلا لدي ذاكرة EEPROM وساعة زمن حقيقة DS1307 وغيرها) والتي تستخدم طريقة I2C فكيف يمكن نقل الداتا من المتحكم الى الايبروم فقط ؟؟؟

الجواب بسيط جدا : تعتمد عملية نقل الداتا على استخدام عنوان مميز لكل عنصر ( هذا العنوان يشبه الاسم والذي يميز كل انسان) فمثلا الذاكرة الخارجية التسلسلية EEPROM لها رقم مميز يختلف عن DS1307 ، ويجب مراجعة الداتاشيت للعنصر لمعرفة هذا الرقم حتى نتمكن من نقل الداتا والا فان عملية الربط ستكون بدون جدوى .

هذه مقدمة بسيطة لتوضيح هذا البروتوكول ،وان شاء الله يتم التوضيح بشكل تدريجي للوصول الى فهم اكبر لهذا البروتوكول .

واخر دعوانا ان الحمدلله رب العالمين .. وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم.

تم تعديل بواسطه geniusse01
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

تعتمد عملية نقل الداتا من خلال بروتوكول I2C على وجود طرفين يتم نقل الداتا بينهما :

1 - السيد او الماستر : وهو الذي يقوم بالتحكم بعملية النقل بشكل عام وهو المسؤول عن توليد نبضات الساعة اللازمة لعملية نقل الداتا ، وخلال الشرح سيكون المتحكم هو الذي يقوم بهذه الوظيفة ، وسنستخدم في الشرح PIC16F877A والذي يحتوي على هاردوير داخلي I2C .

2 - التابع او الخادم : وهو الذي يقوم بكل ما يطلب منه من خلال الماستر مثل حفظ المعلومات او استرجاعها ، وخلال الشرح ستكون ذاكرة الايبروم الخارجية هي التي تقوم بهذه الوظيفة ، وسنستخدم الذاكرة 24C16.

ملاحظة مهمة : في حال استخدام الذاكرة 24C16 فان الذاكرة الداخلية تحتوي على 16384 بت وليس 16384 بايت ،وبالتالي للحصول على عدد البايتات في الذاكرة الداخلية يجب ان نقسم الحجم المذكور على 8 ، هذا الامر قد يسبب بعض الارباك احيانا .

ان عملية نقل الداتا من المتحكم الى الايبروم تسمى عملية الكتابة الى الايبروم ، اما عملية نقل الداتا من الايبروم الى المتحكم فتسمى عملية القراءة من الايبروم .

تتم عملية الكتابة الى الايبروم بطريقتين :

1 - كتابة بايت واحد فقط الى الايبروم (Byte Write) .

2 - كتابة عدة بايتات متتالية الى الايبروم (Page Write ) .

نبدأ مع النوع الاول :

1 - كتابة بايت واحد فقط الى الايبروم (Byte Write) .

لتوضيح عملية كتابة بايت الى الايبروم فلننظر الى الصورة التالية التي توضح تسلسل عملية الكتابة :

689459648.jpg

1 - تبدأ عملية ارسال الداتا بارسال اشارة بدء الارسال ( START ) من قبل الماستر .

2 - يقوم الماستر بارسال البايت الاول BYTE1 والذي يتكون من 7 بتات لتحديد العنوان المميز للخادم , في حال البت الثامن يساوي الصفر فان الخادم يفهم بان العملية هي عملية كتابة الى الايبروم ، اما في حال كان البت الثامن يساوي الواحد فان الخادم يفهم بان العملية هي عملية قراءة من الايبروم , بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

3 - يقوم الماستر بارسال البايت الثاني BYTE2 والذي يحوي العنوان الذي سيتم الكتابة اليه داخل الايبروم ، ويمكن ان نصل الى 256 موقع ذاكرة (256 بايت ) داخل الايبروم (هذا العنوان يتم وضعه في مؤشر الموقع للايبروم ) ، بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

4 - واخيرا يقوم الماستر بارسال البايت الثالث BYTE3 , والذي يحوي الداتا المطلوب كتابتها وحفظها في المكان الذي يدل عليه مؤشر الموقع للايبروم ، بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

5 - تنتهي عملية ارسال الداتا بارسال اشارة نهاية الارسال ( STOP ) من قبل الماستر .

ملاحظة مهمة في حال الايبروم المستخدم هنا :

من المهم لاتمام عملية الخاطب معرفة ان الايبروم تمتلك العنوان الثنائي المميز ( 1010) مهما كان حجم الايبروم ، والسؤال الذي يطرح نفسه : ماذا نفعل بالبتات الثلاث الباقية في البايت الاول BYTE1 ؟؟؟

الجواب كالتالي: قلنا ان الذاكرة تحتوي 16384 بت وهذا يعني 2084 بايت .فكم بت نحتاج لتمثيل هذه المواقع في الذاكرة ؟؟؟

بالحساب نجد ان :


2^11 =2048

اي اننا نحتاج الى 11 بت حتى نصل الى اي موقع موجود في الذاكرة .. وبالتالي نستخدم البتات الثلاثة الموجودة في البايت الاول BYTE1 مع كامل البايت الثاني BYTE2 للحصول على 11 بت وبالتالي الوصول الى اي موقع في الايبروم ، وهكذا يتم الوصول الى اي موقع داخل الايبروم من خلال مؤشر الموقع ،حيث يزداد المؤشر بعد كل عملية قراءة او كتابة بشكل تلقائي.

مثال 1 : قم بعمل برنامج باستخدام الميكروسي يقوم بحفظ القيمة (0xAA) في الموقع رقم 1000 داخل الايبروم 24C16 وذلك باستخدام بروتوكول النقل I2C .

معلومة مفيدة : في بداية اي برنامج يستخدم I2C يجب تحديد التردد الذي يستخدم لنقل الداتا ، عادة فان تردد 100 كيلو هيرتز مناسب لكثير من التطبيقات . الامر المستخدم لتحديد التردد حسب الميكروسي هو :



[left] I2C1_Init(100000); [/left]


الجواب :

سنقوم بتحديد البايتات الثلاث اللازمة لعملية الكتابة الى الايبروم .

البايت الاول : لتحديد البايت الاول نحن بحاجة الى العنوان المميز للايبروم وهو (1010)، والعملية هي كتابة الى الايبروم فآخر بت هو صفر .. يبقى الان الثلاث بتات التي تحدثنا عنها حيث ناخذها من السؤال (الموقع هو 1000) :


[left]1000 = 011 1110 1000 [/left]

وهكذا فان البايت الاول هو :

Byte1 = 1010 011 0 = A6

البايت الثاني : هو البايت الذي يحدد باقي مكان مؤشر الموقع (الموقع هو 1000 ) :


[left]1000 = 011 1110 1000 [/left]

Byte2 = 1110 1000 = E8

البايت الثالث : وهو عبارة عن الداتا التي سنحفظها في المكان الذي يدل عليه مؤشر الموقع ( الموقع هو 1000( :

Byte3 = 0xAA

وهكذا يكون البرنامج كاملا كالتالي:


[left]
void main()
}
I2C1_Init(100000);
I2C1_Start();
I2C1_Wr(0xA6);
I2C1_Wr(0xE8);
I2C1_Wr(0xAA);
I2C1_Stop();
{[/left]


ملف البروتوس مع الميكروسي برو ( 7.7) موجود على الرابط التالي:

http://www.mediafire.com/?kjvya8qh967txo7

يمكن التعديل على ملف الميكروسي ومن ثم رؤية القيمة التي تم ارسالها الى الايبروم من خلال تشغيل تشغيل ملف البروتوس ، ومن ثم ايقاف البروتوس مؤقتا بالضغط على ( | | ) عندها تظهر نافذة الايبروم كما في الشكل التالي :

198366504.jpg

ارجو ان تكون الامور واضحة ، وفي حال وجود اي استفسار ارجو طرحه هنا ..

تمرين 1 : قم بكتابة برنامج بواسطة الميكروسي يقوم بحفظ القيمة 0x56في الموقع رقم 1992 داخل الايبروم 24C16 .

2 - كتابة عدة بايتات متتالية الى الايبروم (Page Write ) :

لا تختلف عملية كتابة بايت الى الايبروم عن كتابة عدة بايتات متتالية والصورة التالية توضح ذلك :

url=http://www.0zz0.com]305607776.jpg

1 - تبدأ عملية ارسال الداتا بارسال اشارة بدء الارسال ( START ) من قبل الماستر .

2 - يقوم الماستر بارسال البايت الاول BYTE1 والذي يتكون من 7 بتات لتحديد العنوان المميز للخادم ، ففي حال كان البت الثامن يساوي الصفر فان الخادم يفهم بان العملية هي عملية كتابة الى الايبروم ، اما في حال كان البت الثامن يساوي الواحد فان الخادم يفهم بان العملية هي عملية قراءة من الايبروم , بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

3 - يقوم الماستر بارسال البايت الثاني BYTE2 والذي يحوي العنوان الذي سيتم الكتابة اليه داخل الايبروم ، ويمكن ان نصل الى 256 موقع ذاكرة (256 بايت ) داخل الايبروم (هذا العنوان يتم وضعه في مؤشر الموقع للايبروم ) ، بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

4 – الان يقوم الماستر بارسال البايت الثالث BYTE3 , والذي يحوي الداتا المطلوب كتابتها وحفظها في المكان الذي يدل عليه مؤشر الموقع للايبروم ، بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

ملاحظة مهمة : بعد عملية الكتابة هنا يزداد مؤشر الموقع بمقدار واحد تلقائيا .

5 – بما ان مؤشر الموقع قد ازداد بمقدار 1 تلقائيا ، الان يقوم الماستر بارسال البايت الرابع BYTE4 كما ورد في النقطة السابقة ، وتعاد نفس العملية مادام هناك بايتات اخرى حتى البايت الاخير BYTE N .

5 - تنتهي عملية ارسال الداتا بارسال اشارة نهاية الارسال ( STOP ) من قبل الماستر .

مثال 2 : قم بعمل برنامج باستخدام الميكروسي يقوم بحفظ القيم (0xA0,0xA1,0xA2,0xA3,0xA4,0xA5) بداية من الموقع رقم 10 داخل الايبروم 24C16 وذلك باستخدام بروتوكول النقل I2C .

الجواب :

نقوم بتحديد البايتات اللازمة لعملية الكتابة الى الايبروم .

البايت الاول : لتحديد البايت الاول نحن بحاجة الى العنوان المميز للايبروم وهو (1010( ، والعملية هي كتابة الى الايبروم فآخر بت هو صفر ..يبقى الان الثلاث بتات التي تحدثنا عنها حيث ناخذها من السؤال (الموقع هو 10) :

10 = 000 0000 1010

وهكذا فان البايت الاول هو :

Byte1 = 1010 000 0 = A0

البايت الثاني : هو البايت الذي يحدد باقي مكان مؤشر الموقع (الموقع هو 10 ( :

10 = 000 0000 1010

Byte2 = 0000 1010 = 0A

البايت الثالث : وهو عبارة عن الداتا التي سنحفظها في المكان الذي يدل عليه مؤشر الموقع ( الموقع هو 10 ( :

Byte3 = 0xA0

البايت الرابع : وهو عبارة عن الداتا التي سنحفظها في المكان الذي يدل عليه مؤشر الموقع ( الموقع هو 11 ( :

Byte4 = 0xA1

البايت الخامس : وهو عبارة عن الداتا التي سنحفظها في المكان الذي يدل عليه مؤشر الموقع ( الموقع هو 12 ( :

Byte5 = 0xA2

البايت السادس : وهو عبارة عن الداتا التي سنحفظها في المكان الذي يدل عليه مؤشر الموقع ( الموقع هو 13 ( :

Byte6 = 0xA3

البايت السابع : وهو عبارة عن الداتا التي سنحفظها في المكان الذي يدل عليه مؤشر الموقع ( الموقع هو 14 ( :

Byte7 = 0xA4

البايت الثامن : وهو عبارة عن الداتا التي سنحفظها في المكان الذي يدل عليه مؤشر الموقع ( الموقع هو 15 ( :

Byte7 = 0xA5

وهكذا يكون البرنامج كاملا كالتالي:

void main(){

I2C1_Init(100000);

I2C1_Start();

I2C1_Wr(0xA0);

I2C1_Wr(0x0A);

I2C1_Wr(0xA0);

I2C1_Wr(0xA1);

I2C1_Wr(0xA2);

I2C1_Wr(0xA3);

I2C1_Wr(0xA4);

I2C1_Wr(0xA5);

I2C1_Stop();

}

ملف البروتوس مع الميكروسي برو ( 7.7) موجود على الرابط التالي:

http://www.mediafire.com/?4kx7qclb4mswj6d

يمكن التعديل على ملف الميكروسي ومن ثم رؤية القيمة التي تم ارسالها الى الايبروم بنفس الطريقة السابقة .

وآخر دعوانا ان الحمدلله رب العالمين .. وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم.

تم تعديل بواسطه geniusse01
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

نكمل اليوم مشوارنا بالحديث عن بروتوكول نقل الداتا I2C وخصائصه ، في المشاركات السابقة قمنا بتوضيح كيفية الكتابة باستخدام هذا البروتوكول ، واليوم ان شاء الله سنوضح طريقة القراءة باستخدام هذا البروتوكول .

ان تسلسل عملية القراءة لا تتم بنفس تسلسل عملية الكتابة ، وهذا يرجع لسبب رئيسي واحد : وهو انه لا يوجد طريقة للقراءة من عنوان محدد في الذاكرة ، بل نحن نحتاج ان نقوم بتحميل العنوان الذي سنقرأ منه اولا (وهذا يتم باستخدام تسلسل عملية الكتابة المستخدمة في المشاركات السابقة ) وبعدها نبدأ عملية القراءة .

تتم عملية القراءة من الايبروم بطريقتين :

1 - قراءة بايت واحد فقط من الايبروم (Byte Read) .

2 - قراءة عدة بايتات متتالية من الايبروم (Page Read ) .

نبدأ مع النوع الاول وهو :

1 - كيفية قراءة بايت واحد من الايبروم ( Byte Read) :

ان عملية القراءة من مكان محدد باستخدام هذا البروتوكول موضحة في الصورة التالية:

740942116.jpg

تتكون عملية القراءة من قسمين ، القسم الايسر المحدد باللون الازرق تم شرحه سابقا من خلال عملية الكتابة ، ووظيفته وضع مؤشر الموقع في المكان الذي سيتم القراءة منه كالتالي:

1 - ارسال اشارة بدء الارسال ( START ) من قبل الماستر .

2 - يقوم الماستر بارسال البايت الاول BYTE1 والذي يتكون من 7 بتات لتحديد العنوان المميز للخادم ,اما البت الثامن فيساوي الصفر ، وهكذا يفهم الخادم بان العملية هي عملية كتابة الى الايبروم ،, بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

3 - يقوم الماستر بارسال البايت الثاني BYTE2 والذي يحوي العنوان الذي سيتم الكتابة اليه داخل الايبروم ، هذا العنوان يتم وضعه في مؤشر الموقع للايبروم ) ، بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

نلاحظ ان هذه الخطوات هي نفس الخطوات المستخدمة للكتابة الى الايبروم ولكن مع الغاء اخر خطوة ، الان اصبح مؤشر الموقع في المكان الذي نريد التعامل معه .

الان نبدا عملية القراءة من الموقع بعد ان قمنا بتحديد مكان مؤشر الموقع ، وهذا محدد في القسم الايمن المحدد باللون الاحمر كالتالي:

1 - يقوم الان الماستر بارسال اشارة بدء ارسال (START) مرة اخرى .

2 – يقوم الماستر بارسال البايت ( BYTE1’) وهو نفس البايت الاول ( BYTE1) الذي يحدد العنوان المميز للخادم مع اختلاف واحد ، فالبت الثامن اصبح يحتوي القيمة ( 1 ) مما يعني ان العملية هي قراءة من الايبروم،بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال للعنوان تمت بنجاح .

3 – الان جاء دور الايبروم لارسال الداتا الى الماستر ( ان جميع البتات السابقة كان يتم ارسالها من الماستر باتجاه الخادم وكان الخادم يرد باشارة ACK ) اما الان فان الخادم ( الايبروم ) هو الذي سيقوم بارسال الداتا باتجاه الماستر ، حيث يقوم الخادم بارسال البايت ( BYTE3) الذي تم تحديد عنوانه في البداية ، بعد استقبال البايت يرد الماستر بعدم ارسال اشارة وهذا يدعى (NO ACK) أي عدم ارسال اشارة علم ..السؤال الان لماذا يقوم الماستر بعدم ارسال الاشارة للخادم ؟؟؟

الجواب كالتالي: بما ان الخادم يقوم بعملية الارسال ، فهذه طريقة حتى يقوم الماستر باخبار الخادم باكمال عملية ارسال البايتات او بايقاف العملية ..وهكذا فان ( NO ACK) تخبر الخادم بالتوقف عن ارسال البايتات.

4- تنتهي عملية قراءة الداتا بارسال اشارة نهاية الارسال ( STOP ) من قبل الماستر .

تمرين 3: قم بعمل برنامج باستخدام الميكروسي يقوم بقراءة القيمة من الموقع رقم 530 داخل الايبروم 24C16 وحفظها في المتغير ( X ) وذلك باستخدام بروتوكول النقل I2C .

كما قلنا نقوم بتحديد التردد المستخدم 100 كيلو هيرتز من خلال الميكروسي كالتالي:





I2C1_Init(100000);



نقوم بتحديد البايتات اللازمة لعملية الكتابة الى الايبروم .

البايت الاول BYTE1 : البتات الاربعة الاولى ثابة وهي ( 1010( والبت الثامن يساوي صفر لانها عملية كتابة . الان نحدد البتات الثلاث الباقية من العنوان المطلوب التعامل معه :



530 = 01000010010

وهكذا يكون البايت الاول هو :



BYTE1 = 1010 010 0 = A4 (Hex)

البايت الثاني هو :



BYTE2 = 00010010 = 12( Hex)

هذه البايتات اللازمة لتحديد الموقع من خلال تسلسل عملية الكتابة وهكذا يكون البرنامج الى هنا كالتالي:





Char x;

Void main ()

{

I2C1_Init(100000);

I2C1_Start();

I2C1_Wr(0xA4);

I2C1_Wr(0x12);

....

}

الان يجب اعادة ارسال اشارة ( START) مرة اخرى وهذا يستخدم امر جديد هو :

I2C1_Repeated_Start();

الان نكمل عملية القراءة .

البايت BYTE1’ : هو نفس البايت الاول مع اختلاف البت الثامن ، فالبت الثامن يساوي 1 ، وهكذا يعرف الخادم بان العملية هي عملية قراءة :



BYTE1’ = 1010 010 1 = A5(Hex)

البايت الثالث BYTE3 : هو البايت الذي سيتم قراءته من الايبروم وستم حفظه في المتغير ( X ) من خلال امر القراءة :

X = I2C1_Read ( 0 ) ;

كما قلنا فان الماستر يرسل ( NO ACK ) بعد استقبال البايت وهذا يعني وضع القيمة صفر في الاقواس داخل امر القراءة . هكذا يكون البرنامج كاملا كالتالي:





Char x;

Void main ()

{

I2C1_Init(100000);

I2C1_Start();

I2C1_Wr(0xA4);

I2C1_Wr(0x12);

I2C1_Repeated_Start();I2C1_Wr(0xA5);

X=I2C1_Read(0);

I2C_Stop

}

في البرنامج السابق تمت قراءة الموقع 530 في الايبروم ثم حفظه في المتغير x .. يمكن استخدام القيمة المقروءة في أي عملية نحتاجها . فمثلا يمكن قراءتها واظهارها على الاطراف الخارجية وغيرها من الوظائف .ننتقل الى النوع الثاني وهو :

2 - قراءة عدة بايتات متتالية من الايبروم (Page Read ) .

لا تختلف عملية قراءة عدة بايتات متتالية عن طريقة بايت واحد كثيرا .. والصورة التالية توضح ذلك :

156800520.jpg

تتكون عملية القراءة من قسمين ، القسم الايسر المحدد باللون الازرق تم شرحه سابقا من خلال عملية الكتابة ، ووظيفته وضع مؤشر الموقع في المكان الذي سيتم القراءة منه كالتالي:

1 - ارسال اشارة بدء الارسال ( START ) من قبل الماستر .

2 - يقوم الماستر بارسال البايت الاول BYTE1 والذي يتكون من 7 بتات لتحديد العنوان المميز للخادم ,اما البت الثامن فيساوي الصفر ، وهكذا يفهم الخادم بان العملية هي عملية كتابة الى الايبروم ،, بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

3 - يقوم الماستر بارسال البايت الثاني BYTE2 والذي يحوي العنوان الذي سيتم الكتابة اليه داخل الايبروم ، هذا العنوان يتم وضعه في مؤشر الموقع للايبروم ) ، بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال قد تمت بنجاح .

نلاحظ ان هذه الخطوات هي نفس الخطوات المستخدمة للكتابة الى الايبروم ولكن مع الغاء اخر خطوة ، الان اصبح مؤشر الموقع في المكان الذي نريد التعامل معه .

الان نبدا عملية القراءة من الموقع بعد ان قمنا بتحديد مكان مؤشر الموقع ، وهذا محدد في القسم الايمن المحدد باللون الاحمر كالتالي:

1 - يقوم الان الماستر بارسال اشارة بدء ارسال (START) مرة اخرى .

2 – يقوم الماستر بارسال البايت ( BYTE1’) وهو نفس البايت الاول ( BYTE1) الذي يحدد العنوان المميز للخادم مع اختلاف واحد ، فالبت الثامن اصبح يحتوي القيمة ( 1 ) مما يعني ان العملية هي قراءة من الايبروم،بعدها يرد الخادم باشارة ACK والتي تعني بان عملية الاستقبال للعنوان تمت بنجاح .

3 – الان جاء دور الايبروم لارسال الداتا الى الماستر ( ان جميع البتات السابقة كان يتم ارسالها من الماستر باتجاه الخادم وكان الخادم يرد باشارة ACK ) اما الان فان الخادم ( الايبروم ) هو الذي سيقوم بارسال الداتا باتجاه الماستر ، حيث يقوم الخادم بارسال البايت ( BYTE3) الذي تم تحديد عنوانه في البداية ، بعد استقبال البايت الاول يرد الماستر باشارة علم ACK والتي تعني للخام ان يستمر بارسال البايت في الموقع التالي ، وهكذا يستمر الخادم في ارسال البايتات المتتالية حتى يستقبل اشارة ( NO ACK) عندها يتوقف الخادم عن ارسال البايتات .

4- تنتهي عملية قراءة الداتا بارسال اشارة نهاية الارسال ( STOP ) من قبل الماستر .

نلاحظ ان العملية هي نفسها مع اختلاف بسيط وهو انه بدلا من ارسال اشارة NO ACK بعد قراءة البايت الاول فان الماستر يرسل ACK باستمرار حتى يحصل على اخر بايت عندها يرسل NO ACK ليوقف الخادم عن ارسال البايت التالي ..

تمرين 4: قم بعمل برنامج باستخدام الميكروسي يقوم بقراءة 3 قيم ابتداء من الموقع رقم 680 داخل الايبروم 24C16 وحفظها في المتغيرات ( X1,X2,X3 ) وذلك باستخدام بروتوكول النقل I2C .

كما قلنا نقوم بتحديد التردد المستخدم 100 كيلو هيرتز من خلال الميكروسي كالتالي:



I2C1_Init(100000);

نقوم بتحديد البايتات اللازمة لعملية الكتابة الى الايبروم .

البايت الاول BYTE1 : البتات الاربعة الاولى ثابة وهي ( 1010( والبت الثامن يساوي صفر لانها عملية كتابة . الان نحدد البتات الثلاث الباقية من العنوان المطلوب التعامل معه :



680 = 01010101000

وهكذا يكون البايت الاول هو :



BYTE1 = 1010 010 0 = A4 (Hex)

البايت الثاني هو :



BYTE2 = 1010 1000 = A8 ( Hex)

هذه البايتات اللازمة لتحديد الموقع من خلال تسلسل عملية الكتابة وهكذا يكون البرنامج الى هنا كالتالي:





Char x;

Void main ()

{

I2C1_Init(100000);

I2C1_Start();

I2C1_Wr(0xA4);

I2C1_Wr(0xA8);

....

}



الان يجب اعادة ارسال اشارة ( START) مرة اخرى وهذا يستخدم امر جديد هو :

I2C1_Repeated_Start();

الان نكمل عملية القراءة .

البايت BYTE1’ : هو نفس البايت الاول مع اختلاف البت الثامن ، فالبت الثامن يساوي 1 ، وهكذا يعرف الخادم بان العملية هي عملية قراءة :

BYTE1’ = 1010 010 1 = A5(Hex)

البايت الثالث BYTE3 : نقرأ اول بايت ونحفظه في المتغير ( X1 ) من خلال امر القراءة :





X1 = I2C1_Read ( 1 ) ;

X2 = I2C1_Read ( 1 ) ;

X3 = I2C1_Read ( 0 ) ;

يقوم الماستر بارسال اشارة ACK بعد قراءة البايت الاول وهكذا يحتوي امر القراءة على 1 مما يعني للخادم اكمل ارسال البايت التالي ، بعدها يقوم الماستر بارسال ACK بعد قراءة البايت الثاني وهكذا يحتوي امر القراءة على 1 مما يعني للخادم اكمل ارسال البايت التالي ، اخيرا يقوم الماستر بعدم ارسال اشارة ( NO ACK ) بعد قراءة البايت الثالث مما يعني للخادم اوقف ارسال البيت التالي وهكذا يحتوي امر القراءة على 0 .هكذا يكون البرنامج كاملا كالتالي:





Char x;

Void main ()

{

I2C1_Init(100000);

I2C1_Start();

I2C1_Wr(0xA4);

I2C1_Wr(0xA8);

I2C1_Repeated_Start();I2C1_Wr(0xA5);

X1=I2C1_Read(1);

X2=I2C1_Read(1);

X3=I2C1_Read(0);

I2C_Stop

}

في حال وجود أي استفسار فلا تترددوا بالسؤال عن أي نقطة غير واضحة ..واخر دعوانا ان الحمدلله رب العالمين .. وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم.

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيرا

يعني بروتوكول I2C يكون مدمج دائما داخل الميكروكنرولر وليس قطعة مستقلة

صورة تبين عملية الربط

goldcardcontact.jpg

يعني pic16F84 مدمجة ببروتوكول I2C

لماذا تم الربط بين الأرجل(pins) ا و2 و3 و4 7 في الذاكرة الإضافية ألا يحدث تلامس (ماس)

وبخصوص الرجل 8 ماذا تعني و لماذا ربطت بالرجل

تم تعديل بواسطه hatem
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيرا

يعني بروتوكول I2C يكون مدمج دائما داخل الميكروكنرولر وليس قطعة مستقلة

صورة تبين عملية الربط

goldcardcontact.jpg

يعني pic16F84 مدمجة ببروتوكول I2C

لماذا تم الربط بين الأرجل(pins) ا و2 و3 و4 7 في الذاكرة الإضافية ألا يحدث تلامس (ماس)

وبخصوص الرجل 8 ماذا تعني و لماذا ربطت بالرجل

السلام عليكم

اسئلة جميلة تتعلق بالموضوع . بالنسبة ل I2C هو عبارة عن خاصية تكون مدمجة داخليا في الميكروكنترولر .. ولكن يمكن ان يتم عمل سوفتوير يقوم بنفس الوظيفة ولكنها ستستهلك البيك في توليد هذه الخاصية ..في حال كان البرنامج بسيط فيمكن استخدام السوفتوير .اما اذا كان هناك حاجة للتوقيت الزمني فالافضل استخدام ميكروكنترولر مدمج فيه هذه الخاصية ..

بالنسبة للاطراف الخارجية ..اذا راجعت الداتا شيت فان الاطراف 1 و 2 و 3 اطراف خارجية ولكنها غير متصلة داخليا ..فيمكن ربطها الى Vss او Vdd او تركها بدون توصيل .. اما الطرف رقم 7 فعند توصيله بـ Vss فهو يعمل بشكل طبيعي ، اما عند توصيله بـ Vdd فهو يمنع عملية القراءة والكتابة الطبيعية ..اما الطرف 8 فهو التغذية للايبروم ...

ارجو لك التوفيق ...

واخر دعوانا ان الحمدلله رب العالمين .. وصلى الله على سيدنا محمد وعلى اله وصحبه اجمعين ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيرا أخي وجعله صدقة جارية

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم و رحمة الله و بركاته

بارك الله فيك اخي geniusse01 على الموضوع الرائع و الذي ابحث عنه منذ مدة شكرا جزيلا

عندي بعض الأستفسارات ارجو ان تفيدني بخبرتك

1 - كيف اعرف عنوان كل eeprom من الداتاشيت فلقد حملت الداتاشيت 24lc64 و هو نفسه هذا

5555555.jpg

2 - كيف يمكنني التعامل مع الكارت المستعمل في الصورة بدون وضع ايبروم بينها و بين البيك للعلم البيك المستعمل هو 16f876

في انتظار ردك بارك الله فيك

وفقني الله و اياكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم و رحمة الله و بركاته

بارك الله فيك اخي geniusse01 على الموضوع الرائع و الذي ابحث عنه منذ مدة شكرا جزيلا

عندي بعض الأستفسارات ارجو ان تفيدني بخبرتك

1 - كيف اعرف عنوان كل eeprom من الداتاشيت فلقد حملت الداتاشيت 24lc64 و هو نفسه هذا

5555555.jpg

2 - كيف يمكنني التعامل مع الكارت المستعمل في الصورة بدون وضع ايبروم بينها و بين البيك للعلم البيك المستعمل هو 16f876

في انتظار ردك بارك الله فيك

وفقني الله و اياكم

السلام عليكم

بالنسبة للايبروم فهي تحمل نفس العنوان ( 1010) وهو ثابت للايبروم من هذا النوع ، بالنسبة للايبروم بحجم صغير يمكن ان يتم التوصيل عدة قطع من نفس الايبروم ولكن هناك اطراف خارجية ( A0.A1.A2) يتم توصيلها الى التغذية او الى الارضي من اجل الحصول على هنوان مختلف عن الايبرومات الاخرى الموصله على نفس الاطراف .. عادة ما تجد هذه المعلومات في الداتا شيت للحصول على معلومات اكبر ..اي سؤال بهذا الموضوع فانا جاهز ..

اما ما يتعلق بسؤالك الثاني فانا لم اتعامل مع الكارت ولا دراية لي بها فالمعذرة يا صديقي...

وفقك الله لما يحبه ويرضاه..

واخر دعوانا ان الحمدلله رب العالمين ... وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بارك الله فيك أخي الكريم


موضوع مبسط و مفهوم زادك الله من علمه


0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .