آموزش میکروکنترلر AVRمیکروکنترلرهمه ی مطالب

آموزش SPI در میکروکنترلر AVR

ارتباط SPI در میکروکنترلر AVR:

در این قسمت از آموزش AVR درباره ی SPI در میکروکنترلر AVR توضیحاتی ارائه می شود بعد از این پست راه اندازی ماژول NRF به صورت کامل در پستی جداگانه شرح داده خواهد شد.

SPI چیست ؟

SPI یا serial peripheral interface یک ارتابط سریع سریال است. که بوسیله ی شرکت موتورلا طراحی شده است. SPI به صورت full-Duplex عمل کرده و امکان ارسال و دریافت همزمان را دارد. از واسط SPI برای انتقال اطلاعات با سرعت انتقال بالا و برای فواصل کوتاه استفاده می کنند.

در باس SPI ارتباط دو وسیله به صورت MASTER/SLAVE است. آغاز کننده ی ارتباط همیشه Master است و فقط Master است که می تواند شروع به انتقال کند و Slave باید منتظر دریافت اطلاعات بماند.

هر وسیله ی SPI دارای 4 پایه ی زیر است:

MISO: Master Input Slave Output

MOSI: Master Output Salve Input

SCK:   Serial Clock

SS: Slave Select

خصوصیات SPI در میکروکنترلر AVR به صورت زیر می باشد:

  • Full-Duplex ارسال اطلاعات به صورت سنکرون توسط 3 سیم
  • عملکرد در حالت های Master و Slave
  • ارسال بیت ابتدایی LSB یا MSB
  • هفت سرعت قابل برنامه ریزی
  • ایجاد و قفه در پایان ارسال
  • بیدار شدن از مد Idle
  • امکان دو برابر کردن سرعت ارسال

بلوک دیاگرام SPI:

spi diagram

 

سیستم دارای دو بخش Master وSlave است. در بخش Master سیستم دارای یک شیفت رجیستر 8 بیتی و مولد پالس است و بخش slave فقط شامل یک شیفت رجیستر هشت بیتی است.

کلاک این دو رجیستر از واحد تولید کلاک در وسیله ی Master تامین می شود. با اعمال هر پالس کلاک به طور هم زمان یک بیت از شیفت رجیستر Master خارج شده و وارد شیفت رجیستر Slave می شود. و یک بیت نیز از شیفت رجیستر Slave وارد شیفت رجیستر Master خواهد شد. پایه ی SS فعال ساز شیف رجیستر Slave است و تا زمانی که بوسیله ی Master ضفر نشود بیتی را منتقل نخواهد شد.

در صورتی که محتوای این رجیستر ها 8 بیت شیفت پیدا کند محتویات رجیستر داده ی Master و Slave با یکدیگر تعویض می شود. به صورت چرخشی محتوای master با slave عوض می شود . یعنی محتویات slave به master منتقل شده و در مقابل محتوای master نیز با slave تعویض خواهد شد.

آشنایی با رجیستر های SPI:

رجیستر SPCR:

spcr

SPI Control Register

بیت 7 – SPIE :

این بیت وقفه ی SPI را فعال می کند اگر بیت SPIF در رجیستر SPSR یک شود وقفه روی میدهد.

بیت 6 – SPE :

با یک شدن این بیت SPI فعال می شود.

بیت 5 – DORD:

با یک شدن این بیت ابتدا بیت LSB ارسال  می گردد و اگر صفر باشد اول بیت MSB ارسال می شود.

بیت 4 – MSTR :

اگر این بیت 1 شود SPI در حالت MASTER فعال می شود و اگر صفر یاد در حالت SLAVE تنظیم می شود.

بیت 3 – CPOL :

اگر این بیت 1 باشد در حالت بیکاری پایه ی SCK یک خواهد بود در غیر این صورت این پایه ضفر خواهد بود.

بیت 2 – CPHA :

این بیت مربوط به نحوه ی نمونه برداری از دیتا با توجه به لبه ی کلاک SCK می باشد.

