اطلاعیه

Collapse
No announcement yet.

مشکل باspi

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

    مشکل باspi

    سلام دوستان.چطور میشه از رجیسترSPDRاستفاده کنم؟مگه این دستور برای ارسال و دریافت اطلاعات نیست؟هرچی مثال دیدم با دستورspi()کار کردن
    میشه نحوهی استفاده از SPDRرو توضیح بدین؟

    #2
    پاسخ : مشکل باspi

    نوشته اصلی توسط morteza7090
    سلام دوستان.چطور میشه از رجیسترSPDRاستفاده کنم؟مگه این دستور برای ارسال و دریافت اطلاعات نیست؟هرچی مثال دیدم با دستورspi()کار کردن
    میشه نحوهی استفاده از SPDRرو توضیح بدین؟
    فقط کد زیر را نگاه کنید:

    کد:
    unsigned char spi(unsigned char data)
    {
      SPDR=data;
      while(!(SPSR & 0x80)); 
      return SPDR;
    }
    کاملا واضحه . اگه به جواب نرسیدید بگید.
    راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
    کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
    نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
    انشالله به زودي تاپيک ها به روز رساني خواهد شد،

    دیدگاه


      #3
      پاسخ : مشکل باspi

      نوشته اصلی توسط RubeuS
      فقط کد زیر را نگاه کنید:

      کد:
      unsigned char spi(unsigned char data)
      {
        SPDR=data;
        while(!(SPSR & 0x80)); 
        return SPDR;
      }
      تشکر بابات جوابتون.ما الان داریم dataرو میفرستیم و شرطمونم تا زمانیه که کامل ارسال بشه درسته؟
      unsigned char spi(unsigned char dataچیه؟

      کاملا واضحه . اگه به جواب نرسیدید بگید.

      دیدگاه


        #4
        پاسخ : مشکل باspi

        نوشته اصلی توسط morteza7090
        تشکر بابات جوابتون.ما الان داریم dataرو میفرستیم و شرطمونم تا زمانیه که کامل ارسال بشه درسته؟
        unsigned char spi(unsigned char dataچیه؟

        کاملا واضحه . اگه به جواب نرسیدید بگید.
        خوب اسم تابع + پارامتر هاش + مقدار بازگشتیه دیگه. بزارید کامل توضیح بدم:

        ببینید اول میگیم تابع spi تابعیه که unsigned char ( یک دیتا آبجکت 8 بیتی) به نام دیتا میگیره و یه unsigned char پس میده

        اول data رو داخل SPDR میفرسته که با اینکار عمل انتقال شروع میشه. بعد از اون روی فلگ SPIF عمل pulling رو انجام میدیم یعنی تا وقتی این فلگ بالا نرفته حلقه انجام میشه. با بالا رفتن فلگ یعنی عمل انتقال انجام شده پس از حلقه میایم بیرون و مقدار SPDR که الان مقدار گرفته شده از اون طرف انتقال است برمیگردونیم. ( spi یک پروتکل انتقال full duplex است یعنی همزمان با ارسال اطلاعات ، اطلاعاتی دریافت میکنیم)
        راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
        کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
        نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
        انشالله به زودي تاپيک ها به روز رساني خواهد شد،

        دیدگاه


          #5
          پاسخ : مشکل باspi

          الان ما داریم اطلاعات میگیریم.بخوایم بفرستیم چطورمیشه؟

          دیدگاه


            #6
            پاسخ : مشکل باspi

            نوشته اصلی توسط morteza7090
            الان ما داریم اطلاعات میگیریم.بخوایم بفرستیم چطورمیشه؟
            تو پست قبلی گفتم که : spi یک پروتکل full duplex است. یعنی همزمان هم میفرسته هم میگیره

            وقتی شما اول تابع مینویسید SPDR=data یعنی می خواید data را بفرستید. وقتی کامل فرستادید به دلیلی که گفتم( full duplex ) یه چی همزمان گرفتید . پس بعد از اتمام عمل انتقال اگر SPDR را بخونید ، همون مقدار دریافتیه هست(که همزمان با ارسال دریافت کردید)

            spi یکی از ساده ترین پروتکل های سریاله ، راحت با 4 تا پین به صورت نرم افزاری میشه بوجودش آورد .
            راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
            کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
            نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
            http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
            انشالله به زودي تاپيک ها به روز رساني خواهد شد،

            دیدگاه


              #7
              پاسخ : مشکل باspi

              نوشته اصلی توسط RubeuS
              تو پست قبلی گفتم که : spi یک پروتکل full duplex است. یعنی همزمان هم میفرسته هم میگیره

              وقتی شما اول تابع مینویسید SPDR=data یعنی می خواید data را بفرستید. وقتی کامل فرستادید به دلیلی که گفتم( full duplex ) یه چی همزمان گرفتید . پس بعد از اتمام عمل انتقال اگر SPDR را بخونید ، همون مقدار دریافتیه هست(که همزمان با ارسال دریافت کردید)

              spi یکی از ساده ترین پروتکل های سریاله ، راحت با 4 تا پین به صورت نرم افزاری میشه بوجودش آورد .
              اگر نخوایم همونو بخونیم. باید یه چی جدید واسش تعریف کنیم دیگه.درسته؟

              دیدگاه


                #8
                پاسخ : مشکل باspi

                نوشته اصلی توسط morteza7090
                اگر نخوایم همونو بخونیم. باید یه چی جدید واسش تعریف کنیم دیگه.درسته؟
                منظورتون رو درست نفهمیدیم: منظورتون از همون ،اطلاعات دریافتی است؟ خوب مثلا اگر مستر هستید و میخواید به اسلیوتون دستوری بدید که بعد از ارسال کامل دستور یک اطلاعاتی به شما برگردونه ، اگر منظورتون اینه : یه بار با spi میفرستید و مقدار دریافتی را استفاده نمیکنید(دور میریزید) و چون شما مستر هستید باید شما عمل انتقال را شروع کنید ، خوب ایندفعه یه چیز الکی جا دیتا میفرستید و حالا از مقدار دریافتی از جانب اسلیو استفاده می کنید.
                راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                دیدگاه


                  #9
                  پاسخ : مشکل باspi

                  نکته پایانیم بگم و با اجازتون مرخص شیم:
                  حتما قبل از اینکارا به درستی رجیستر SPCR را مقدار دهی کنید(با توجه به دیتاشیت)
                  و قبل از از شروع عمل انتقال توسط مستر خط ss~ را صفر کنید تا اسلیو مورد نظر با خبر گردد. و بعد از اتمام انتقال خط ss~ را دوباره یک کنید.
                  راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                  کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                  نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                  http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                  انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                  دیدگاه


                    #10
                    پاسخ : مشکل باspi

                    نوشته اصلی توسط RubeuS
                    منظورتون رو درست نفهمیدیم: منظورتون از همون ،اطلاعات دریافتی است؟ خوب مثلا اگر مستر هستید و میخواید به اسلیوتون دستوری بدید که بعد از ارسال کامل دستور یک اطلاعاتی به شما برگردونه ، اگر منظورتون اینه : یه بار با spi میفرستید و مقدار دریافتی را استفاده نمیکنید(دور میریزید) و چون شما مستر هستید باید شما عمل انتقال را شروع کنید ، خوب ایندفعه یه چیز الکی جا دیتا میفرستید و حالا از مقدار دریافتی از جانب اسلیو استفاده می کنید.
                    سلام
                    بعضی جاها میبینیم که بعد از ارسال یک دستور از طرف مستر ، همون مستر میره توی یه حلفه
                    کد:
                     while(spi(0x00)!="0x00")
                    این حلقه منتظر این میمونه که اسلو جواب رو بزاره توس باس spi دیگه ؟ درسته ؟
                    حالا ما یه time out هم واسش در نظر میگیریم...
                    امکانش هس ما یه pin رو از طرف اسلو به مستر ببریم و وقتی اسلو بخواد پاسخی بده اون پین یک بشه و یک وقفه ای رو راه بندازه بعد مستر spi(0x00) رو بفرسته تا پاسخ رو دریافت کنه؟ اینجوری اگه کار اسلو واسه جواب دادن به مستر هم طول بکشه time out نمیشه و سر فرصت پاسخش میاد.
                    :question:

                    دیدگاه


                      #11
                      پاسخ : مشکل باspi

                      من کمتر دیدم که تو ارتباط با دیوایس های مبتنی بر ارتباط سریال spi بعد از دادن دستور توسط مستر(در اینجا : میکرو) ، اسلیو( در اینجا : دیوایس خارجی) بلافاصله نتونه جواب را آماده کنه . ولی خوب اگر طول میکشه تا جواب دستورتون آماده بشه:
                      1- با این تابع که نوشتین شدنیه ولی باید اون دیوایس را خودتون ساخته باشید یا این که شرایط خاصی داشته باشه ( که در ادامه عرض میکنم)
                      2- اصلا مناسب نیست.

                      اون شرایط که گفتم : اسلیو باید در حالت عادی مقدار روی پین MISO رو 1 منطقی بده ، وقتی که دستوری از سمت مستر اومد هنوز خط MISO رو بالا نگه داره و به محض اینکه جواب حاضر شد مقدار روی خط را صفر کنه. حالا باید منتظر لبه پایین رونده روی خط ss~ باشد . با ایجاد لبه پایین رونده روی ss~ توسط مستر ، اسلیو باید این دفعه جواب را روی خط MISO قرار دهد.
                      پس اگر در داخل تابع spi ، کنترلی روی ss~ ندارید، بایستی قبل از حلقه ss~ را صفر کنید و بعد از حلقه هم یک بار یک و سپس صفر و یعدش یک مقدار الکی به تابع spi میدید که مقدار بازگشتیش همان جواب است. سپس دوباره ss~ را یک کنید.
                      ولی اگر در تابع spi خط ss~ را کنترل میکنید فقط کافیه بعد از حلقه دوباره spi را با یک مقدار الکی فراخوانی کنید که مقدار بازگشتی جواب است.

                      در رابطه با نظر دومتون بله میشه . وقتی slave رو خودتون طراحی میکنید و میسازید ،هر کاری میشه کرد.
                      این دیگه منحصرا مربوط به spi نیست.
                      اینطوری میشه:
                      مستر ss~ را صفر میکنه و دستور را به اسلیو (که منتظر دستوره) میده و سپس ss~ را بالا میبره و دیگه کاری به کار سریال و ارتباط و از این حرفا نداره.
                      ولی حالا اسلیو تازه کارش شروع شده باید ببینه دستور چیه و وقتی جواب آماده شد از طریق اون خط به مستر اطلاع(وقفه) بده .
                      توی روتین وقفه سمت مستر باید دوباره ss~ صفر بشه و یک مقدار الکی توسط spi فرستاده بشه ( نیاز نیست حتما spi(0x00) باشه ) ، که مقدار بازگشتی میشه جوابی که اسلیو در پاسخ به دستور مستر داده.
                      فقط در رابطه با استفاده time out تو گفته هاتون یکم جای شک است . اگر فقط صرفا از معنی لغویش استفاده میکنید، درسته . ولی به صورت علمی و همچنین عملی مربوط به چیز دیگه ای میشه و استفادش اینجا زیاد درست نیست.( گفتم زیاد چون اینجا هم میشه یه جورایی ربطش داد)

                      بتون توصیه میکنم این پستم رو هم بخونید:
                      http://www.eca.ir/forum2/index.php?topic=45733.msg488342#msg488342


                      راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                      کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                      نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                      http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                      انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                      دیدگاه


                        #12
                        پاسخ : مشکل باspi

                        نوشته اصلی توسط RubeuS
                        فقط کد زیر را نگاه کنید:

                        کد:
                        unsigned char spi(unsigned char data)
                        {
                          SPDR=data;
                          while(!(SPSR & 0x80)); 
                          return SPDR;
                        }
                        کاملا واضحه . اگه به جواب نرسیدید بگید.
                        سلام دوست عزیز مشکل این برنامه چیه با SPI نوشتمش
                        http://uplod.ir/dfhnij1hmpp1/new.zip.htm
                        عیبمو بگیری بهتر متوجه میشم

                        دیدگاه


                          #13
                          پاسخ : مشکل باspi

                          نوشته اصلی توسط morteza7090
                          سلام دوست عزیز مشکل این برنامه چیه با SPI نوشتمش
                          http://uplod.ir/dfhnij1hmpp1/new.zip.htm
                          عیبمو بگیری بهتر متوجه میشم
                          سلام
                          برنامه رو دیدم
                          قبل از همه چیز بتون توصیه میکنم از کدویزارد استفاده نکنید. اگر دوست دارید تو برنامه نویسی برای میکروها پیشرفت کنید ،برید رجیسترها را یاد بگیرید و به دیتاشیت تسلط داشته باشید.(اگر دوست دارید بگید تا مرجع بگم)

                          کد تصحیح شده فرستنده ( مستر ) :
                          کد:
                          #include <mega16.h>
                          #include <spi.h>
                          void main(void)
                          {
                            unsigned char data;
                            PORTB=0x10;
                            DDRB=0xB0;
                            data=0x25;
                            SPCR=0x70;
                            SPSR=0x00;
                            while (1)
                            {
                              PORTB.4=0;
                              spi(data);
                              PORTB.4=1;
                            }
                          }
                          کلا السیدی را حذف کردم چون فقط تنظیمات اولیه ( init ) شده بود و اصلا ازش استفاده نکردید ( اصلا نیازم نیست که باشه)
                          stdio.h را الکی اینکلود کرده بودید که نیاز بهش نداریم( توابعش بیشتر برای ارتباط usart است)
                          مهمترین اشکال تو حلقه while(1) بود . اصلا از تابع spi استفاده نکردید و دیتا را مستقیم میریختید تو SPDR که اینکار اشتباه است ، چون نه فلگی چک میکنید نه هیچی ( وقتی داخل SPDR چیزی میریزید ارتباط شروع میشود و شما تا پایان ارتباط باید صبر کنید ، پس دوباره بلافاصله نباید داخل SPDR بریزید.)
                          در رابطه با پین ss~ که یک پین active low است( پین 4 از پورت B ) بایستی مقدار اولیه 1 باشد و با شروع ارتباط 0 شود و بعد از پایان 1 شود.


                          کد تصحیح شده گیرنده ( اسلیو ) :
                          کد:
                          #include <mega16.h>
                          #define xtal 8000000
                          #include <delay.h>
                          #include <alcd.h>
                          void main(void)
                          {
                            unsigned char m;
                            PORTB=0x00;
                            DDRB=0x40;
                            SPCR=0x60;
                            SPSR=0x00;
                            lcd_init(16);
                            while (1)
                            { 
                              m=SPDR;
                              lcd_clear();
                              lcd_putchar(m);
                              delay_ms(10);
                            }
                          }
                          تغییر خاصی ندادم فقط یه سری چیزها اضافه بود پاکش کردم.
                          من امتحانش نکردم و فقط کد را دیدم و تغییرش دادم (حتی کامپایلم نکردم)اگر خواستید بگید تا فایل شبیه سازی شده تو پروتئوس بزارم.
                          راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                          کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                          نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                          http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                          انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                          دیدگاه


                            #14
                            پاسخ : مشکل باspi

                            نوشته اصلی توسط RubeuS
                            سلام
                            برنامه رو دیدم
                            قبل از همه چیز بتون توصیه میکنم از کدویزارد استفاده نکنید. اگر دوست دارید تو برنامه نویسی برای میکروها پیشرفت کنید ،برید رجیسترها را یاد بگیرید و به دیتاشیت تسلط داشته باشید.(اگر دوست دارید بگید تا مرجع بگم)

                            کد تصحیح شده فرستنده ( مستر ) :
                            کد:
                            #include <mega16.h>
                            #include <spi.h>
                            void main(void)
                            {
                              unsigned char data;
                              PORTB=0x10;
                              DDRB=0xB0;
                              data=0x25;
                              SPCR=0x70;
                              SPSR=0x00;
                              while (1)
                              {
                                PORTB.4=0;
                                spi(data);
                                PORTB.4=1;
                              }
                            }
                            تشکر بابت جوابتون.الان توی masterچطور از spdrاستفاده کنم؟همینو برام با spdr توضیح میدید
                            توی پروتئوس روی ال سی دی چیزی نشون نمیده

                            دیدگاه


                              #15
                              پاسخ : مشکل باspi

                              خوب بدنه تابع spi را جای فراخوانی تابع بزارید:

                              یعنی به جای :
                              کد:
                              spi(data);
                              کد زیر را قرار دهید:

                              کد:
                                SPDR=data;
                                while(!(SPSR & 0x80));
                              دیگه نمیخواد spi.h هم اینکلود کنید.

                              یعنی در کل برنامه مستر میشه:
                              کد:
                              #include <mega16.h>
                              void main(void)
                              {
                                unsigned char data;
                                PORTB=0x10;
                                DDRB=0xB0;
                                data=0x25;
                                SPCR=0x70;
                                SPSR=0x00;
                                while (1)
                                {
                                  PORTB.4=0;
                                  SPDR=data;
                                  while(!(SPSR & 0x80)); 
                                  PORTB.4=1;
                                }
                              }
                              راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                              کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                              نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                              http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                              انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                              دیدگاه

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