اطلاعیه

Collapse
No announcement yet.

مقدار دهی به SPDR در LPC1768

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

    مقدار دهی به SPDR در LPC1768

    خب سلام
    من یه مشکل عجیب دارم!!!
    کد:
        while(1)
    		{
    
    
        LPC_SPI->SPDR =0xF0;
    		while (((LPC_SPI->SPSR) & (1<<7))==0);//dade kamel rikht toye SPDR		
    			dd=LPC_SPI->SPDR
    
    
    			DELAY_ms(100);
    			LPC_GPIO1->FIOSET |=(1<<22);
    			DELAY_ms(100);
    			LPC_GPIO1->FIOCLR |=(1<<22);
          DELAY_ms(100);			
    		}
    تو دستور مقدار دهی به SPDR بطور عجیبی فقط مقدار 0x00FF توش قرار میگیره و هیچ مقدار دیگه ای نمیشینه توش!!!
    قضیه چیه؟؟؟؟
    کسی میتونه راهنماییم کنه؟؟؟

    #2
    پاسخ : مقدار دهی به SPDR در LPC1768

    آقا ۲۴ ساعت رد شد و هیجکس جواب نداده
    حداقل بیایید بحث کنیم شاید به نتیجه برسیم
    آخه چطور ممکنه این رجیستر رو نشه مقدار دهی کرد

    دیدگاه


      #3
      پاسخ : مقدار دهی به SPDR در LPC1768

      Spi رو چند بیت ست کردی ؟

      این کدی که کذاشتی ارتباطی به دیباگ spi نداره ، باید کد بخش تنظیمات رو بگذاری

      دیدگاه


        #4
        پاسخ : مقدار دهی به SPDR در LPC1768

        سلام
        این کد Init Spi هستش:


        void SPI_Init(void)
        {
        uint8_t dummy_u8;
        /* Configure the Pinfunctions for SPI */
        LPC_PINCON->PINSEL0 |=(1<<14) | (1<<15);
        LPC_PINCON->PINSEL1 |= (1<<4) | (1<<5);
        LPC_PINCON->PINSEL1 |= (1<<2) | (1<<3);
        /* Configure the SSEL pin as GPIO */
        LPC_PINCON->PINSEL1 |= (0x01) | (1<<1);


        /* Configure SCK,MOSI,SSEl as Output and MISO as Input */
        LPC_GPIO0->FIODIR |=(1<<15);
        LPC_GPIO0->FIODIR |=(1<<18);
        LPC_GPIO0->FIODIR &=~(1<<17);
        LPC_GPIO0->FIODIR =(1<<16);
        LPC_GPIO0->FIOSET =(1<<16);


        SPI_DisableChipSelect(); // Disable the Slave Select


        LPC_SC->PCONP |= (1 << 8); // enable power to spi clock



        LPC_SPI->SPCCR = spi_GetPclk()/SCK_Freq; // Set Spi Clock SCK_Freq=1000000 it resaults masterClock become 8Mhz


        LPC_SPI->SPCR = ((0<<SBIT_CPHA) | (1<<SBIT_CPOL) | (1<<SBIT_MSTR));
        dummy_u8 = LPC_SPI->SPSR; /* Dummy read to clear the flags */
        dummy_u8 = LPC_SPI->SPDR; /* Dummy read to clear the flags */
        }

        این هم عکس از نتیجه دیباگ!!!
        [IMG][/IMG]

        چیزی که مهمه اینه که من مقدار 0xF0 را به SPDR دادم ولی تو هر شرایطی فقط 0x00FF داخل رجیستر میشینه!!!
        در ضمن این ربطی به دیباگ کردن نداره تو شرایط دانلود روی میکرو هم مقدار 0x00FF هستش که با lcd کرکتری چک کردم!!!
        حالا مسیله اینه که کجای کار رو اشتباه رفتم!!!
        هر چیزی که به نظرتون گمگ میرسه بگید تا کامل بگم تا به نتیجه برسیم!!!

        دیدگاه


          #5
          پاسخ : مقدار دهی به SPDR در LPC1768

          دوست عزیز اصلاح میکنم به نتیجه برسید ( ی و م آخر جمله اتون معلوم نیست مخاطبش کیه )

          طبق کد اینیتیالایز بالا شما کجا spi رو فعال کردین ؟
          SPCR.2 کجای کد شما ست شده ؟ ( توی دیباگ هم spi غیر فعاله )
          از همین رجیستر کنترلی کجا تعداد بیت پکت رو ست کردین ؟

          بغیر از بیتهای پلاریته ، فاز و مستر ... بقیه اش چی ؟

          توضیح : دیباگ یعنی عیب یابی ... ارتباطی به اینکه کد روی میکرو باشه یا نباشه نداره

          و احتمالا یه بخش قضیه رو اشتباه متوجه شدید
          مهم نیست شما در spdr چی مینویسید ... اونی که میخونید یک رجیستر دیگه است .
          دیتا رجیستر فوق دو تا بافره ، وقتی روش مینویسیم رجیستر tx رو مقدار دهی میکنیم ... به شکل سریال این شیفت رجیستر با هر کلاک یک بیتش ارسال میشه
          وقتی میخونیمش مقدار رجیستر RX رو بر میگردونه .
          spi یک پروتکل فول داپلکسه ( مگر اینکه توی تنظیمات تغییرش بدیم ) وقتی چیزی رو ارسال میکنید باندازه تعداد کلاکهای ارسالی رجیستر rx هم با وضعیت باس مقدار دهی میشه . اون dummy read آخر برای خوندن بافر rx هست که طبق فرایند فوق اتوماتیک با سطح منطقی miso پر میشه



          فلسفه این همه علامت تعجب چیه احتمالا در ادامه توضیح خواهید داد ...
          جدیدترین ویرایش توسط Amie.s.m; ۰۴:۰۲ ۱۴۰۱/۱۰/۰۹.

          دیدگاه


            #6
            پاسخ : مقدار دهی به SPDR در LPC1768

            نوشته اصلی توسط Amie.s.m نمایش پست ها
            دوست عزیز اصلاح میکنم به نتیجه برسید ( ی و م آخر جمله اتون معلوم نیست مخاطبش کیه )

            طبق کد اینیتیالایز بالا شما کجا spi رو فعال کردین ؟
            SPCR.2 کجای کد شما ست شده ؟ ( توی دیباگ هم spi غیر فعاله )
            از همین رجیستر کنترلی کجا تعداد بیت پکت رو ست کردین ؟

            بغیر از بیتهای پلاریته ، فاز و مستر ... بقیه اش چی ؟

            توضیح : دیباگ یعنی عیب یابی ... ارتباطی به اینکه کد روی میکرو باشه یا نباشه نداره

            و احتمالا یه بخش قضیه رو اشتباه متوجه شدید
            مهم نیست شما در spdr چی مینویسید ... اونی که میخونید یک رجیستر دیگه است .
            دیتا رجیستر فوق دو تا بافره ، وقتی روش مینویسیم رجیستر tx رو مقدار دهی میکنیم ... به شکل سریال این شیفت رجیستر با هر کلاک یک بیتش ارسال میشه
            وقتی میخونیمش مقدار رجیستر RX رو بر میگردونه .
            spi یک پروتکل فول داپلکسه ( مگر اینکه توی تنظیمات تغییرش بدیم ) وقتی چیزی رو ارسال میکنید باندازه تعداد کلاکهای ارسالی رجیستر rx هم با وضعیت باس مقدار دهی میشه . اون dummy read آخر برای خوندن بافر rx هست که طبق فرایند فوق اتوماتیک با سطح منطقی miso پر میشه



            فلسفه این همه علامت تعجب چیه احتمالا در ادامه توضیح خواهید داد ...
            با سلام مجدد
            این ی و م آخر منظورم این بود که با همیاری شما من مبتدی به نتیجه برسم که البته از همفکری و یاری شما ممنونم!!!
            مجموعه کد اینیت رو از گیت هاب گرفتم از این آدرس:


            تو قسمت فعالسازی spi داخل تنظیمات RTE_DEVICE.H هم spi رو تیک زدم و فعال کردم!
            والی در مورد مقدار دهی به SPCR2 چیزی نمیدونم
            اگر تو دیباگ غیر فعال هستش خواهشا راهنماییم کنید تا بتونم فعالش کنم
            ممنون از لطفتون!

            دیدگاه


              #7
              پاسخ : مقدار دهی به SPDR در LPC1768

              اوکی شرح رجیسترها

              Objective In this tutorial we are going to discuss the SPI ( Serial Peripheral Interface). After understating the basics of LPC1768 SPI module, We will discuss how to use the Explore Embedded libraries to communicate with any of the SPI devices. LPC1768...


              ظاهرا مطلب رو با دقت نخوندید ...

              در نتیجه شاید تست عملی بهتر توجیهتون کنه .

              پایه miso رو به گرند متصل کنید ، کد قبلیتون رو مجددا اجرا کنید بعد spdr رو بخونید .

              دیدگاه


                #8
                پاسخ : مقدار دهی به SPDR در LPC1768

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

                دیدگاه


                  #9
                  پاسخ : مقدار دهی به SPDR در LPC1768

                  بیت ۲ از رجیستر کنترلی SPCR ( قبلا توضیح و لینک داده شده بود)
                  از همین رجیستر بیت ۱۱ ( برای تنظیم پکت ۸ بیتی )
                  ست کردن این بیتها خیلی ارتباطی به موضوع مد نظر شما نداره ... اینکه شما انتظار داری روی بافر tx یه چیزی بنویسی و بافر rx رو بخونی همونی که توی tx نوشتی رو برگردونه ... که اینم قبلا توضیح داده شد ... شما نمیتونی بافر tx پورت سریال رو بخونی کما اینکه نمیتونی روی بافر rx چیزی بنویسی )

                  تستی که با miso متصل به گرند گفته شد رو انجام دادی ؟!

                  دیدگاه


                    #10
                    پاسخ : مقدار دهی به SPDR در LPC1768

                    آره
                    همین الان انجامش دادم!
                    مسئله اینه که به نظر میرسه اصلا spi فعال نیست!!!
                    چون دیتایی که تو SPDR تو دیباگ نمایش داده میشه اصلا با چیزی که قراره بفرسته همخونی نداره!

                    دلیل: ادغام دو پست برای جلوگیری از اسپم

                    من با یه mega128 طوری تنظیم کردم بصورت slave که دریافتی spi رو از این میکرو نشون بده.
                    من هیچ دریافتی ندارم!
                    اصلا میکرو slave پرچم نمیخوره که بخواد چیزی رو دریافت کنه!
                    اون پین SS رو هم چک کردم تو دیباگ بطور کامل خاموش و روشن میشه!
                    ظاهرا چیزی تو SPDR نیست که بخواد خونده بشه!!
                    این هم عکس چیزی که گقتید:[IMG][/IMG]

                    دیدگاه


                      #11
                      پاسخ : مقدار دهی به SPDR در LPC1768

                      اسکوپ یا لاجیک آنالایزر داری ؟
                      اگر داری sck رو مانیتور کن ببین موقع ارسال کلاک موجوده یا نه


                      ( مجددا ، نمیتونی بافر tx پورت سریال رو بخونی ... spdr وقتی خونده میشه بافر دریافت سریاله ، شما اصلا خوندن این رجیستر رو فعلا بیخیالش بشو بقیه ماجرا رو انجام بده )
                      جدیدترین ویرایش توسط Amie.s.m; ۰۸:۳۲ ۱۴۰۱/۱۰/۱۰.

                      دیدگاه


                        #12
                        پاسخ : مقدار دهی به SPDR در LPC1768

                        متاسفانه اسکوپ ندارم
                        الان یه سوال
                        من وقتی یه slave دارم که باید spdr ارسالی از طرف master رو بخونه دیگه
                        الان اصلا slave پرچم نمیخوره

                        دیدگاه


                          #13
                          پاسخ : مقدار دهی به SPDR در LPC1768

                          نوشته اصلی توسط offlineone23 نمایش پست ها
                          متاسفانه اسکوپ ندارم
                          الان یه سوال
                          من وقتی یه slave دارم که باید spdr ارسالی از طرف master رو بخونه دیگه
                          الان اصلا slave پرچم نمیخوره

                          یه تغییری توی کانفیگ spi بده مطابق این کد برو باید درست بشه
                          کد:
                          . 
                          [TABLE]
                          [TR]
                          [TD]void[/TD]
                          [TD]SystemInit( ) {[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_SC->PCONP |= 1 <<21;[/TD]
                          [TD]//enable POWER to SSP0 (redundant following reset)[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_SC->PCLKSEL1 |= 1<<10;[/TD]
                          [TD]//pclk = cclk[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_SSP0->CPSR |= 8;[/TD]
                          [TD]//internal divider[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_PINCON->PINSEL0 |= 0x80000000;[/TD]
                          [TD]//Pin P0.15 allocated to function 3 SCLK[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_PINCON->PINSEL1 |= 0x02<<0;[/TD]
                          [TD]//Pin P0.16 allocated to function 3 NSS/SSEL[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_PINCON->PINSEL1 |= 0x02<<2;[/TD]
                          [TD]//Pin P0.17 allocated to function 3 MISO[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_PINCON->PINSEL1 |= 0x02<<4;[/TD]
                          [TD]//Pin P0.18 allocated to function 3 MOSI[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_SSP0->CR0 |= 3<<6;[/TD]
                          [TD]//clock phase[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_SSP0->CR0 |= 7<<0;[/TD]
                          [TD]// 8 bits[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_SSP0->CR1 |= 1<<1;[/TD]
                          [TD]//enable SSP[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_GPIO0->FIODIR |= (1<<23);[/TD]
                          [TD]//make output[/TD]
                          [/TR]
                          [TR]
                          [TD]}[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD]char[/TD]
                          [TD]spi_tfr(char mo) {[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_GPIO0->FIOCLR = 1<<23;[/TD]
                          [TD]//select slave[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD][/TD]
                          [TD]LPC_SSP0->DR = mo;[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD][/TD]
                          [TD]while (!(LPC_SSP0->SR & (1<<2)));[/TD]
                          [/TR]
                          [TR]
                          [TD][/TD]
                          [TD]LPC_GPIO0->FIOSET = 1<<23;[/TD]
                          [TD]//release slave[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD][/TD]
                          [TD]return (LPC_SSP0->DR);[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD]}[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD]int[/TD]
                          [TD]main ( ) {[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD][/TD]
                          [TD]char mi;[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD][/TD]
                          [TD]while(1) {[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD][/TD]
                          [TD]mi = spi_tfr(0x5A);[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD][/TD]
                          [TD]}[/TD]
                          [/TR]
                          [TR="bgcolor: yellow"]
                          [TD]}[/TD]
                          [/TR]
                          [/TABLE]
                          جدیدترین ویرایش توسط Amie.s.m; ۲۰:۵۹ ۱۴۰۱/۱۰/۱۰.

                          دیدگاه

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