- SPI في STM32F103C8
- دبابيس SPI في Arduino
- المكونات مطلوبة
- مخطط الدائرة والوصلات لشرح STM32 SPI
- برمجة STM32 SPI
- شرح البرمجة الرئيسية STM32 SPI
- شرح برمجة Slave Arduino SPI
في دروسنا السابقة ، تعلمنا عن اتصال SPI و I2C بين لوحتين من Arduino. في هذا البرنامج التعليمي ، سنستبدل لوحة Arduino بلوحة Blue Pill وهي STM32F103C8 وسوف نتواصل مع لوحة Arduino باستخدام ناقل SPI. في مثال STM32 SPI هذا ، سنستخدم Arduino UNO كـ Slave و STM32F103C8 كشاشة رئيسية مع شاشتين LCD 16X2 متصلتين ببعضهما البعض بشكل منفصل يتم توصيل اثنين من مقاييس الجهد أيضًا بـ STM32 (PA0) و Arduino (A0) لتحديد قيم الإرسال (من 0 إلى 255) من السيد إلى العبد والعبد إلى السيد عن طريق تغيير مقياس الجهد.
SPI في STM32F103C8
بمقارنة ناقل SPI في لوحة Arduino و STM32F103C8 Blue Pill ، فإن STM32 بها ناقلان SPI بينما يحتوي Arduino Uno على ناقل SPI واحد. يحتوي Arduino Uno على متحكم ATMEGA328 فيه ، بينما يحتوي STM32F103C8 على ARM Cortex- M3 مما يجعله أسرع من Arudino Board.
لمعرفة المزيد حول اتصال SPI ، راجع مقالاتنا السابقة
- كيفية استخدام SPI في Arduino: الاتصال بين لوحتي Arduino
- اتصال SPI مع PIC Microcontroller PIC16F877A
- اتصال SPI عبر Bit Banging
- كاشف تسرب خزان المياه الساخنة Raspberry Pi باستخدام وحدات SPI
- ساعة الوقت الحقيقي ESP32 باستخدام وحدة DS3231
دبابيس STM32 SPI STM32F103C8
خط SPI 1 | دبوس في STM32F103C8 |
MOSI1 | PA7 أو PB5 |
ميسو 1 | PA6 أو PB4 |
SCK1 | PA5 أو PB3 |
SS1 | PA4 أو PA15 |
خط SPI 2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
دبابيس SPI في Arduino
خط SPI |
دبوس في اردوينو |
MOSI |
11 أو ICSP-4 |
ميسو |
12 أو ICSP-1 |
SCK |
13 أو ICSP-3 |
SS |
10 |
المكونات مطلوبة
- STM32F103C8
- اردوينو
- شاشة LCD 16x2 - 2
- 10 كيلو الجهد - 4
- اللوح
- توصيل الأسلاك
مخطط الدائرة والوصلات لشرح STM32 SPI
يوضح الجدول أدناه الدبابيس المتصلة لاتصال STM32 SPI مع Arduino.
دبوس SPI |
STM32F103C8 |
اردوينو |
MOSI |
PA7 |
11 |
ميسو |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
يوضح الجدول أدناه المسامير المتصلة بشاحتي LCD (16 × 2) مع STM32F103C8 و Arduino بشكل منفصل.
دبوس LCD |
STM32F103C8 |
اردوينو |
VSS |
GND |
GND |
VDD |
+ 5 فولت |
+ 5 فولت |
V0 |
إلى رمز PIN لمركز مقياس الجهد لتباين شاشات الكريستال السائل |
إلى رمز PIN لمركز مقياس الجهد لتباين شاشات الكريستال السائل |
RS |
PB0 |
2 |
RW |
GND |
GND |
ه |
PB1 |
3 |
د 4 |
PB10 |
4 |
د 5 |
PB11 |
5 |
د 6 |
PC13 |
6 |
د 7 |
PC14 |
7 |
أ |
+ 5 فولت |
+ 5 فولت |
ك |
GND |
GND |
مهم:
- لا تنس توصيل Arduino GND و STM32F103C8 GND معًا.
برمجة STM32 SPI
البرمجة تشبه كود اردوينو. نفس الشيء
في مثال STM32 SPI هذا ، سنستخدم Arduino UNO كـ Slave و STM32F103C8 كشاشة رئيسية مع شاشتين LCD 16X2 متصلتين ببعضهما البعض بشكل منفصل يتم توصيل اثنين من مقاييس الجهد أيضًا بـ STM32 (PA0) و Arduino (A0) لتحديد قيم الإرسال (من 0 إلى 255) من السيد إلى العبد والعبد إلى السيد عن طريق تغيير مقياس الجهد.
يتم أخذ الإدخال التناظري عند STM32F10C8 pin PA0 (من 0 إلى 3.3 فولت) عن طريق تدوير مقياس الجهد. ثم يتم تحويل قيمة الإدخال هذه إلى قيمة تناظرية إلى رقمية (من 0 إلى 4096) ويتم تعيين هذه القيمة الرقمية أيضًا إلى (0 إلى 255) حيث يمكننا إرسال بيانات 8 بت (بايت) فقط من خلال اتصال SPI في وقت واحد.
وبالمثل في الجانب التابع ، نأخذ قيمة الإدخال التناظرية في Arduino pin A0 من (0 إلى 5V) باستخدام مقياس الجهد. ومرة أخرى يتم تحويل قيمة الإدخال هذه إلى قيمة تناظرية إلى رقمية (من 0 إلى 1023) ويتم تعيين هذه القيمة الرقمية أيضًا إلى (0 إلى 255)
يحتوي هذا البرنامج التعليمي على برنامجين أحدهما لـ Master STM32 والآخر لـ Slave Arduino. يتم تقديم برامج كاملة لكلا الجانبين في نهاية هذا المشروع مع فيديو توضيحي.
شرح البرمجة الرئيسية STM32 SPI
1. أولاً وقبل كل شيء نحتاج إلى تضمين مكتبة SPI لاستخدام وظائف الاتصال SPI ومكتبة LCD لاستخدام وظائف LCD. حدد أيضًا دبابيس LCD لـ 16x2 LCD. تعرف على المزيد حول توصيل شاشة LCD مع STM32 هنا.
#تضمن
2. في الإعداد الباطل ()
- بدء الاتصال التسلسلي بسعر الباود 9600.
Serial.begin (9600) ؛
- بعد ذلك ، ابدأ اتصال SPI
SPI.begin () ،
- ثم قم بتعيين مقسم الساعة لاتصال SPI. لقد قمت بتعيين الفاصل 16.
SPI.setClockDivider (SPI_CLOCK_DIV16) ،
- بعد ذلك ، قم بتعيين SS pin HIGH لأننا لم نبدأ أي نقل إلى slave arduino.
الكتابة الرقمية (SS ، عالية) ؛
3. في الحلقة الفارغة ()
- قبل إرسال أي قيمة إلى العبد ، نحتاج إلى خفض قيمة تحديد العبد لبدء النقل إلى التابع من السيد.
الكتابة الرقمية (SS ، منخفضة) ؛
- بعد ذلك ، اقرأ القيمة التناظرية من STM32F10C8 POT الرئيسية المرفقة بالدبوس PA0.
وعاء int = analogRead (PA0) ؛
ثم قم بتحويل هذه القيمة من حيث بايت واحد (0 إلى 255).
بايت MasterSend = خريطة (وعاء ، 0،4096،0،255) ؛
- هنا تأتي الخطوة المهمة ، في العبارة التالية نرسل قيمة POT المحولة المخزنة في متغير Mastersend إلى العبد Arduino ، كما نتلقى القيمة من العبد Arduino ونخزنها في متغير mastereceive .
Mastereceive = SPI.transfer (Mastersend) ؛
- قم بعد ذلك بعرض تلك القيم المستلمة من اردوينو التابع مع تأخير قدره 500 ميكروثانية ثم تلقي القيم وعرضها باستمرار.
Serial.println ("Slave Arduino to Master STM32") ؛ Serial.println (MasterReceive lcd.setCursor (0،0)؛ lcd.print ("Master: STM32")؛ lcd.setCursor (0،1)؛ lcd.print ("SalveVal:")؛ lcd.print (MasterReceive delay) (500) ؛ كتابة رقمية (SS ، عالية) ؛
ملاحظة: نستخدم serial.println () لعرض النتيجة في Serial Motor من Arduino IDE.
شرح برمجة Slave Arduino SPI
1. كما هو الحال مع المعلم الرئيسي ، نحتاج أولاً إلى تضمين مكتبة SPI لاستخدام وظائف اتصال I2C ومكتبة LCD لاستخدام وظائف LCD. حدد أيضًا دبابيس LCD لـ 16x2 LCD.
#تضمن
2. في الإعداد الباطل ()
- نبدأ الاتصال التسلسلي بسعر الباود 9600.
Serial.begin (9600) ؛
- يحدد البيان أدناه MISO كـ OUTPUT (يجب إرسال البيانات إلى Master IN) ، لذلك يتم إرسال البيانات عبر MISO من Slave Arduino.
pinMode (MISO ، الإخراج) ؛
- الآن قم بتشغيل SPI في وضع Slave باستخدام SPI Control Register
SPCR - = _BV (SPE) ؛
- ثم قم بتشغيل المقاطعة لاتصال SPI. في حالة تلقي بيانات من الجهاز الرئيسي ، يتم استدعاء "روتين خدمة المقاطعة" ويتم أخذ القيمة المستلمة من SPDR (سجل بيانات SPI)
SPI.attachInterrupt () ،
- القيمة من master مأخوذة من SPDR وتخزينها في متغير Slavereceived . يحدث هذا في أعقاب وظيفة المقاطعة الروتينية.
ISR (SPI_STC_vect) {Slavereceived = SPDR ؛ تلقى = صحيح ؛ }
3. الحلقة التالية في الفراغ ()
- اقرأ القيمة التناظرية من Slave Arduino POT المرفقة بالدبوس A0.
وعاء int = analogRead (A0) ؛
- قم بتحويل هذه القيمة من حيث البايت إلى 0 إلى 255.
Slavesend = خريطة (قدر ، 0،1023،0،255) ؛
- الخطوة المهمة التالية هي إرسال القيمة المحولة إلى Master STM32F10C8 ، لذا ضع القيمة في سجل SPDR. يُستخدم سجل SPDR لإرسال واستلام القيم.
SPDR = Slavesend ؛
- ثم اعرض القيمة المستلمة ( SlaveReceive ) من Master STM32F103C8 على شاشة LCD بتأخير قدره 500 ميكروثانية ثم استقبل هذه القيمة واعرضها باستمرار.
lcd.setCursor (0،0) ؛ lcd.print ("Slave: Arduino") ؛ lcd.setCursor (0،1) ؛ lcd.print ("MasterVal:") ؛ Serial.println ("Master STM32 to Slave Arduino") ؛ Serial.println (SlaveReceived) ؛ lcd.print (SlaveReceived) ؛ تأخير (500) ؛
من خلال تدوير مقياس الجهد في جانب واحد ، يمكنك رؤية القيم المتغيرة على شاشة LCD على جانب آخر:
هذه هي الطريقة التي يحدث بها اتصال SPI في STM32. يمكنك الآن ربط أي مستشعر SPI بلوحة STM32.
يتم تقديم الترميز الكامل لـ Master STM32 و Slave Arduino أدناه مع فيديو توضيحي