راه اندازی SPI در آردوینو

 

در مطلب قبلی در مورد انواع پروتکل های ارتباطی و کاربرد آنها در میکروکنترلرها صحبت کردیم و نحوه راه اندازی پروتکل USART را در آردوینو توضیح دادیم.
در این مطلب قصد داریم پروتکل SPI و نحوه راه اندازی آن در آردوینو را بررسی کنیم.

کاربرد پروتکل SPI :

پروتکل SPI (Serial Peripheral Interface) یا رابط سریال تجهیزات جانبی، همان طور که از نام آن پیداست یک رابط از نوع سریال است که برای ارتباط برقرار کردن بین میکروکنترلر و تجهیزات و قطعات خارجی مانند انواع سنسورها مورد استفاده قرار می گیرد.

در ارتباط SPI از 4 سیم برای ارتباط استفاده می شود که اغلب در کاربردهای ساده از سیم چهارم استفاده نمی شود و ارتباط به صورت 3 سیمه است.

راه اندازی SPI در آردوینو

پایه های مورد استفاده در ارتباط SPI :

SCK : پایه مربوط به کلاک که توسط میکروکنترلر مستر ایجاد می شود.

MOSI : پایه مربوط به خروج داده از مستر و ورود داده به اسلیو

MISO : پایه مربوط به خروج داده از اسلیو و ورود داده به مستر

SS : از این پایه برای انتخاب اسلیو توسط مستر استفاده می شود (معمولا توسط ایجاد ولتاژ صفر). همان طور که پیش تر اشاره شد، این پایه در کاربردهای ساده که تنها یک مستر و یک اسلیو وجود دارد اغلب استفاده نمی شود(مگر این که در کاربردهای پیشرفته نیاز به همزمان سازی ارتباط بین مستر و اسلیو وجود داشته باشد)

و در طرف مستر توسط یک مقاومت بالاکش به تغذیه و در سمت اسلیو مستقیما به زمین وصل می شود.

مطلب پیشنهادی:  آموزش پروتکل ارتباطی CAN در آردوینو – نحوه‌ی ارتباط ماژول MCP2515 CAN BUS با بورد آردوینو

 نکته : سرعت ارتباط SPI در مقایسه با پروتکل I2C بیشتر است. در مورد این پروتکل در مطالب آینده توضیح می دهیم.

مفهوم مستر و اسلیو :

در ارتباط SPI از دو واژه مستر (master) و اسلیو (slave) به کرات نام برده می شود. اگر با درس مدارات منطقی و فلیپ فلاپ ها آشنایی داشته باشید، شاید این دو واژه برایتان آشنا باشد. در اینجا این دو واژه شباهت زیادی به فلیپ فلاپ های مستر و اسلیو دارد.

در هر ارتباط SPI در هر طرف ارتباط، باید حداقل یک میکروکنترلر مستر وجود داشته باشد. یکی از مهم ترین وظایف میکروکنترلر مستر، تولید پالس ساعت برای ایجاد امکان تبادل داده بر روی پایه SCK است.

راه اندازی SPI در آردوینو

مد های عملکرد SPI :

در ارتباط SPI چهار نوع مد عملکرد وجود دارد که به ترتیب به نام های Mode 0 (به صورت پیشفرض) تا Mode 4 نام گذاری می شوند. جزئیات عملکرد این مدها مربوط به نوع سطح سیگنال در وضعیت بی کاری (Idle) و و ضعیت ارسال و دریافت داده و همچنین لبه ی مورد استفاده (لبه بالا رونده و لبه پایین رونده) برای شروع ارتباط می باشد.

توابع SPI در آردوینو :

نکته: قبل از استفاده از این توابع، باید فایل هدر SPI.h را به برنامه اضافه کنید. در مورد نحوه استفاده از این توابع در ادامه توضیح می دهیم.

  • begin() : از این تابع باید در شروع برنامه برای ایجاد ارتباط استفاده کنیم.
  • setClockDivider(x) : توسط این تابع می توانیم فرکانس کلاک ارتباط را نسبت به کلاک میکروکنترلر تعیین کنیم. عدد x مقداری است که فرکانس میکروکنترلر بر آن تقسیم می شود. به عنوان مثال اگر فرکانس برد 20MHz باشد، با نوشتن عبارت :
