اطلاعیه

Collapse
No announcement yet.

تنظیمات SPI

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    تنظیمات SPI

    دوستان و اساتید محترم سلام

    من تو بخش ARM هر چقدر دنبال یه تاپیک درست و حسابی برای تنظیمات SPI در سری LPC گشتم پیدا نکردم . گفتم تو این تاپیک دوستان لطف کنن نظرات و تجربیاتشونو در راه اندازی واحد SPI بیان کنن که کمکی به من و بقیه دوستانی که قصد استفاده از این رابط رو دارن شده باشه


    #2
    پاسخ : تنظیمات SPI

    یه سری سوال داشتم که ترجیح میدم اونا رو به ترتیب اولویت تو برنامه نویسی در بین مطالب مطرح کنم...
    البته لطفا اگه جایی هم اشتباه گفتم تصحیح کنین. :icon_razz: :icon_razz:

    طبق USER MANUAL مربوط به سری LPC23XX در تنظیمات اولیه این واحد ابتدا باید در رجیستر PCONP مقدار بیت PCSPI رو برابر یک قرار بدیم
    :agree:

    کد:
    PCONP |= (1 << 8);
    دو مورد دیگه رو هم در قسمت Basic configuration شماره 2 و3 گفته که من متوجه نشدم دقیقا چی میگه

    سوال ؟؟؟.......شماره 2 گفته : در رجیستر PCLK_SEL0 بیت های 16 و 17 که مربوط به PCLK_SPI هست را انتخاب کنید . حالا من نمیدونم باید از بین چهار حالت موجود چه مقداری رو برای این دو تا بیت در نظر بگیرم ؟؟

    شماره 3 گفته : از طریق رجیستر های PINSEL0 تا PINSEL4 و همچنین PINMODE0 تا PINMODE4 پین های SPI و حالت هاشون (Mode) رو انتخاب کنین
    که من از قسمت مربوط به PINSEL متوجه شدم که باید جهار پین مربوط به ارتباط SPI که MOSI و MISO و SSEL و SCK هست رو انتخاب کرد که چون من با LPC2368 کار میکنم این پین ها به ترتیب روی پایه های P0.18 و P0.17 و P0.16 و P0.15 قرار دارن. :smile: :smile:
    با بیت های 30 و 31 موجود در رجیستر PINSEL0 نوع کارکرد پایه P0.15 مشخص میشود که با مقدار 00 در حالت GPIO و با مقدار 11 در حالت SCK قرار میگیرد و بیتهای 0 تا 5 رجیستر PINSEL1 مربوط به نوع کارکرد پایه های P0.16 و P0.17 و P0.18 میباشد و با مقدار 11 برای هر دو بیت آن پایه در حالت پین های SPI و با مقدار 00 در حالت GPIO قرار میگیرد

    یه سوال دیگه ؟؟؟... حالا اگه پایه P0.16 در حالت SSEL تنظیم کنیم بازم میشه مقدار خروجی اون رو تغییر داد؟

    یعنی بهتر بگم چه موقع در حالت GPIO تنظیم بشه و چه موقع در حالت SSEL ؟؟

    اینم تنظیماتش تو برنامه نویسی بگید درسته یا نه ؟
    کد:
      PINSEL0 |= 0xC0000000;  
    	PINSEL1 |= 0x0000003C;
    یه سوال دیگه ؟؟؟...رجیستر های PINMODE هم مربوط میشه به انتخاب مقاوت Pull-Up یا Pull-Down که نمیدونم وقتی داریم در حال SPI کار میکنیم باید این مقاومت ها فعال باشه یا نه ؟

    فعلا :job: :job:

    دیدگاه


      #3
      پاسخ : تنظیمات SPI

      ایها الاساتید کجایید ؟
      چرا جواب نمیدید ؟ :sad: :sad: :sad:

      دیدگاه


        #4
        پاسخ : تنظیمات SPI

        بریم ادامه مطلبو دنبال کنیم دوستان هم هر موقع اومدند یه نگاه به پست های قبلی بندازن جواب ما رو بدن ... ثواب داره
        :agree: :agree:

        چهارمین موردی هم که تو قسمت Basic configuration ذکر شده مربوط به رجیستر S0SPINT و VICIntEnable هست که رجیستر VICIntEnable جهت فعال کردن وقفه در واحدهای مختلف هست که بیت شماره 10 اون بزای وقفه واحد SPI هست و بیت اول رجیستر S0SPINT شامل پرچم وقفه میباشد که با رخ دادن وقفه SPIF یا WCOL یک میشود و با نوشتن یک در آن ریست میشه

        سوال ؟؟.. اگه وقفه توسط رجیستر VICIntEnable فعال باشه آیا پرچم وقفه در رجیستر S0SPINT به صورت خودکار ریست میشه ؟؟ :question: :question:

        دیدگاه


          #5
          پاسخ : تنظیمات SPI

          مراحل تنظیم آیسی جهت کار در مد MASTER مطابق User Manual سری LPC23xx:

          1- تنظیمات مربوط به کلاک توسط رجیستر S0SPCCR

          2- تنظیمات مربوط به کنترل واحد SPI توسط رجیستر S0SPCR

          3- نوشتن داده هایی که میخاین ارسال بشه روی رجیستر S0SPDR ، پس از نوشتن داده روی این رجیستر ارسال شروع میشود

          4-انتظار جهت یک شدن بیت SPIF که در رجیستر S0SPSR قرار داره . این بیت پس از آخرین سیکل ارسال داده یک میشه (که نشون میده انتقال انجام شده)

          5- خواندن رجیستر وضعیت S0SPSR ( خوندن ای رجیستر باعث میشه که پرچم SPIF ریست بشه و بتونید برای بار بعد هم ارسال شدن اطلاعات رو باهاش چک کنین ، ولی اگه نخونیدش ریست نمیشه و مقدارش یک میمونه و مرحله چهار رو نمیتونین انجام بدین)

          6-خوندن داده های دریافت شده توسط رجیستر S0SPDR (انجام دادن این مرحله اختیاریه و اگه اطلاعات دریافت شده مهمه واستون باید انجامش بدین)

          7- در صورتی که میخاین بعدش اطلاعات دیگه ای رو ارسال کنین دوباره از مرحله 3 شروع کنین

          :job: :job: :bye :bye

          دیدگاه


            #6
            پاسخ : تنظیمات SPI

            این برنامه دیتا رو از SPI میخونه و روی LCD نمایش میده. ولی متاسفانه صفر برمیگردونه و چیزی نمیخونه. کسی میتونه راهنمایی کنه؟

            کد:
            #include <lpc17xx.h>
            #include <stdio.h>
            
            #define LCD_LPC1768    
            #define LCD_PORT_1
            #define LCD_RS   14
            #define LCD_RW   10
            #define LCD_E   9
            #define LCD_DB4  8
            #define LCD_DB5  4
            #define LCD_DB6  1
            #define LCD_DB7  0
            
            #include "lcd.h"
            
            int a;
            char buf[16];
            /*
            void SPI_IRQHandler()
            {
            	LPC_SPI->SPINT |= 0x1;
            	a=LPC_SPI->SPDR=0xff;
            	sprintf(buf,"SPI = %d",a);
            	lcd_gotoxy(2,1);
            	lcd_putsf(buf);
            }
            */
            void delay(){
            	int i;
            	for(i=0;i<8000000;i++);
            }
            
            int main (void) {
            	unsigned char i;
            	
            
            	SystemInit();
            
            	LPC_SC->PCONP |= (1 << 8);
            	LPC_PINCON->PINSEL0 |= (2UL << 4);
            	LPC_PINCON->PINSEL0 |= (3UL << 30); //P0.15 as SCK
            	LPC_PINCON->PINSEL1 |= (3UL << 0);  //P0.16 as SSEL
            	LPC_PINCON->PINSEL1 |= (3 << 2);   //P0.17 as MISO
            	LPC_PINCON->PINSEL1 |= (3 << 4);   //P0.18 as MOSI
            	LPC_SPI->SPCCR=25; 				 	 //select frequency freq = 1MHz 
            	LPC_SPI->SPCR=0x800; 				 //device select as (master) slave
            	LPC_SC->PCONP |= (1 << 12);
            	LPC_ADC->ADCR |= ((1 << 7) | 
            					 (4 << 8) |
            					 (1 << 21));
            	//NVIC_EnableIRQ(SPI_IRQn);
            	
            	lcd_init();
            	lcd_clear();
            	lcd_gotoxy(1,2);
            	lcd_putsf("SPI Example");
            	
            	while(1) {
            	/*
            		LPC_ADC->ADCR &= ~(7 << 24);
            		LPC_ADC->ADCR |= (1 << 24);
            		while(!(LPC_ADC->ADGDR & (1UL << 31)));
            		a = (LPC_ADC->ADGDR >> 8 & 0x0FF);
            		LPC_SPI->SPDR=(unsigned char)a;
            		while(!(LPC_SPI->SPSR & 0x80)); // wait for transfer to be completed
            		delay();
            		
            		LPC_SPI->SPDR=i;
            		while(!(LPC_SPI->SPSR & 0x80)); // wait for transfer to be completed
            		i++;
            		if (i>255) i=0;
            		delay();
            	*/
            	LPC_SPI->SPDR=0xFF;
            	a=LPC_SPI->SPDR;
            	sprintf(buf,"SPI = %d",a);
            	lcd_gotoxy(2,1);
            	lcd_putsf("        ");
            	lcd_gotoxy(2,1);
            	lcd_putsf(buf);
            	delay();
            	
            	}
            	
            	}

            دیدگاه


              #7
              پاسخ : تنظیمات SPI

              با سلام
              منظورتون از اینکه از spi میخونه چیه؟ مثلا از یه حافظه flash یا sd card ؟

              دیدگاه


                #8
                پاسخ : تنظیمات SPI

                نه. یه برنامه ساده که دیتا رو از طرف یه میکروی دیگه مثلا یه avr میفرسته و 1768 از طریق spi میگیره و رو lcd نمایش میده. نمیدونم چرا صفر برمیگردونه؟

                دیدگاه

                لطفا صبر کنید...
                X