بیت 0 و 1 – SPR0, SPR1:

این دو بیت فرکانشس کلاک پایه ی SCK را در حالت MASTER تعیین می کند طبق جدول پایین

SPI clok

رجیستر SPSR :

spsr

SPI Status Register

بیت 7 – SPIF:

زمانی که ارسال داده تکمیل می شود پرچم SPIF یک میگردد و در صورتی که بیت SPIE در SPCR یک و وقفه ی سراسری فعال باشد وقفه ایجاد می شود.

بیت 6 – WCOl :

اگر رد حین انتقال داده داده ی جدیدی در رجیستر داده ی SPI نوشته شود بیت WCOL  یک می شود. با خواندن رجیستر وضعیت SPI بیتهای WCOL و SPIF پاک می شوند و سپس دسترسی به رجیستر داده ی SPI صورت می گیرد.

بیت های 1 تا 5:

این بیت ها رزرو شده هستند و کاربرد خاصی ندارند.

بیت 0 – SPI2X :

زمانی که SPI در حالت master باشد با یک کردن این بیت سرعت SPI دو برابر خواهد شد.(فرکانس SCK دو برابر می شود.

رجیستر SPDR :

spdr

رجیستر داده SPI یک رجیستر R/W است. که برای انتقال داده بین فایل رجیستر و شیفت رجیستر به کار میرود با نوشتن بر روی این رجیستر داده ارسال می شود و خواندن این رجیستر هم باعث خواندن بافر مربوط به دریافت شیفت رجیستر می شود.

تعیین جهت پایه های SPI در حالت Master و Slave:

ارتباط سریال دارای 4 پایه ی MOSI , MISO , SCK و SS است در حالت Master  باید پایه ی MOSI ورودی باشد و بقیه ی پیاه ها خروجی شوند. و در حالت Slave باید پایه ی MISO خروجی و سایر پایه ها ورودی باشند. تنظیم تمام پایه ها به طور خودکار توسط واحد SPI انجام نمی شود و تنها جهت پایه هایی که باید خروجی باشند را به طور خودکار تنظیم می کند.

spi pin

تنظیم این پایه ها در میکروکنترلر ATmega32 به صورت زیر می باشد:

در حالت Master :

PORTB=0x00;
DDRB=0xB0;

و در حالت Slave:

PORTB=0x00;
DDRB=0x40;

برنامه نمونه برای میکروکنترلر در حالت Master:

#include <mega32.h>
#asm
   .equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#include <spi.h>
#include <stdlib.h>
unsigned char data_send;
unsigned char data_get;
unsigned char buffer[];

void io_int(void);

void main(void)
{
 io_int();
lcd_init(16);
PORTB.0=0;
data_send=110;
data_get=spi(data_send);
itoa(data_get,buffer);
lcd_puts(buffer);
}


void io_int(void){
  PORTB=0x00;
  DDRB=0xB1;
  SPCR=0B01110111;
  SPSR=0x00;
  }

برنامه نمونه برای میکروکنترلر در حالت Slave:

#include <mega32.h>
#asm
   .equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#include <spi.h>
#include <stdlib.h>
unsigned char data_send;
unsigned char data_get,buffer[];

void io_int(void);

void main(void)
{
 io_int();
 lcd_init(16);
 data_send=111;
 data_get=spi(data_send);
 itoa(data_get,buffer);
 lcd_puts(buffer);
}

void io_int(void){
  PORTB=0x00;
  DDRB=0x40;
  ACSR=0x80;
  SFIOR=0x00;
  SPCR=0B01100100;
  SPSR=0x00;
  }

در نوشتن این برنامه ها از کتابخانه spi.h استفاده شده تابع spi هم عمل فرستادن دیتا و هم عمل دریافت دیتا را انجام می دهد. اگر مشکلی در مورد برنامه داشتید در قسمت نظرات بنویسید تا بیشتر توضیح دهم.

مدار لازم برای تست برنامه :

SPI-الکترولب-آموزش
SPI-الکترولب-آموزش

 دانلود پروژه و فایل شبیه سازی پرتیوس:

دانلود

علی عزتی

علی عزتی هستم. رشته ی مهندسی برق الکترونیک رو خوندم. علاقه ی من به یادگیری و به اشتراک گذاشتن چیز هایی که یاد گرفتم. باعث شد تا الکترولب ایجاد بشه. علاقه ی زیادی به الکترونیک دارم. و دوست دارم چیزهای جدید یادبگیرم و بسازم ... :))

