السلام عليكم ورحمة الله وبركاته كيف حالكم ياشباب :
بعض المشاريع عن بروتوكول SPI المهمة .
المشروع الاول عندنا بيك مرسل(Master) وبيك مستقل(Slave), المرسل يرسل بيانات للمستقبل, وبعدين المستقبل يشغل ليد حسب البيانات المرسلة.
شرح الكود:
بداية داخل الدالة الرئيسية عندنا :
;trisc.f3=0; trisc.f4=1; trisc.f5=0; trisd.f1=0
;trisc.f3=0 كخرج لتوليد نبضات نقل البيانات للمستقبل, في بروتوكول SPI الماستر هو اللي يولد الساعات لنقل البيانات لكافة المعالجات الاخرى.
;trisc.f4=1 كدخل عشان يستقبل البيانات اذا المستقبل حاب يرسل.
;trisc.f5=0 كخرج لارسال البيانات للمستقبل.
;trisd.f1=0 كخرج لاختيار المعالج الذي سيتم التخاطب معه, في بروتوكول SPI الماستر هو اللي يحدد مع من يتخاطب عشان وهذا الرجل في البيك حق الماستر راح يرسل اشارة يخبر المستقبل بانه سيرسل له بعض البيانات.
;portd.f1=1 قبل بداية البرنامج يجب التاكد عدم اختيار المعالج المراد التخاطب معه بارسال القيمة 1 , كده في البداية البرنامج سيكون المستقبل في وضع عدم الاستقبال مالم يتم ارسال صفر عليه , لان كما قلت الــ portd.f1 سيتم استخدامه لتحديد المعالج المراد التخاطب معه.
وبعدين لتهيئة البروتوكول في الميكروسي نكتب التالي:
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_end, _SPI_CLK_IDLE_high, _SPI_high_2_low);
باختصار قمنا باختيار برتوكول SPI كا ماستر واخترنا سرعة انتقال البيانات وهي 4 , وارسال البيانات تكون في في الجبهة الهابطة في النبضات, هذه اهم اشياء يجب معرفتها وللمزيد راج الداتاشيت.
وبعدين عندنا حلقة غير منتهية وفي داخلها :
;portd.f1=0 ارسال صفر لاختيار المعالج المستقبل لبدء ارسال البيانات له
;SSPBUF=1 ارسال القيمة 1 للمستقبل, SSPBUF هو البفر اللي يخزن البيانات المراد ارسالها
;(delay_ms(500 انتظار نصف ثانية
;portd.f1=1 عدم اختيار المعالج لاننا انتهينا من ارسال البيانات للمعالج المستقبل.
هذه مثال فقط لارسال القيمة 1 اذا اردنا ارسال قيم اخرى نسوي نفس الشي مثال لارسال القيمة 15:
;portd.f1=0
;SSPBUF=15
;(delay_ms(500
;portd.f1=1
----------------------------------------------------------------------------------------
والان شرح كود المستقبل(Slave) في المستقبل اضطررت لاستخدام المقاطعات لاستقبال البيانات من الماستر لانني حاولت استخدام المكتبة حقت المايكروسي ولكنها لاتعمل في وضع المستقبل جيدا !! لهذا استخدمت المقاطعة واذا رحت وشفت المكتبة اصلا ماراح تلاقي كود للاستقبال .
اوكيه الان نبدا شرح دالة خدمة المقاطعة:
(if (PIR1.SSPIF نقوم بفحص علم المقاطعة لبروتوكول SPI هل تم حدوث مقاطعة اي البفر استقبل بيانات
}
(if(porta.f5 == 0 هل قام الماستر باختيار المستقبل, اكيد راح يختاره اجل كيف ارسله ههههه بس للتاكد لاغير
}
;temp = SSPBUF خذ البيانات المستقبلة من البفر وخزنها في temp
;flag=1 متغير راح يساوي واحد كلما استقبلنا بيانات جديدة
{
;PIR1.SSPIF = 0 صفر علم مقاطعة البروتوكول SPI
{
داخل الدالة الرئيسية عندنا :
;trisc.f3=1; trisc.f4=1; trisc.f5=0; trisa.f5=1
;trisc.f3=0 كدخل لاستقبال نبضات الساعة اللي يرسلها الماستر.
;trisc.f4=1 كدخل عشان يستقبل البيانات القادمة من الماستر.
;trisc.f5=0 كخرج لارسال البيانات للماستر اذا الماستر طبعا طلب ذلك.
;trisa.f5=1 كدخل لاستقبال اشارة الاختيار القادمة من الماستر لبدء التخاطب.
وبعدين لتهيئة البروتوكول في الميكروسي نكتب التالي:
SPI1_Init_Advanced(_SPI_SLAVE_SS_enable,_SPI_DATA_ SAMPLE_end,_SPI_CLK_IDLE_high,_SPI_high_2_low);
باختصار قمنا باختيار برتوكول SPI كا مستقبل , وارسال البيانات تكون في في الجبهة الهابطة في النبضات, وتمكين استقبال نبضة الاختيار القادمة من الماستر, هذه اهم اشياء يجب معرفتها وللمزيد راج الداتاشيت !!!.
وعندنا اوامر تفعيل المقاطعات لاستقبال البيانات:
;PIE1.SSPIE = 1 تفعيل مقاطعات SPI
;INTCON.GIE = 1 لتفعيل المقاطعات العامة
;INTCON.PEIE = 1 تفعيل المقاطعات المحيطية
اخيرا عندنا الدالة الغير منتهية وداخلها:
اول شي نفحص قيمة العلم اذا كان واحد يعني تم استقبال البيانات عن طريق المقاطعة,
بعدها راح نفحص البيانات القادمة وتشغيل الليد المناسب واخيرا تصفير قيمة علم المقاطعة اللي فحصناه ليتم تعليمنا بقدوم مقطعة اخرى,
هذه هي الخطوات:
(switch(temp افحص البيانات المتستقبلة
}
:case 1 اذا كانت 1
;portd=0b00000001 شغل اول ليد
;flag=0 تفصير علم المقاطقة
;break انتهينا وهكذا بالنسبة للبيانات القادمة الاخرى
{
تحميل المشروع كاملا:
http://www.4shared.com/rar/9SKoiLQ0/...Interrupt.html