آموزش 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:
سیستم دارای دو بخش Master وSlave است. در بخش Master سیستم دارای یک شیفت رجیستر 8 بیتی و مولد پالس است و بخش slave فقط شامل یک شیفت رجیستر هشت بیتی است.
کلاک این دو رجیستر از واحد تولید کلاک در وسیله ی Master تامین می شود. با اعمال هر پالس کلاک به طور هم زمان یک بیت از شیفت رجیستر Master خارج شده و وارد شیفت رجیستر Slave می شود. و یک بیت نیز از شیفت رجیستر Slave وارد شیفت رجیستر Master خواهد شد. پایه ی SS فعال ساز شیف رجیستر Slave است و تا زمانی که بوسیله ی Master ضفر نشود بیتی را منتقل نخواهد شد.
در صورتی که محتوای این رجیستر ها 8 بیت شیفت پیدا کند محتویات رجیستر داده ی Master و Slave با یکدیگر تعویض می شود. به صورت چرخشی محتوای master با slave عوض می شود . یعنی محتویات slave به master منتقل شده و در مقابل محتوای master نیز با slave تعویض خواهد شد.
آشنایی با رجیستر های SPI:
رجیستر 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 تعیین می کند طبق جدول پایین
رجیستر 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 :
رجیستر داده SPI یک رجیستر R/W است. که برای انتقال داده بین فایل رجیستر و شیفت رجیستر به کار میرود با نوشتن بر روی این رجیستر داده ارسال می شود و خواندن این رجیستر هم باعث خواندن بافر مربوط به دریافت شیفت رجیستر می شود.
تعیین جهت پایه های SPI در حالت Master و Slave:
ارتباط سریال دارای 4 پایه ی MOSI , MISO , SCK و SS است در حالت Master باید پایه ی MOSI ورودی باشد و بقیه ی پیاه ها خروجی شوند. و در حالت Slave باید پایه ی MISO خروجی و سایر پایه ها ورودی باشند. تنظیم تمام پایه ها به طور خودکار توسط واحد SPI انجام نمی شود و تنها جهت پایه هایی که باید خروجی باشند را به طور خودکار تنظیم می کند.
تنظیم این پایه ها در میکروکنترلر 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 هم عمل فرستادن دیتا و هم عمل دریافت دیتا را انجام می دهد. اگر مشکلی در مورد برنامه داشتید در قسمت نظرات بنویسید تا بیشتر توضیح دهم.
با عرض سلام وخسته نباشید. لطفا نحوه متصتل شدن ماژول +nrf 24L01 توسط پورت spi به میکرو را هم شرح دهید.
سلام
در پست راه اندازی ماژول nrf 24L01 با پورت SPI برنامه نوشته شده
سلام و خسته نباشید.
دوست عزیز من در یکی از برنامه هایی که در مورد SPI نوشته شده بود دیدم برای ارسال و دریافت اطلاعات از دستوراتی مثل :
SPDR=PIND;
PORTC=SPDR;
استفاده کرده بود.
تفاوت این کد با کد شما چیه و معادل اون در برنامه شما کدوم خط میشه؟
این خط هم اگر امکانش هست در موردش بفرمایید چیه و این دستور SPI را در کجا تعریف کردید که اینجا ازش استفاده کردید؟
data_get=spi(data_send);
من به طور مستقیم با رجیستر های SPI کار نکردم و با کتابخانه ی SPi که در خود کدویژن هست کار کردم. SPDR دیتا رجیستر SPI هست که در بالا توضیح دادم که هرچیزی در اون نوشته شده باشه رو می فرسته
توابعی که کتابخانه SPI.h در اختیار فرار داده تابع های data_get و data_send هست که عمل فرستادن و گرفتن دیتا رو از طریق SPI فراهم می کنه
سلام من میخوام پروتکل spi رو با اینتراپت راه اندازی کنم تو کد ویژن میشه ؟
سلام علی اقا د رمورد ارتباط ماژل rc522مایفر به میکرو اطلاعات یا برنامه امادشو میخاستم.ممنون کمک کنید
مطلب آماده داشتم منتشر کردنش مونده بود این هم برای شما http://electrolab.ir/راه-اندازی-ماژول-rfid-rc522-با-آردوینو/ وقت کردم برای AVR هم مینویسم به زودی
سلام راه اندازی ماژول rc522 با پروتکل spi رو با avr کی قرار میدید؟
اصلا شما نگفتید این برنامه که نوشتید قرار هست چه کاری بکنه. الان من نفهمیدم که میکرو اولی عدد 110 رو میفرسته برا دومی و دومی 111 رو می فرسته برا اولی یا نه
میکرو اولی عدد 110 رو میفرسته برا دومی و دومی 111 رو می فرسته برا اولی دقیقا کاری که گفتید رو میکنه
سلام من یدونه lcd tft دارم که ارتباطش spi هست چطور میشه راه اندازیش کنم؟
سلام ممنون از مطالبتون.
من وقتی که دیتا رو از مستر به اسلیو میفرستم، اسلیو اشتباه دریافت میکنه، از بابت درست نمایش دادن تابع هم مطمعنم.
ممنون میشم راهنمایی کنید.
سلام. ممنون بابت آزموش خوبتون. فقط یه سوال کوچک. اگر ما فقط بخوایم یه دیتای nبیتی رو به صورت 8بیت 8بیت از master به slave منتقل کنیم یا ازش بگیریم باید چیکار کرد؟ به عبارتی اگر نخوایم محتوای master و slave با هم جابجا بشن و در واقع نخوایم دیتای خاصی رو از slave دریافت کنیم، فقط بخوایم یه دیتایی رو بهش بفرستیم باید چیکار کرد؟ چون توی توضیحات شما گفته شد که محتوای این دو دیوایس با هم جابجا میشن. ممنون میشم اگر پاسخ بدید
عالی دستت درد نکنه
سلام ببخشید اگر بخوام یک رشته را با پروتکل spi بفرستیم به چه صورته؟
ممنون میشم راهنمایی کنید
سلام . ببخشید اگه من بخوام دکمه ای برای هر میکروکنترلر بزارم که با هر بار زدن دکمه، یک عدد به اعداد نمایش داده شده در lcd اضافه شود باید چه کنم؟
خوب این یه پروژه نمونه است باید برنامه رو متناسب با نیازتون ویرایش کنید