به نام خدا : با سلام؛ در این مطلب از سری مطالب آموزش پروژه محور lpc1768 میخوام پروژه راه اندازی spi میکروکنترلر lpc1768 رو قرار بدم.
یـــا حــــســـیـــن
پروژه راه اندازی spi میکروکنترلر lpc1768
توضیح مختصر پروژه : در این پروژه در یک حلقه for اعداد از طریق spi از میکرو master به میکرو slave ارسال می گردد و میکرو slave آن را در lcd نمایش می دهد؛ شما با توجه به نیاز خود می توانید کاربری برنامه را تغییر دهید؛ نکته مهم در استفاده از رابط spi توجه به پایه SS می باشد یعنی اینکه در چه زمانی آن را low و در چه زمانی High کنید که به راحتی در برنامه قابل فهم هستش؛ ضمن اینکه یک روش استفاده از spi این است که به تعداد slave ها تعداد پایه SS اختصاص داده و آن ها را low و یا High کنید.
ارتباط میکرو avr با lpc1768 از طریق spi : در همین فایل یک برنامه میکرو avr در حالت master نیز ارایه شده است که می توان آن را به عنوان میکرو master به یک میکرو ARM به عنوان slave متصل کنید که در واقع یک ارتباط هم بین میکرو avr و ARM هم برقرار کرده باشید؛ طبق شماتیک درمیکرو mega16 پایه 5 به عنوان SS، پایه 6 به عنوان MOSI، پایه 7 به عنوان MISO و پایه 8 به عنوان sck قرار دارند؛ در برنامه avr به configure برنامه توجه کنید.
عکسی از پروژه در عمل :
شماتیک پروژه lpc1768 : کلیک کنید رو عکس و در اندازه اصلی ببینیدش…
کد پروژه ( lpc1768 در نقش master ) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/* MASTER connect p0.15(master) to p0.15(slave) >>sck connect p0.2 (master) to p0.16(slave) >>Slave Select connect p0.17(master) to p0.17(slave) >>MISO connect p0.18(master) to p0.18(slave) >>MOSI */ #include <lpc17xx.h> #include <stdio.h> #include "lib\gpio.h" #include "lib\delay.h" #include "lib\LiquidCrystal.h" #define OUT LPC_GPIO0->FIODIR=(1<<2) //for SS #define SET LPC_GPIO0->FIOSET=(1<<2) //for SS #define CLR LPC_GPIO0->FIOCLR=(1<<2) //for SS unsigned char spi(unsigned char data) { CLR;//SS LPC_SPI->SPDR = data; while (((LPC_SPI->SPSR) & (1<<7))==0);//dade kamel rikht toye SPDR return LPC_SPI->SPDR; SET;//SS } void spi_init(void) { LPC_SC->PCLKSEL0|=0x00030000;//(288(pll)/4=72MHz)(72MHz(Cpu clk)/8)=CLK SPI=9mhZ 9MHz/30(1e)=300 000=Clock(master) LPC_SPI->SPCCR=0x1e; // LPC_SPI->SPCR=0x20; // 0010 0000 LPC_PINCON->PINSEL0|=0xC0000000;//pin p0.15=sck LPC_PINCON->PINSEL1|=0x0000003F;//pin p0.16,p0.17,p0.18==SS,miso,mosi OUT;//SS SET;//SS } void start(void) { init3( P2_0/*rs*/, P2_1/*rw*/, P2_2/*enable*/, P2_3/*d4*/, P2_4/*d5*/, P2_5/*d6*/, P2_6/*d7*/ ); begin(16, 2, LCD_5x8DOTS); print("Master"); } int main() { int i, v = 10; SystemInit(); start(); spi_init(); while(1) { if(v>=0) { spi(v); v--; delayMs_Timer0( 500 ); } else { v=10; } } } |
کد پروژه ( lpc1768 در نقش slave ) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/* SLAVE connect p0.15(master) to p0.15(slave) >>sck connect p0.2 (master) to p0.16(slave) >>Slave Select connect p0.17(master) to p0.17(slave) >>MISO connect p0.18(master) to p0.18(slave) >>MOSI */ #include <lpc17xx.h> #include "lib\gpio.h" #include "lib\delay.h" #include "lib\LiquidCrystal.h" unsigned char spi(unsigned char data) { data=LPC_SPI->SPDR; while((LPC_SPI->SPSR&0x80)==0); return LPC_SPI->SPDR; } void spi_init(void) { LPC_SPI->SPCR =0x00; //LPC_PINCON->PINSEL0|=0x80000000;//(1<<31) wrong //LPC_PINCON->PINSEL1|=0x0000002A;//(1<<5)|(1<<3)|(1<<1) wrong LPC_PINCON->PINSEL0|=0xC0000000; LPC_PINCON->PINSEL1|=0x0000003F; } void LCD1(void) { init3( P0_0/*rs*/, P0_1/*rw*/, P0_2/*enable*/, P0_3/*d4*/, P0_4/*d5*/, P0_5/*d6*/, P0_6/*d7*/ ); begin(16, 2, LCD_5x8DOTS); } int main() { int a; int b; LCD1(); spi_init(); while(1) { b=spi(a); setCursor(6,0); printNumber( b, 10 ); setCursor(0,0); print("data:"); setCursor(2,1); print("(: Slave :)"); delayMs_Timer0( 500 ); clear(); print("data:"); setCursor(2,1); print("(: Slave :)"); } } |
کد پروژه ( avr در نقش master ) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <mega16.h> #include <delay.h> #include <stdlib.h> #include <spi.h> void main(void) { int send_data; PORTB=0X00; DDRB=0XB0; PORTD=0Xff; DDRD=0X00; SPCR=0X53; SPSR=0X00; while (1) { send_data=PIND; //Reading port D spi(send_data); delay_ms(250); }; } |
فیلم پروژه 1 :
فیلم پروژه 2 :
مهمان
مدارتون رو با دو تا lpc1768 تست کردم و نتیجه داد.ممنون از اشتراک گذاری تون.
مهمان
سلام آقای دمرچیلو
ضمن تشکر فراوان بابت مطالب عالیتون
خواستم بپرسم چطوری میشه فرکانس ارتباطی ماژول + NRF24L01 را مشخص کرد؟ مثلا چنتا از این ماژول ها برای کارهای مختلف داریم و می خواهیم تداخل فرکانسی پیدا نکنن.ممنون می شوم راهنمایی بفرمایین
مدیر سایت
سلام – قبلا فک کنم جوابتونو دادم – باید به کتابخونه ای که دارید ازش استفاده میکنید مراجعه کنید – احتمالا تابعی برای این کار داره.
مهمان
سلام و تشکر بابت برنامه
میشه بگید کلاک میکرو avr و arm روی چه مقدار تنظیم کرد؟ اصلا میشه دو تا میکرو که کلاکشون متفاوت برا این برنامه استفاده کرد؟
مهمان
سلام ببخشید دیر جواب دادم.

