مــا نحــنُ إلا طُـــلاب عــلمِ نسعـــى لنشـــر الرحمـــة مــن خــلال العــلـــم ----- مطلوب مدرس - مدرب لديه خبره في الإلكترونيات التفاعلية و الأردوينو، راسلنا على رسائل الموقع
image

واجهـــة الطرفيـــات المتسلسلــة

ناقل واجهــة الطرفيــات المتسلسلــة (SPI) هو نظام للاتصالات التسلسلية، والذي يستخدم ما يصل إلى أربعة أطـراف، عادةً ثلاثة. يتم استخدام طرف واحد لتلقي البيانات، وواحد لإرسال البيانات، وواحد للمزامنة، وواحد بدلاً من ذلك لاختيار جهاز للاتصال به. وهو اتصال مزدوج كامل، مما يعني أنه يتم إرسال البيانات واستقبالها في وقت واحد. الحد الأقصى لمعدل نقــل البيانات Baud rate أعلى من ذلك الموجود في نظام الاتصالات I2C.

أطـــراف الـ SPI فــي الأردوينـــو

تستخدم واجهــة الطرفيات المتسلسلــة الأطراف الأربعــة التاليــة:

  • SCK - هذه هي الساعة التسلسلية التي يقودها السيد.
  • MOSI - هذا هو المخرج للجهــاز السيــد / المدخل للجهــاز التابع الذي يحركه السيد.
  • MISO - هذا هو الإدخال للجهــاز السيــد / الإخراج للجهــاز التابع الذي يحركه السيد.
  • SS - هذا هو سلك اختيار التابــع.

يتــم أستخدام الدوال التاليــة في إتصــال الـ SPI يجــب عليك أولاً تضمين مكتبــة SPI.h

  • SPI.begin() - تهيئة ناقل SPI عن طريق ضبط SCK وMOSI وSS كـ مخــارج، و جعــل SCK وMOSI منخفــض LOW، و جعل SS مرتفــع HIGH.
  • SPI.setClockDivider(divider) - لضبط مقسم ساعة SPI بالنسبة لساعة النظام. في اللوحات المعتمدة على AVR، تكون المقسمات المتوفرة هي 2 أو 4 أو 8 أو 16 أو 32 أو 64 أو 128. الإعداد الافتراضي هو SPI_CLOCK_DIV4، الذي يضبط ساعة SPI على ربع تردد ساعة النظام (5 ميجا هرتز لـ لوحات الـ 20 ميغاهيرتز).
  • المقسم Divider - يمكن أن يكون (SPI_CLOCK_DIV2، SPI_CLOCK_DIV4، SPI_CLOCK_DIV8، SPI_CLOCK_DIV16، SPI_CLOCK_DIV32، SPI_CLOCK_DIV64، SPI_CLOCK_DIV128).
  • SPI.transfer(val) - يعتمد نقل SPI على الإرسال والاستقبال المتزامنين: يتم إرجاع البيانات المستلمة في ReceiveVal.
  • SPI.beginTransaction(SPISettings(speedMaximum, dataOrder, dataMode)) - speedMaximum هي الساعة أو dataOrder(MSBFIRST أو LSBFIRST) أو dataMode(SPI_MODE0 أو SPI_MODE1 أو SPI_MODE2 أو SPI_MODE3).

يــوجــد أربعــة أوضــاع للتشغيــل في أتصــال الـ SPI هــم:

  • الوضع 0 (الافتراضي) - الساعة منخفضة عادة (CPOL = 0)، ويتم أخذ عينات من البيانات عند الانتقال من الأدنى إلى الأعلى (الحافة الأمامية leading edge  ) (CPHA = 0).
  • الوضع 1 - الساعة منخفضة عادة (CPOL = 0)، ويتم أخذ عينات من البيانات عند الانتقال من الأعلى إلى الأدنى (الحافة الخلفية trailing edge ) (CPHA = 1).
  • الوضع 2 - الساعة مرتفعة عادة (CPOL = 1)، ويتم أخذ عينات من البيانات عند الانتقال من الأعلى إلى الأدنى (الحافة الأمامية leading edge  ) (CPHA = 0).
  • الوضع 3 - الساعة مرتفعة عادة (CPOL = 1)، ويتم أخذ عينات من البيانات عند الانتقال من الأدنى إلى الأعلى (الحافة الخلفية  trailing edge) (CPHA = 1).

 

  • SPI.attachInterrupt(handler) – الدالــة التي سيتم استدعاؤها عندما يتلقى الجهاز التابع البيانات من الجهاز السيــد.

 

الآن، سوف نقوم بربط لوحتي Arduino UNO معًا؛ أحدهما سيد والآخر كتابــع. سنقــوم بتــوصيل الأطراف كالتالــي:

  • (SS) : pin 10
  • (MOSI) : pin 11
  • (MISO) : pin 12
  • (SCK) : pin 13

الأرضي مشترك. فيما يلي الرســم التخطيطي للتوصيــل بين اللوحتين

ضبــط الــ SPI كسيــد

مثــال

 

#include <SPI.h>

 

void setup (void) {

   Serial.begin(115200); //set baud rate to 115200 for usart

   digitalWrite(SS, HIGH); // disable Slave Select

   SPI.begin ();

   SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8

}

 

void loop (void) {

   char c;

   digitalWrite(SS, LOW); // enable Slave Select

   // send test string

   for (const char * p = "Hello, world!\r" ; c = *p; p++) {

      SPI.transfer (c);

      Serial.print(c);

   }

   digitalWrite(SS, HIGH); // disable Slave Select

   delay(2000);

}

 

ضبــط الــ SPI كتابــع

مثــال

#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;
 
void setup (void) {
   Serial.begin (115200);
   pinMode(MISO, OUTPUT); // have to send on master in so it set as output
   SPCR |= _BV(SPE); // turn on SPI in slave mode
   indx = 0; // buffer empty
   process = false;
   SPI.attachInterrupt(); // turn on interrupt
}
ISR (SPI_STC_vect) // SPI interrupt routine { 
   byte c = SPDR; // read byte from SPI Data Register
   if (indx < sizeof buff) {
      buff [indx++] = c; // save data in the next index in the array buff
      if (c == '\r') //check for the end of the word
      process = true;
   }
}
 
void loop (void) {
   if (process) {
      process = false; //reset the process
      Serial.println (buff); //print the array on serial monitor
      indx= 0; //reset button to zero
   }
}

 

المخترع المجنـون

مدون و كاتب محتوى تكنولوجي و متخصص في علوم الإلكترونيات

التعليقات

سجل الدخول لتترك تعليق

نقوم بالتبرع بـ 5 % من قيمـة المنتجات للأعمال الخيرية

تـواصـل معنـا

الطائــف - المملكــة العربيــة السعــوديـة

المـوقـع مـوثـق من

المختــرع المجنــون © جميـــع الحقــوق محفوظــة