مطلب پیشنهادی:  انواع داده در آردوینو

SPI.setClockDivider(4)

فرکانس 20MHz  بر عدد 4 تقسیم شده و بر روی 5MHz تنظیم می شود.

اعداد مجاز برای استفاده عبارت اند از :

2,4,8,16,32,64,128

  • transfer(val): توسط این تابع، می توانیم به طور همزمان یک بایت (val) را ارسال کرده و یک بایت را از طرف مقابل دریافت کنیم.
  • beginTransaction(x,y,z) : پارامتر x در این تابع تعیین کننده حداکثر فرکانس کلاک، پارامتر y تعیین کننده ترتیب ارسال بیت ها (اول بیت پرارزش تر (MSB) یا اول بیت کم ارزش تر (LSB)) و پارامتر z تعیین کننده مد عملکرد SPI است که در مورد آن توضیح داده شد.

پیاده سازی عملی :

سخت افزار :

برای پیاده سازی عملی ارتباط SPI ، از دو برد Arduino UNO استفاده کرده و مطابق شکل به یکدیگر متصل می کنیم.

راه اندازی SPI در آردوینو

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

نکته : زمین دو برد مشترک است و باید به یکدیگر متصل شوند.

نرم افزار :

همان طور که توضیح داده شد، در هر ارتباط باید حداقل یک مستر وجود داشته باشد. در این پروژه قصد داریم یک برد را به عنوان مستر و یک برد را به عنوان اسلیو تعریف کنیم. (انتخاب مستر و یا اسلیو بودن تفاوتی ندارد)

کدهای زیر را بر روی برد مستر پروگرام کنید :

#include <SPI.h>
void setup (void) {
   Serial.begin(115200); 
   digitalWrite(SS, HIGH);
   SPI.begin ();
   SPI.setClockDivider(SPI_CLOCK_DIV8);
}

void loop (void) {
   char c;
   digitalWrite(SS, LOW);
   for (const char * p = "Melec.ir\r" ; c = *p; p++) {
      SPI.transfer (c);
      Serial.print(c);
   }
   digitalWrite(SS, HIGH);
   delay(2000);
}

کدهای زیر را بر روی برد اسلیو پروگرام کنید :

#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;
void setup (void) {
   Serial.begin (115200);
   pinMode(MISO, OUTPUT); 
   SPCR |= _BV(SPE); 
   indx = 0; // buffer empty
   process = false;
   SPI.attachInterrupt();
}
ISR (SPI_STC_vect)  { 
   byte c = SPDR;
   if (indx < sizeof buff) {
      buff [indx++] = c; 
      if (c == '\r') 
      process = true;
   }
}
void loop (void) {
   if (process) {
      process = false;
      Serial.println (buff); 
      indx= 0;
   }
}

در این برنامه از امکانات مختلفی مانند ارتباط USART (اینجا در مورد آن بخوانید) و وقفه ارتباط SPI استفاده شده است.

مطلب پیشنهادی:  مدولاسیون عرض پالس یا PWM در آردوینو

در برنامه سمت مستر، پس از تنظیمات اولیه SPI و ارتباط سریال، عبارت Melec.ir به سمت میکروکنترلر اسلیو ارسال شده و به صورت همزمان بر روی خروجی سریال چاپ می شود و میتوانید آن را مشاهده کنید.

در برنامه سمت اسلیو، پس از تنظیم مشخصات ارتباط SPI و سریال، توسط وقفه SPI داده دریافت شده (عبارت Melec.ir) را در متغیر buff ذخیره کرده و توسط ارتباط سریال آن را خروجی چاپ می کنیم.

امیدوارم این آموزش برایتان مفید بوده باشد.

منبع :tutorialspoint.com

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

3 دیدگاه

  1. digitalWrite(SS, HIGH);
    سلام slave select باید low شود

  2. سلام وخداقوت خدمت شما؛
    انشاالله ازخداهرچی خواسته دارید محقق بشه.تمام❤💯

  3. سلام وقتتون بخیر
    میشه لطفا یه کم بیشتر برنامه نویسی مستر و اسلیو رو توضیح بدین
    من مفهوم کدنویسی ها رو نمیفهمم