در مورد سوال اول تابع ( spi_init(voidرو بررسی کنید کامل گفته شده.
سوال دوم:مشخصا نمیشه.این برنامه ضمن کارایی و قابلیت بسطی که داره جهت آموزش هستش.خودتون میتونید کلی بالا پایینش کنید.
مهمان
با تشکر از مطلب خوبتون. کد رو با Keil نوشتید؟
مدیر سایت
فک کنم نوسندش با کیل نوشته.چون شکل رجیستراش شبیه کیل هستش
مهمان
سلام ممنون از آموزشات من یک کتابخونه نوشتم براش که lpc1768 مستر و AVR اسلیو دیتا از اسلیو منتقل میشه ولی متسفانه عددی نمایش داده نمیشه ینی بافر خالی ارسال میشه
void spi_init(unsigned char DATA_Length ,
unsigned char MS/*0 –> Slave , 1–> Master*/ ,
uint32_t SCK_freq/*2n >= 8*/ ,
unsigned char SPI_Interrupt/*0–>disable 1–>enable*/,
unsigned char LSB_first /*0–>MSB , 1–>LSB*/ )
{
LPC_SC->PCONP |= (1 <SPCCR = SCK_freq;
LPC_SPI->SPCR |=(MS << _MSTR) |(0<<_BitEnable) |(0<<_CPHA) |(0<<_CPOL) |(LSB_first << _LSBF) |(SPI_Interrupt << _SPIE) | (DATA_Length <PINSEL0|=0xC0000000;//pin p0.15=sck
LPC_PINCON->PINSEL1|=0x0000003F;//pin p0.16,p0.17,p0.18==SS,miso,mosi
}
unsigned char spi(unsigned char data)
{
char read;
LPC_SPI->SPDR = data;
while((LPC_SPI->SPCR & (1<SPSR &((1 << _MODF) |(1 << _ROVR) | (1 <SPDR;
else read =0;
return read;
}
مهمان
شما کلا همه چی کار کردید!
هرسوالی سرچ میکنم یه جواب اینجا داره
البته خیلی هم مفید
مچکر
مهمان
سلام دوستان خوبم
سعی کنید از رابط spi
برای راه اندازی سون سگمنت استفاده کنید و ای سی ۷۴۵۹۵
بسیار سود خواهید کرد
مهمان
خسته نباشی رفیق ولی در این برنامه هیچکدام از اسلیوها انتخاب (select) نمیشن
برای انتقال دیتا در یک سیستم مولتی اسلیو مثل این اول باید اسلیو مورد نظر انتخاب بشه بعد انتقال صورت بگیره …
مهمان
سلام
این پروژه تک slaveهستش ضمن اینکه در خط زیر نحوه روش کار مشخصه…
“ضمن اینکه یک روش استفاده از spi این است که به تعداد slave ها تعداد پایه SS اختصاص داده و آن ها را low و یا High کنید.”
مهمان
سلام با عرض خسته نباشید، می خواستم بدونم شما درباره راه اندازی کنترل کننده pid با زبان سی اطلاعاتی دارید؟
مدیر سایت
سلام – نه متاسفانه