نوشته های مشابه

17 دیدگاه

  1. با عرض سلام وخسته نباشید. لطفا نحوه متصتل شدن ماژول +nrf 24L01 توسط پورت spi به میکرو را هم شرح دهید.

  2. سلام و خسته نباشید.
    دوست عزیز من در یکی از برنامه هایی که در مورد SPI نوشته شده بود دیدم برای ارسال و دریافت اطلاعات از دستوراتی مثل :
    SPDR=PIND;
    PORTC=SPDR;
    استفاده کرده بود.
    تفاوت این کد با کد شما چیه و معادل اون در برنامه شما کدوم خط میشه؟
    این خط هم اگر امکانش هست در موردش بفرمایید چیه و این دستور SPI را در کجا تعریف کردید که اینجا ازش استفاده کردید؟
    data_get=spi(data_send);

    1. من به طور مستقیم با رجیستر های SPI کار نکردم و با کتابخانه ی SPi که در خود کدویژن هست کار کردم. SPDR دیتا رجیستر SPI هست که در بالا توضیح دادم که هرچیزی در اون نوشته شده باشه رو می فرسته
      توابعی که کتابخانه SPI.h در اختیار فرار داده تابع های data_get و data_send هست که عمل فرستادن و گرفتن دیتا رو از طریق SPI فراهم می کنه

  3. سلام من میخوام پروتکل spi رو با اینتراپت راه اندازی کنم تو کد ویژن میشه ؟

  4. سلام علی اقا د رمورد ارتباط ماژل rc522مایفر به میکرو اطلاعات یا برنامه امادشو میخاستم.ممنون کمک کنید

  5. اصلا شما نگفتید این برنامه که نوشتید قرار هست چه کاری بکنه. الان من نفهمیدم که میکرو اولی عدد 110 رو میفرسته برا دومی و دومی 111 رو می فرسته برا اولی یا نه

    1. میکرو اولی عدد 110 رو میفرسته برا دومی و دومی 111 رو می فرسته برا اولی دقیقا کاری که گفتید رو میکنه

  6. سلام من یدونه lcd tft دارم که ارتباطش spi هست چطور میشه راه اندازیش کنم؟

  7. سلام ممنون از مطالبتون.
    من وقتی که دیتا رو از مستر به اسلیو میفرستم، اسلیو اشتباه دریافت میکنه، از بابت درست نمایش دادن تابع هم مطمعنم.
    ممنون میشم راهنمایی کنید.

  8. سلام. ممنون بابت آزموش خوبتون. فقط یه سوال کوچک. اگر ما فقط بخوایم یه دیتای nبیتی رو به صورت 8بیت 8بیت از master به slave منتقل کنیم یا ازش بگیریم باید چیکار کرد؟ به عبارتی اگر نخوایم محتوای master و slave با هم جابجا بشن و در واقع نخوایم دیتای خاصی رو از slave دریافت کنیم، فقط بخوایم یه دیتایی رو بهش بفرستیم باید چیکار کرد؟ چون توی توضیحات شما گفته شد که محتوای این دو دیوایس با هم جابجا میشن. ممنون میشم اگر پاسخ بدید

  9. سلام ببخشید اگر بخوام یک رشته را با پروتکل spi بفرستیم به چه صورته؟
    ممنون میشم راهنمایی کنید

  10. سلام . ببخشید اگه من بخوام دکمه ای برای هر میکروکنترلر بزارم که با هر بار زدن دکمه، یک عدد به اعداد نمایش داده شده در lcd اضافه شود باید چه کنم؟

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

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

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

همچنین ببینید
بستن