اطلاعیه

Collapse
No announcement yet.

ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

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

    ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

    سلام دوستان
    من یک تراشه برنامه پذیر دارم که قرار است به عنوان slave باشد و از طریق ارتباط spi از یک میکرو فرمان بگیرد اما از آنجایی که پروتکل spi قطعه مورد نظرم 16بیتی است به جای پایه ss خود میکرو avr از پایه portb.4 در atmega128 استفاده کردم وکدم را به صورت زیر نوشتم: وقفه spi فعال است و هر وقت فرستادن یا گرفتن 8 بیت تمام می شود مقدار k در برنامه intrupt یک می شود و datase1 وdatase2 داده های 8 بیتی هستند .

    SPDR=datase1;
    PORTB=PORTB&(0xee);//PORTB.4 used for cs,PORTB.0=ss(active both of them)
    while(k!=1);
    data1=data;
    k=0;//8 bit spi is completed
    PORTB=PORTB|(0x01);//PORTB.0=1
    SPDR=datase2;
    PORTB=PORTB&(0xfe);//PORTB.0=0 for syncronisation
    while(k!=1);
    data2=data;//second 8 bit spi is completed(16 bit spi)
    k=0;
    PORTB=PORTB|(0x10);//cs=0



    به نظرم تمام مراحل کار درست است اما وقتی شبیه سازی می کنم یک کلاک از دست میدهم.
    ممون می شم اگر راهنمااییم کنید و بگید اصلا از پایه کار من درسته ؟ یعنی می شه ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد را بر قرار کرد ؟
    خبر آمد خبری در راه است---- خرم آندل که ازو گاهست

    #2
    پاسخ : ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

    شما کارتو سخت کردی.
    به جای اینکه با تمام پورت B کار کنی از دستورات بیتی استفاده کن اینطوری راحت تر اشکالاتت رو می فهمی.
    بعدش من تووی برنامت ندیدم از دستورات مربوط به spi استفاده کنی اگه میکرو مستر هستش باید از دستور spi(value); استفاده کنی. البته چون گیرنده 16 بیتیه بایست دوبار از این دستور استفاده کنی.
    اگه اطلاعاتت 8 بیتی هستش باید بقیه بیتا رو صفر بفرستی. البته باید بدونی که فرستنده و گیرنده lsb هستن یا msb که ترتیب فرستادن اطلاعاتت درست باشه
    اگر ندانی کجا میروی هر راهی تو را باخود خواهد برد.

    دیدگاه


      #3
      پاسخ : ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

      سلام دوست عزیز و با تشکر از پاسختون
      من در واقع فقط یک قسمت از برنامه که مال عملکرد صفر ویک کردن cs بود رو گذاشتم من برنامه رو با codevision نوشتم و بالای برنامه ام

      #include <spi.h>
      گذاشته بودم و در ضمن تنظیماتم هم به شکل زیر بود :
      // SPI initialization
      // SPI Type: Master
      // SPI Clock Rate: 250.000 kHz
      // SPI Clock Phase: Cycle Half
      // SPI Clock Polarity: Low
      // SPI Data Order: LSB First
      SPCR=0xD2;
      SPSR=0x00;
      و برنامه وقفه هم این بود :
      unsigned char k=0;
      unsigned char data;
      interrupt [SPI_STC] void spi_isr(void)
      {
      data=SPDR;
      k=1;
      // Place your code here

      }
      به خاطر همین به صورت بایت عمل کردم.
      ممنون می شم اگر راهنماییم کنید .
      خبر آمد خبری در راه است---- خرم آندل که ازو گاهست

      دیدگاه


        #4
        پاسخ : ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

        اگه این تنظیمات برای master هستش، به نظر من اصلا از اینتراپت استفاده نکن چون هرموقع از دستور ارسال استفاده کنی اطلاعات ارسال میشه و همزمان میتونی اطلاعات رو دریافت کنی.
        فقط کافیه از دستور مثلا:
        datarecive=spi(datasend);
        دو بار استفاده کنی.
        اگر ندانی کجا میروی هر راهی تو را باخود خواهد برد.

        دیدگاه


          #5
          پاسخ : ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

          سلام دوست عزیز
          اگر از intrupt استفاده نکنم از کجا بفهمم که ارسال8تای اول تمام شده و می توانم 8 تای بعدی را برای تکمیل 16 بیت ارسال روی باس بگذارم ؟ چون در ارسال 16 تا باید کمترین فاصله بین ارسال 8 تای اول و دوم باشد خوب من با وقفه اتمام 8 تای اول بلافاصله 8 تای دوم را می فرستم تا فریمم شبیهspi 16 تایی بشود.چون slave ام spi 16 تایی دارد نه 8 تایی.
          ممنون از راهنمایی هاتون.
          خبر آمد خبری در راه است---- خرم آندل که ازو گاهست

          دیدگاه


            #6
            پاسخ : ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

            نوشته اصلی توسط moradi
            سلام دوست عزیز
            اگر از intrupt استفاده نکنم از کجا بفهمم که ارسال8تای اول تمام شده و می توانم 8 تای بعدی را برای تکمیل 16 بیت ارسال روی باس بگذارم ؟ چون در ارسال 16 تا باید کمترین فاصله بین ارسال 8 تای اول و دوم باشد خوب من با وقفه اتمام 8 تای اول بلافاصله 8 تای دوم را می فرستم تا فریمم شبیهspi 16 تایی بشود.چون slave ام spi 16 تایی دارد نه 8 تایی.
            ممنون از راهنمایی هاتون.
            متاسفانه ماژول SPI در AVR (بر خلاف dsPIC و برخی میکروهای 32 بیتی) دارای حتی یک بایت FIFO هم نیست و دیتایی که که در SPDR می نویسید مستقیما در شیفت رجیستر نوشته می شود. بنابراین یک Inter frame delay خواهید داشت که اجتناب ناپذیره. راه حلش هم اینه که اگر سرعت تون پایینه خودتون با یک I/O پروتکل رو Bit bang کنید و یا از یک شیفت رجیستر بیرونی استفاده کنید (دو شیفت رجیستر کسکد شده).



            There is nothing so practical as a good theory. — Kurt Lewin, 1951

            دیدگاه


              #7
              پاسخ : ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

              سلام آقای سپاس یار
              منظورتون اینه که خودم پروتکل spi رو روی پایه های i/o ایجاد کنم ؟ شیفت رجیسترهای خارجی رو برای ایجاد ارتباط سریا ل درست قرار بدم ؟

              از راهنماییتون ممنونم.
              خبر آمد خبری در راه است---- خرم آندل که ازو گاهست

              دیدگاه


                #8
                پاسخ : ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

                نوشته اصلی توسط moradi
                سلام آقای سپاس یار
                منظورتون اینه که خودم پروتکل spi رو روی پایه های i/o ایجاد کنم ؟ شیفت رجیسترهای خارجی رو برای ایجاد ارتباط سریا ل درست قرار بدم ؟

                از راهنماییتون ممنونم.
                سلام، بله این کار رو باید خودتون انجام بدید. البته بدون شیفت رجیستر هم میشه اما بار نرم افزاری زیاد میشه و سرعت ارتباط تون کم خواهد شد.
                There is nothing so practical as a good theory. — Kurt Lewin, 1951

                دیدگاه


                  #9
                  پاسخ : ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

                  البته به نظر من چون کلاک slave رو master تامین میکنه لازم نیست حتما دقیقا لحظه ای که ارسال بایت اول تموم شد بایت دوم ارسال بشه.
                  در این صورت slave منتظر بایت دوم خواهد ماند تا ارسال بشه.
                  اگر ندانی کجا میروی هر راهی تو را باخود خواهد برد.

                  دیدگاه


                    #10
                    پاسخ : ارتباط spi یک قطعه با پروتکل spi 16 بیتی با avr که پروتکل spi 8 بیتی دارد

                    با سلام خدمت دوستان عزیز

                    من یک دستگاه دارم که پردارنده اون یک ارم هست که بادرایور ال ای دی به نام mbi5026 از طریقه spi در ارتباط هست . اطلاعات رو ارم از طریق spi ارسال و درایور mbi5026 دریافت میکنه . و روش کار درایور mbi5026 به این صورت هست که سه عدد پایه کنترلی داره به نام های sdi - csk- le که پایه وردی سریال - فرکانس کلاک -و پایه کنترل کننده - در هر بار انتقال باید دوبایت داده یعنی 16 بیت دریافت میکنه چون 16 خروجی داره - که درحالت عادی ارم در ارتباط با این درایور mbi5026 هیچ مشکلی نیست مثلا برای اینکه هر 16 خروجی رو فعال کنیم کافیه دو بایت به مقدار 255 پشت سر هم ارسال کنیم- .من میخوام بجای ای سی درایورmbi5026 یک عدد avr بذارم تا بتونم کد های ارسالی ارم رو بخونم اما هیچ راه دسترسی به نحوه تنظیمات ارم ندارم مثل فرکانس کلاک- پولاریته- فاز- ؟ فقط میدونم که کریستال ارم 8 مگا هست - در حقیقت من میخوام avr نقشه slave رو برای ارم داشته باشه و اطلاعاتی که قبلا ارم برای درایور mbi5026 ارسال میکرده حالا برای avr ارسال کنه و من بتونم دریافت کنم و برروی lcd نمایش بدم -الان همزمان ارم رو به درایور mbi5026 و avr وصل میکنم و درایور mbi5026 به خوبی کار میکنه و اطلاعات رو دریافت و خروجی متناسب رو فعال میکنه اما اطلاعاتی که avr دریافت میکنه و نمایش میده قابل قبول نیست و با خروجی درایور mbi5026 از نظر فعال شدن خروجی ها همخونی نداره و با هم مطابق نیستند- مثلا زمانی که همه خروجی های درایور mbi5026 فعال هست من انتظار دارم avr دو بایت با مقدارهای 255و255 دریافت کنه که اینچنین چیزی اتفاق نمیفته .
                    ممنون میشم نظر یا پیشنهادی دارن اعلام کنند.

                    دیدگاه

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