به آموزش آردوینو ( قسمت دهم – SPI ) خوش اومدید.
بازبینی اول : در تاریخ ۱۴۰۰/۰۵/۲۲ انجام شد!
پروتکل ارتباطی SPI
پروتکل SPI (Serial Peripheral Interface) یک رابط سریال است که برای ارتباط برقرار کردن بین میکروکنترلر (master) و تجهیزات و قطعات خارجی (slave) است .
پایه های مورد استفاده در ارتباط SPI :
SCK : پایه مربوط به کلاک که توسط میکروکنترلر مستر ایجاد می شود.
MOSI : پایه مربوط به خروج داده از مستر (فرمانبردار) و ورود داده به اسلیو(فرمانگیر)
MISO : پایه مربوط به خروج داده از اسلیو و ورود داده به مستر
SS : از این پایه برای انتخاب اسلیو توسط مستر استفاده می شود (توسط ایجاد ولتاژ صفر).
پیاده سازی عملی پروژه
برای این پروژه مدار خود را مانند شکل زیر ببندید.
- (SS) : pin 10
- (MOSI) : pin 11
- (MISO) : pin 12
- (SCK) : pin 13
شبیه سازی پروژه در نرم افزار پروتئوس
پایه های دو برد آردوینو را مانند شکل به یکدیگر متصل کنید.
کد های دستوری
کد سمت Master
ابتدا کتابخانه SPI را فراخوانی میکنیم . این کتابخانه از سایت گیت به صورت رایگان قابل دانلود است .
در تابع setup ابتدا واحد سریال را برقرار میکنیم سپس پایه SS را روی حالت HIGH میگذاریم.
پروتکل SPI را آغاز میکنیم و در آخر توسط تابع setClockDivider فرکانس کلاک ارتباط را نسبت به کلاک آردوینو تعیین کنیم.
#include <SPI.h>
void setup() {
Serial.begin(9600);
digitalWrite(SS,HIGH);
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV8);
}
در تابع loop ابتدا SS را روی حالت LOW قرار می دهیم تا تبادل اطلاعات را آغاز کند .با استفاده از حلقه for متن خود را به صورت کاراکتر به کاراکتر ارسال میکنیم و در پایان SS را روی حالت HIGH قرار می دهیم .
void loop() {
char x;
digitalWrite(SS,LOW);
for (const char * i = "Amokh\r";x = *i;i++)
{
SPI.transfer(x);
Serial.print(x);
}
digitalWrite(SS,HIGH);
delay(1000);
}
کد سمت Slave
ابتدا کتابخانه SPI را فراخوانی میکنیم . آرایه ایی برای نمایش خروجی مستر تعریف میکنیم.متغیری از جنس بولین برای تعیین وضعیت دریافت تعریف میکنیم.
در تابع setup ابتدا واحد سریال را برقرار میکنیم ، پین مود MISO را مشخص میکنیم و وقفه SPI را فراخوانی میکنیم.
#include <SPI.h>
char arry [30];
char i;
boolean process = false;
void setup() {
Serial.begin(9600);
pinMode(MISO,OUTPUT);
SPCR |= _BV(SPE);
SPI.attachInterrupt();
}
در تابع وقفه عملیات دریافت را پیاده سازی میکنیم.
نکته : \r نشان دهنده آخر کلمه است.
ISR (SPI_STC_vect)
{
char t = SPDR;
if (i < sizeof arry)
{
arry[i++]=t;
if (t == '\r')
{
process = true;
}
}
}
در تابع loop کلمه دریافتی از سمت مستر را چاپ می کنیم.
void loop() {
if (process == true)
{
process = false;
Serial.println(arry);
}
}
کد کامل master
#include <SPI.h>
void setup() {
Serial.begin(9600);
digitalWrite(SS,HIGH);
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV8);
}
void loop() {
char x;
digitalWrite(SS,LOW);
for (const char * i = "Amokh\r";x = *i;i++)
{
SPI.transfer(x);
Serial.print(x);
}
digitalWrite(SS,HIGH);
delay(1000);
}
کد کامل slave
#include <SPI.h>
char arry [30];
char i;
boolean process = false;
void setup() {
Serial.begin(9600);
pinMode(MISO,OUTPUT);
SPCR |= _BV(SPE);
SPI.attachInterrupt();
}
ISR (SPI_STC_vect)
{
char t = SPDR;
if (i < sizeof arry)
{
arry[i++]=t;
if (t == '\r')
{
process = true;
}
}
}
void loop() {
if (process == true)
{
process = false;
Serial.println(arry);
}
}
پایان آموزش آردوینو ( قسمت دهم – SPI )