- ما هو بروتوكول الاتصال SPI؟
- كيف يعمل بروتوكول SPI؟
- الفرق بين I2C و SPI Communication
- SPI مع PIC16F877A باستخدام مترجم XC8:
- شرح ملف رأس SPI:
- شرح البرنامج الرئيسي:
- محاكاة PIC مع مصحح أخطاء SPI:
Microcontrollers PIC هي منصة قوية توفرها رقاقة صغيرة للمشاريع المدمجة ؛ لقد مكنته طبيعته المتنوعة من إيجاد طرق في العديد من التطبيقات ولم ينمو كثيرًا بعد. إذا كنت تتابع دروس الموافقة المسبقة عن علم الخاصة بنا ، فستلاحظ أننا قمنا بالفعل بتغطية مجموعة واسعة من البرامج التعليمية حول الميكروكونترولر PIC بدءًا من الأساسيات. في نفس التدفق ، نواصل تعلم بروتوكولات الاتصال المتاحة مع الموافقة المسبقة عن علم وكيفية استخدامها. لقد قمنا بالفعل بتغطية I2C مع متحكم PIC.
في النظام الواسع للتطبيقات المضمنة ، لا يمكن لأي متحكم تنفيذ جميع الأنشطة بمفرده. في مرحلة ما من الوقت ، يتعين عليه الاتصال بأجهزة أخرى لمشاركة المعلومات ، وهناك العديد من أنواع بروتوكولات الاتصال المختلفة لمشاركة هذه المعلومات ، ولكن أكثرها استخدامًا هي USART و IIC و SPI و CAN. كل بروتوكول اتصال له ميزته وعيوبه. دعونا نركز على بروتوكول SPI في الوقت الحالي لأن هذا هو ما سنتعلمه في هذا البرنامج التعليمي.
ما هو بروتوكول الاتصال SPI؟
يشير المصطلح SPI إلى " الواجهة الطرفية التسلسلية ". إنه بروتوكول اتصال شائع يستخدم لإرسال البيانات بين اثنين من وحدات التحكم الدقيقة أو لقراءة / كتابة البيانات من جهاز استشعار إلى متحكم دقيق. كما أنها تستخدم للتواصل مع بطاقات SD ، وسجلات التحول ، وأجهزة التحكم في العرض وغير ذلك الكثير
كيف يعمل بروتوكول SPI؟
اتصال SPI هو اتصال متزامن ، مما يعني أنه يعمل بمساعدة إشارة ساعة يتم مشاركتها بين الجهازين اللذين يتبادلان البيانات. كما أنه اتصال ثنائي الاتجاه لأنه يمكنه إرسال واستقبال البيانات باستخدام ناقل منفصل. و يتطلب الاتصال SPI 5 أسلاك للعمل. تظهر أدناه دائرة اتصال SPI بسيطة بين السيد والعبد
الأسلاك الخمسة المطلوبة للاتصال هي SCK (الساعة التسلسلية) و MOSI (Master Out Slave In) و MISO (Master In Slave Out) و SS (Slave Select). دائمًا ما يحدث اتصال SPI بين السيد والعبد فقط. يمكن للسيد أن يكون لديه العديد من العبيد المتصلين به. السيد مسؤول عن توليد نبض الساعة ويتم مشاركة نفس الشيء مع جميع العبيد. كما لا يمكن بدء جميع الاتصالات إلا بواسطة السيد.
يشارك دبوس SCK (المعروف أيضًا باسم ساعة SCL-serial) إشارة الساعة التي يولدها السيد مع العبيد. يتم استخدام دبوس MOSI (المعروف أيضًا باسم SDA –Serial Data Out) لإرسال البيانات من السيد إلى المرهم. يتم استخدام دبوس MISO (المعروف أيضًا باسم SDI - Serial Data In) للحصول على البيانات من المرهم إلى الرئيسي. يمكنك أيضًا اتباع علامة السهم في الشكل أعلاه لفهم حركة البيانات / الإشارة. أخيرًا ، يتم استخدام دبوس SS (المعروف أيضًا باسم CS –Chip select) عندما يكون هناك أكثر من وحدة تابعة واحدة متصلة بالسيد. يمكن استخدام هذا في تحديد الرقيق المطلوب. يتم عرض عينة دارة حيث يتم توصيل أكثر من عبد واحد بالسيد لاتصال SPI في الدائرة أدناه.
الفرق بين I2C و SPI Communication
لقد تعلمنا بالفعل اتصال I2C مع PIC ولذا يجب أن نكون على دراية بكيفية عمل I2C وأين يمكننا استخدامها مثل I2C يمكن استخدامها لواجهة وحدة RTC. ولكن الآن ، لماذا نحتاج إلى بروتوكول SPI عندما يكون لدينا بالفعل I2C. والسبب هو أن كل من اتصالات I2C و SPI هي مزايا بطريقتها الخاصة ، وبالتالي فهي خاصة بالتطبيق.
إلى حد ما ، يمكن اعتبار أن اتصال I2C يتمتع ببعض المزايا على اتصال SPI لأن I2C يستخدم عددًا أقل من الدبوس ويكون مفيدًا جدًا عندما يكون هناك عدد كبير من العبيد المتصلين بالحافلة. لكن عيب I2C هو أنه يحتوي على نفس الحافلة لإرسال البيانات واستقبالها ، وبالتالي فهي بطيئة نسبيًا. لذلك فهو يعتمد فقط على التطبيق للاختيار بين بروتوكول SPI و I2C لمشروعك.
SPI مع PIC16F877A باستخدام مترجم XC8:
بما يكفي من الأساسيات ، دعنا الآن نتعلم كيف يمكننا استخدام اتصال SPI على متحكم PIC16F877A باستخدام برنامج التحويل البرمجي MPLABX IDE و XC8. قبل أن نبدأ في توضيح أن هذا البرنامج التعليمي يتحدث فقط عن SPI في PIC16F877a باستخدام مترجم XC8 ، ستكون العملية هي نفسها بالنسبة للميكروكونترولر الأخرى ولكن قد يلزم إجراء تغييرات طفيفة. تذكر أيضًا أنه بالنسبة للميكروكونترولر المتقدمة مثل سلسلة PIC18F ، قد يحتوي المحول البرمجي نفسه على مكتبة مدمجة لاستخدام ميزات SPI ، ولكن بالنسبة إلى PIC16F877A ، لا يوجد شيء من هذا القبيل ، لذا دعونا نبني واحدة بمفردنا. سيتم تقديم المكتبة الموضحة هنا كملف رأس للتنزيل في الأسفل ويمكن استخدامه لـ PIC16F877A للتواصل مع أجهزة SPI الأخرى.
سنقوم في هذا البرنامج التعليمي بكتابة برنامج صغير يستخدم اتصال SPI لكتابة وقراءة البيانات من ناقل SPI. سنقوم بعد ذلك بالتحقق من ذلك باستخدام محاكاة Proteus. سيتم عمل جميع الأكواد المتعلقة بسجلات SPI داخل ملف الرأس المسمى PIC16f877a_SPI.h. بهذه الطريقة يمكننا استخدام ملف الرأس هذا في جميع مشاريعنا القادمة التي تتطلب اتصال SPI. وداخل البرنامج الرئيسي ، سنستخدم فقط الوظائف من ملف الرأس. يمكن تنزيل الكود الكامل مع ملف الرأس من هنا.
شرح ملف رأس SPI:
داخل ملف الرأس ، يتعين علينا تهيئة اتصال SPI لـ PIC16F877a. كما هو الحال دائمًا ، فإن أفضل مكان للبدء هو ورقة البيانات PIC16F877A. السجلات التي تتحكم في اتصال SPI لـ PIC16F8777a هي SSPSTAT وسجل SSPCON. يمكنك الاطلاع عليها في الصفحة 74 و 75 من ورقة البيانات.
هناك العديد من خيارات المعلمات التي يجب اختيارها أثناء تهيئة اتصال SPI. الخيار الأكثر استخدامًا هو أن تردد الساعة سيتم ضبطه على Fosc / 4 وسيتم ضبطه في المنتصف وسيتم ضبط الساعة على مستوى منخفض في الحالة المثالية. لذلك نحن أيضًا نستخدم نفس التكوين لملف الرأس الخاص بنا ، يمكنك تغييرها بسهولة عن طريق تغيير البتات المعنية.
SPI_Initialize_Master ()
يتم استخدام وظيفة التهيئة الرئيسية SPI لبدء اتصال SPI بصفته الرئيسية. داخل هذه الوظيفة ، قمنا بتعيين المسامير المعنية RC5 و RC3 كدبابيس إخراج. ثم نقوم بتهيئة SSPTAT وسجل SSPCON لتشغيل اتصالات SPI
باطل SPI_Initialize_Master () { TRISC5 = 0 ؛ // SSPSTAT = 0b00000000 ؛ // ص 74/234 SSPCON = 0b00100000 ؛ // ص 75/234 TRISC3 = 0 ؛ // مجموعة كإخراج لوضع الرقيق }
SPI_Initialize_Slave ()
تُستخدم هذه الوظيفة لضبط المتحكم الدقيق للعمل في الوضع التابع لاتصال SPI. أثناء وضع الرقيق ، يجب تعيين الطرف RC5 كإخراج ويجب تعيين الدبوس RC3 كمدخل. يتم تعيين SSPSTAT و SSPCON بنفس الطريقة لكل من العبد والسيد.
باطل SPI_Initialize_Slave () { TRISC5 = 0 ؛ // يجب التصريح عن دبوس SDO كإخراج SSPSTAT = 0b00000000 ؛ // ص 74/234 SSPCON = 0b00100000 ؛ // ص 75/234 TRISC3 = 1 ؛ // تعيين في الخارج للوضع الرئيسي }
SPI_Write (شار وارد)
تُستخدم وظيفة الكتابة SPI لكتابة البيانات في ناقل SPI. يحصل على المعلومات من المستخدم من خلال المتغير الوارد ثم يستخدمها للتمرير إلى سجل المخزن المؤقت. سيتم مسح SSPBUF في نبضة الساعة المتتالية وسيتم إرسال البيانات إلى الناقل شيئًا فشيئًا.
باطل SPI_Write (شار وارد) { SSPBUF = وارد ؛ // اكتب بيانات المستخدم المعطاة في المخزن المؤقت }
SPI_Ready2Read ()
يتم استخدام وظيفة SPI جاهز للقراءة للتحقق مما إذا كانت البيانات الموجودة في ناقل SPI قد تم استلامها بالكامل وما إذا كان يمكن قراءتها. يحتوي سجل SSPSTAT على بعض الشيء يسمى BF والذي سيتم تعيينه بمجرد استلام البيانات بالكامل ، لذلك نتحقق مما إذا تم تعيين هذا البت إذا لم يتم تعيينه ، ثم يتعين علينا الانتظار حتى يتم ضبطه لقراءة أي شيء من ناقل SPI.
SPI_Ready2Read () بدون إشارة { if (SSPSTAT & 0b00000001) إرجاع 1 ؛ آخر إرجاع 0 ؛ }
قراءة_ SPI ()
يتم استخدام قراءة SPI لقراءة البيانات من ناقل SPI إلى وحدة التحكم الدقيقة. سيتم تخزين البيانات الموجودة في ناقل SPI في SSPBUF ، وعلينا الانتظار حتى يتم تخزين البيانات الكاملة في المخزن المؤقت ومن ثم يمكننا قراءتها في متغير. نتحقق من BF بت من سجل SSPSTAT قبل قراءة المخزن المؤقت للتأكد من اكتمال استقبال البيانات.
char SPI_Read () // اقرأ البيانات المستلمة { while (! SSPSTATbits.BF) ؛ // استمر حتى يتم تعيين BF bit ، للتأكد من قراءة البيانات الكاملة للعودة (SSPBUF) ؛ // إرجاع البيانات المقروءة }
شرح البرنامج الرئيسي:
ستكون الوظائف الموضحة في القسم أعلاه في ملف الرأس ويمكن استدعاؤها في ملف c الرئيسي. لذلك دعونا نكتب برنامجًا صغيرًا للتحقق مما إذا كان اتصال SPI يعمل. سنكتب فقط القليل من البيانات في ناقل SPI ونستخدم محاكاة البروتيوس للتحقق مما إذا كان يتم تلقي نفس البيانات في مصحح أخطاء SPI.
كما هو الحال دائمًا ، ابدأ البرنامج عن طريق ضبط بتات التكوين ومن ثم من المهم جدًا إضافة ملف الرأس الذي شرحناه للتو في البرنامج كما هو موضح أدناه
#تضمن
إذا فتحت البرنامج من الملف المضغوط الذي تم تنزيله أعلاه ، فسيكون ملف الرأس افتراضيًا موجودًا داخل دليل ملف الرأس لملف مشروعك. عدا ذلك ، يجب عليك إضافة ملف الرأس يدويًا داخل مشروعك ، بمجرد إضافة ملفات مشروعك ستبدو كما يلي
داخل الملف الرئيسي ، يتعين علينا تهيئة PIC كـ Master للاتصال SPI ثم داخل حلقة أثناء اللانهائية ، سنكتب ثلاث قيم سداسية عشرية عشوائية في ناقل SPI للتحقق مما إذا كنا نتلقى نفس الشيء أثناء المحاكاة.
باطل رئيسي () { SPI_Initialize_Master () ، بينما (1) { SPI_Write (0X0A) ؛ __delay_ms (100) ؛ SPI_Write (0X0F) ؛ __delay_ms (100) ؛ SPI_Write (0 × 15) ؛ __delay_ms (100) ؛ } }
لاحظ أن القيم العشوائية المستخدمة في البرنامج هي 0A و 0F و 15 وهي قيم سداسية لذا يجب أن نرى نفس الشيء أثناء المحاكاة. هذا هو الرمز تم الانتهاء منه ، هذه مجرد عينة ولكن يمكننا استخدام نفس المنهجية للتواصل مع MCU الأخرى أو مع وحدة أجهزة الاستشعار الأخرى العاملة على بروتوكول SPI
محاكاة PIC مع مصحح أخطاء SPI:
الآن بعد أن أصبح برنامجنا جاهزًا ، يمكننا تجميعه ثم المضي قدمًا في المحاكاة. يحتوي Proteus على ميزة سهلة الاستخدام تسمى مصحح أخطاء SPI ، والتي يمكن استخدامها لمراقبة البيانات عبر ناقل SPI. لذلك نستخدم نفس الشيء ونبني دائرة كما هو موضح أدناه.
نظرًا لوجود جهاز SPI واحد فقط في المحاكاة ، فإننا لا نستخدم دبوس SS وعند عدم استخدامه ، يجب تأريضه كما هو موضح أعلاه. فقط قم بتحميل الملف السداسي في متحكم PIC16F877A وانقر على زر التشغيل لمحاكاة برنامجنا. بمجرد بدء المحاكاة ، ستظهر لك نافذة منبثقة تعرض البيانات في ناقل SPI كما هو موضح أدناه
دعنا نلقي نظرة فاحصة على البيانات الواردة ونتحقق مما إذا كانت هي نفسها التي كتبناها في برنامجنا.
يتم استلام البيانات بنفس الترتيب الذي كتبناه في برنامجنا ويتم تمييز نفس الشيء لك. يمكنك أيضًا تجربة محاكاة برنامج للتواصل مع اثنين من وحدات التحكم الدقيقة PIC باستخدام بروتوكول SPI. يجب عليك برمجة الموافقة المسبقة عن علم على أنها السيد والأخرى كالعبد. تم توفير جميع ملفات الرأس المطلوبة لهذا الغرض في ملف الرأس بالفعل.
هذه مجرد لمحة عما يمكن أن يفعله SPI ، يمكنه أيضًا قراءة البيانات وكتابتها على أجهزة متعددة. سنغطي المزيد حول SPI في دروسنا القادمة من خلال ربط الوحدات المختلفة التي تعمل مع بروتوكول SPI.
أتمنى أن تكون قد فهمت المشروع وتعلمت منه شيئًا مفيدًا. إذا كانت لديك أي شكوك ، فقم بنشرها في قسم التعليقات أدناه أو استخدم المنتديات للحصول على المساعدة الفنية.
تم إعطاء الرمز الرئيسي الكامل أدناه ؛ يمكنك تنزيل ملفات الترويسة بجميع الأكواد من هنا