- إعداد الأجهزة والمتطلبات لتمكين وظيفة SPI على N76E003
- من الدائرة إلى الواجهة
- دبابيس SPI على متحكم Nuvoton N76E003
- معلومات SPI N76E003
- رئيس
- برمجة
- اختبار SPI Communication على Nuvoton باستخدام Arduino
SPI هو بروتوكول اتصال مهم يستخدم على نطاق واسع للتواصل بين المتحكمات الدقيقة وبطاقات SD والعديد من أجهزة الاستشعار الأخرى. يرمز SPI إلى Serial Peripheral Interface ، وهو بروتوكول نقل بيانات متزامن حيث يمكن للجهاز الرئيسي الاتصال بأجهزة تابعة متعددة بالإضافة إلى الحصول على البيانات منها. إنه متزامن لأن السيد يولد ساعة في خط إدخال / إخراج منفصل يضمن أن كلا الجهازين ، الرئيسي والرقيق يعملان بنفس سرعة الساعة.
يستخدم بروتوكول SPI سطري بيانات وخط اختيار واحد وخط ساعة واحد. الاتصالات هي SS (Slave Select) و MISO (Master In Slave Out) و MOSI (Master Out Slave In) و SCK (Serial Clock). على الرغم من خط SCK ، فإن السيد يولد ساعة ، ويستخدم SS لاختيار أي عبد فردي في خط ناقل حيث يتم توصيل العديد من الأجهزة التابعة بالسيد. يتم استخدام MISO لتلقي البيانات من العبد ، ويتم استخدام MOSI لإرسال البيانات من السيد إلى الجهاز التابع.
في السابق ، قمنا ببناء العديد من المشاريع التي تستخدم بروتوكول SPI ، من أجل التواصل بين المستشعرات ، لذا تحقق منها إذا كنت تريد معرفة المزيد عن الموضوع. أيضًا ، إذا كنت تريد البدء بأساسيات لوحة Nuvoton N76E003 ، ففكر في التحقق من دليل البدء باستخدام nuvoton
إعداد الأجهزة والمتطلبات لتمكين وظيفة SPI على N76E003
الهدف من هذا المشروع هو تعلم اتصال SPI باستخدام N76E003 ، وأفضل طريقة هي إعداد مثال SPI حيث نقوم بنقل رسالة بين وحدتي تحكم دقيق ، للقيام بذلك ، سنستخدم Arduino كجهاز تابع وهو متصل بخط N76E003 SPI. سنرسل البيانات إلى Arduino ونتحقق من صحتها ونطبعها باستخدام Arduinos UART. بعد ذلك ، نرسل بيانات من Arduino إلى N76E003 ، ونتحقق من صحتها ، ونطبعها باستخدام N76E003 UART ، ولهذا السبب يصبح محول USB إلى UART لـ N76E003 ويصبح Arduino ضروريًا لتطبيقنا كمثال ، سنستخدم CP2102 UART إلى USB المحول و Arduino Nano لتلبية متطلباتنا.
ناهيك ، بخلاف الأشياء المذكورة أعلاه ، نحتاج إلى لوحة التطوير القائمة على وحدة التحكم الدقيقة N76E003 وكذلك مبرمج Nu-Link لبرمجة اللوحة. بالإضافة إلى ذلك ، يتم استخدام أسلاك berg لجميع توصيلات الأجهزة.
أثناء العودة ، قمنا بإعداد بعض المقالات مثل RS-485 MODBUS Serial Communication مع Arduino كـ Master ، و Arduino إلى Arduino Bluetooth Communication باستخدام تكوين Master-Slave حيث قمنا بإعداد Arduino كجهاز رئيسي ، لا تتردد في التحقق من ذلك إذا كان ذلك يصل إلى ذروتك فائدة.
من الدائرة إلى الواجهة
كما نرى في التخطيطي ، فإن Arduino Nano متصل بـ SPI لـ N76E003. في أقصى اليسار ، يظهر اتصال واجهة البرمجة.
دبابيس SPI على متحكم Nuvoton N76E003
يمكن رؤية مخطط دبوس N76E003 في الصورة أدناه-
كما نرى في الرسم البياني أعلاه ، كل دبوس له مواصفات وظيفية متعددة ، ويمكن برمجة كل منها حسب التطبيق. ومع ذلك، ودبابيس 0.1 ، 0.0 ، 1.0 ، و 1.5 تستخدم كما MISO ، موزي ، SPCLK ، و SS دبابيس على التوالي. إذا قمنا بتمكين SPI ، فسوف يفقد PWM والوظائف الأخرى. ولكن ، هذه ليست مشكلة حيث أن وظيفة أخرى غير مطلوبة لهذا المشروع. تعتبر هذه الشريحة جميع دبابيس SPI على أنها GPIO ، ولهذا السبب يجب تكوينها. يتم وصف طريقة التكوين أدناه.
وفقًا لورقة البيانات ، يعد PxM1.n و PxM2.n مسجلين يتم استخدامهما لتحديد عملية التحكم في منفذ الإدخال / الإخراج. في ورقة البيانات N76E003 ، يُذكر أنه لاستخدام وظيفة SPI ، يجب استخدام أوضاع الإدخال / الإخراج كوضع شبه لاتصالات SPI.
معلومات SPI N76E003
يعد جهاز SPI المحيطي ميزة لا غنى عنها لأي متحكم دقيق ، فهو ليس سهل الاستخدام فحسب ، بل يمكنه أيضًا تحقيق أسرع سرعات نقل من بين العديد من بروتوكولات الاتصال العامة الأخرى ، وهذا هو السبب في أن الأنواع المختلفة من وحدات التحكم الدقيقة تأتي مع جهاز طرفي SPI مدمج.
قبل متابعة اتصال SPI ، من المهم معرفة بعض الأشياء حول اتصال SPI على N7E003.
SS دبوس من N76E003:
إنه دبوس مهم في اتصال SPI. يحدد دبوس Slave Select عبيد معينين في ناقل SPI متعدد الرقيق. يجب أن يتطلب كل العبيد الأفراد دبوس تحديد تابع واحد. لا يمكن توصيل دبوس SS واحد بالعديد من العبيد.
تُظهر الصورة أدناه اتصالات الرقيق المتعددة المحتملة-
تحديد أول بت MSB أو LSB First بت في N76E003:
يدعم N76E003 نوعين من اتصالات البيانات - MSB أولاً أو LSB أولاً. بشكل افتراضي ، يتم تحديد MSB أولاً. ومع ذلك ، يمكن أيضًا تحديد البيانات الأولى لـ LSB في N76E003. سنهتم بهذا الاختيار في عملية الترميز.
يظهر اتصال SPI البسيط مع Single-Master و Single-Salve في الصورة أدناه-
سجل التحكم المحيطي SPI (SPCR) من N76E003:
سجل التحكم SPI يستخدم SPCR للتحكم في عمليات SPI.
أول بتين هما بت تحديد سرعة الساعة SPI. يتم توضيح معدلات الساعة أدناه حيث يكون تردد النظام 16 ميجا هرتز.
بت CPHA هي بتة تحديد طور الساعة. إذا تم تعيين علامة CPHA ، يتم أخذ عينات البيانات على الحافة الثانية لساعة SPI. إذا تم مسحها ، فسيتم أخذ عينات من البيانات على الحافة الأولى. البتة التالية هي CPOLI وهي مستوى حالة الخمول لساعة SPI. إذا تم الضبط على 0 ، ستكون الساعة منخفضة في حالة الخمول ، وإذا تم ضبطها على 1 ، فستكون عالية في حالة الخمول. MSTR هو بت تمكين الوضع الرئيسي ، والذي يستخدم لتكوين N76E003 كوضع رئيسي ، ومسح هذا البت سيجعله وضعًا تابعًا. يستخدم LSBFE في اتجاه نقل البيانات. سيؤدي مسح هذه البتة إلى جعل نقل البيانات كـ MSB أولاً ، في حين أن تعيينه 1 سيؤدي إلى تنشيط الاتجاه الأول LSB. يتم استخدام SPIEN لتمكين SPI. الإعداد 1 سيمكن SPI الطرفية. SSOE النهائي هو بت تمكين إخراج تحديد الرقيق SPI ،ويتم استخدامه لتكوين دبوس SS كأغراض عامة أو في الوضع التلقائي.
بخلاف ما سبق ، هناك سجل آخر يسمى Serial Peripheral Status Record.
يتم استخدام السجل أعلاه للحصول على حالة SPI المختلفة.
رئيس
الوظيفة الرئيسية بسيطة ، وسوف تبدأ SPI الطرفية و UART ، كما أنها ستستدعي Start_Sending_SPI () ؛ تعمل في حلقة الوقت. إذا كنت جديدًا في استخدام UART مع Nuvoton ، فراجع البرنامج التعليمي المرتبط.
باطل رئيسي (باطل) {Set_All_GPIO_Quasi_Mode ؛ الأولي UART0_Timer1 (115200) ؛ / * 115200 معدل الباود * / SPI_Initial () ؛ printf ("\ nSPI ابدأ الإرسال… \ n")؛ while (1) // SPI transfer finish {Start_Sending_SPI () ؛ }}
دعنا نلقي نظرة على SPI_Initial () ؛ وظيفة.
SPI_Initial باطل (باطل) {P15_Quasi_Mode ؛ // P15 (SS) شبه الوضع P10_Quasi_Mode ؛ // P10 (SPCLK) شبه الوضع P00_Quasi_Mode ؛ // P00 (MOSI) شبه الوضع P01_Quasi_Mode ؛ // P22 (MISO) شبه وضع set_DISMODF ؛ // SS I / O للأغراض العامة (لا يوجد خطأ في الوضع) clr_SSOE ؛ clr_LSBFE ؛ // MSB أول clr_CPOL ؛ // ساعة SPI منخفضة في وضع الخمول set_CPHA ؛ // البيانات
العينة على الحافة الثانية لساعة SPI.
مجموعة_MSTR ؛ // SPI في الوضع الرئيسي SPICLK_DIV2 ؛ // حدد ساعة SPI Enable_SPI_Interrupt ؛ // تمكين SPI interrupt set_SPIEN ؛ // تمكين وظيفة SPI}
كما هو موضح من قبل ، يجب تكوين دبابيس منفذ SPI وتعيينها على أنها تكوين شبه ، وأول أربعة أسطر داخل وظيفة SPI_Initial () تفعل ذلك بالضبط ، يتم تحديد تكوين SPI باعتباره دبوس SS للأغراض العامة ، سيتم نقل البيانات على أنها MSB أولاً ، تكون ساعة SPI منخفضة في وضع الخمول مع أخذ عينات بيانات الحافة الثانية. نظرًا لأن N76E003 سيعمل كوضع رئيسي ، يتم تعيينه كوضع رئيسي. يتم تعيين مقاطعة SPI مع SPI بت تمكين SPI. تتوفر جميع هذه الوظائف في ملف الرأس SFR_Macro.h .
في وظيفة Start_Sending_SPI () ، يتم سحب دبوس SS أولاً ، ويتم إرسال البيانات إلى Arduino عبر SPI. سيحتفظ سجل SPDR بالقيمة التي سيتم إرسالها إلى التابع SPI وكذلك سيتلقى القيمة من التابع.
Start_Sending_SPI () باطل {SS = 0 ؛ SPDR = 0x90 ؛ // أرسل 0x90 إلى Slave PCON - = SET_BIT0 ؛ // أدخل وضع الخمول إذا (SPDR! = 0x4E) // Receive slave 1st DATA SPI_Error () ؛ printf ("\ n Slave Return٪ x \ n"، SPDR & 0xFF)؛ SS = 1 ؛ }
ومع ذلك ، هناك شرط التحقق من الصحة ، حيث يتم التحقق من قيمة SPRD باستخدام (0x4E) المستلمة من Arduino. إذا لم تكن البيانات هي 0x4E ، فستوقف اتصال SPI عن طريق الدخول في حلقة while.
باطل SPI_Error (باطل) {printf ("\ n Slave أوقف إرسال البيانات. \ n")؛ while (1) // خطأ SPI و P0.7 فلاش / {}}
نظرًا لاستخدام SPI في مقاطعة المؤقت ، يتم استخدام وظيفة ISR واحدة هنا-
باطل SPI_ISR (باطل) مقاطعة 9 // Vecotr @ 0x4B {clr_SPIF ؛ Timer3_Delay10us (1) ؛ }
سيتم مسح SPIF بفجوة زمنية تبلغ 1 ميكروثانية.
برمجة
يحتوي Arduino Nano أيضًا على نفس دبابيس SPI الموضحة في الصورة أدناه
ومع ذلك ، لن ندخل في التفاصيل حول Arduino SPI ، حيث يوجد الكثير من التفاصيل المتاحة التي توضح كيفية استخدام SPI على Arduino.
أولاً ، نقوم بتضمين جميع العناوين والمتغيرات الضرورية ،
#تضمن
بعد ذلك ، في قسم الإعداد ، نقوم بتهيئة UART ، وقمنا بتعيين دبوس MISO المحدد مسبقًا كمخرج ، وقمنا بتمكين SPI في وضع الرقيق ، وقمنا بتعيين المتغير المستلم المحدد مسبقًا على أنه خطأ ، وأخيرًا ، نقوم بتمكين المقاطعة الخاصة بنا ، والتي تمثل نهاية حلقة الإعداد.
إعداد باطل () {Serial.begin (115200) ؛ pinMode (MISO ، الإخراج) ؛ // يعين MISO كـ OUTPUT (يجب إرسال البيانات إلى Master IN SPCR - = _BV (SPE) ؛ // تشغيل SPI في وضع Slave المتلقى = false ؛ SPI.attachInterrupt () ؛ // تم تعيين Interuupt ON لـ SPI commnucation}
بعد ذلك ، حددنا روتين خدمة المقاطعة الخاص بنا ، في روتين خدمة المقاطعة ، نقوم بتفريغ البيانات من SPDR Register إلى Slaver Received المتغير المحدد مسبقًا ، ونطبع البيانات باستخدام وظائف Serial.print المضمنة وقمنا بتعيين المتغير المستلم على صحيح.
في قسم الحلقة ، نرسل قيمة محددة مسبقًا إلى سجل SPDR ، مرة كل ثانية تنقل البيانات إلى الوحدة الرئيسية.
اختبار SPI Communication على Nuvoton باستخدام Arduino
الكود الكامل موجود في نهاية هذه الصفحة. عاد الكود عند التحميل إلى 0 تحذير و 0 أخطاء ووميض باستخدام طريقة الوميض الافتراضية بواسطة Keil. يبدأ التطبيق العمل.
إنشاء رابط الهدف 'SPI_INT_M'… حجم البرنامج: البيانات = 58.2 xdata = 0 كود = 2402 إنشاء ملف سداسي عشري من ". \ Output \ Master_P"… ". \ Output \ Master_P" - 0 خطأ (أخطاء) ، 0 تحذير (تحذيرات). وقت الإنشاء المنقضي: 00:00:01 ملخص إنشاء الدُفعة: نجح 1 ، فشل 0 ، تم تخطي 0 - الوقت المنقضي: 00:00:01
لقد استخدمت أسلاك توصيل لتوصيل لوح nuvoton الخاص بي بـ Arduino ، يظهر اتصال إعداد الاختبار الخاص بي أدناه.
يمكن رؤية إخراج UART في الصور أدناه. عندما نفتح الشاشة التسلسلية لـ Arduino ، يمكننا رؤية القيم من لوحة nuvoton التي يتم تلقيها من خلال اتصال SPI.
وبالمثل ، على جانب nuvoton ، استخدمنا مصطلح tera لمراقبة البيانات التي يتم تلقيها من العبد (هنا Arduino). في الأساس ، نرسل 90 من nuvoton إلى Arduino ونرسل 4e00 من Arduino إلى nuvoton. من اللقطات الموجودة على الشاشة التسلسلية ، من الواضح أن كلاً من SPI master و slave يعملان كما هو متوقع.
يمكنك التحقق من الفيديو المرتبط أدناه للحصول على العرض التوضيحي الكامل لهذا البرنامج التعليمي. آمل أن تكون قد استمتعت بالمقال وتعلمت شيئًا مفيدًا. إذا كانت لديك أي أسئلة ، فيمكنك تركها في قسم التعليقات أدناه أو استخدام منتدياتنا لنشر أسئلة فنية أخرى.