اطلاعیه

Collapse
No announcement yet.

مشکل با پروتکل spi

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

    مشکل با پروتکل spi

    سلام من می خوام دوتا میکرو lpc2138 رو با پروتکل spi به هم متصل کنم و مقدار یه متغییر رو انتقال بدم روی میکرو بعدی
    ولی نمی دونم باید چی کار کنم؟
    اگه کسی می تونه یه مثال ساده بگه من متوجه بشم؟

    نوشته اصلی توسط Mojtababm66 نمایش پست ها
    سلام من می خوام دوتا میکرو lpc2138 رو با پروتکل spi به هم متصل کنم و مقدار یه متغییر رو انتقال بدم روی میکرو بعدی
    ولی نمی دونم باید چی کار کنم؟
    اگه کسی می تونه یه مثال ساده بگه من متوجه بشم؟
    یعنی کسی نیست تا حالا با spi میکرو arm کار کرده باشه بتونه یه مثال بهم بگه؟

    با توجه به کمک شایانی که دوستان در این پست انجام دادند من خودم یه سری کد برای را اندازی spi یافتم ولی به نتونستم ازش استفاده کنم
    یعنی اطلاعات می فرسته ولی اون سمت نمی تونم این اطلاعات بخونم
    کد:
    [LEFT]#include<lpc21xx.h>
    
    unsigned char spi_rec;
    
    void spi_ini();
    void spi_tr1(unsigned int x);
    char spi_re();
    void spi_tr(unsigned char cmd,unsigned char data);
    void spi_str(unsigned char *str);
    
    int ar[10]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
    int ar1[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
    
    void pll();
    
    void delay_ms(unsigned int x);
    
    int main()
    {
    int i,a,b,c,d,e,f,g,h;
    a=b=c=d=e=f=g=h=0;
    PINSEL0=0X00000000;
    IO0DIR=0XFFFFFFFF;
    pll();
    spi_ini();
    spi_tr(0x0a,0xf);
    spi_tr(0x0b,0xf);
    for(i=0;i<9;i++)
    {
    spi_tr(ar1[i],ar[0]);
    delay_ms(100);
    }
    spi_tr(0x0c,0x01);
    while(1)
    {
    spi_tr(ar1[7],ar[a]);
    spi_tr(ar1[6],ar[b]);
    spi_tr(ar1[5],ar[c]);
    spi_tr(ar1[4],ar[d]);
    spi_tr(ar1[3],ar[e]);
    spi_tr(ar1[2],ar[f]);
    spi_tr(ar1[1],ar[g]);
    spi_tr(ar1[0],ar[h]);
    a++;
    
    if(a==10)
    {
    a=0;
    b++;
    }
    if(b==10)
    {
    a=b=0;
    c++;
    }
    if(c==10)
    {
    a=b=c=0;
    d++;
    }
    if(d==10)
    {
    a=b=c=d=0;
    e++;
    }
    if(e==10)
    {
    a=b=c=d=e=0;
    f++;
    }
    if(f==10)
    {
    a=b=c=d=e=f=0;
    g++;
    }
    if(g==10)
    {
    a=b=c=d=e=f=g=0;
    h++;
    }
    if(h==10)
    {
    a=b=c=d=e=f=g=h=0;
    }
    delay_ms(3000);
    }
    }
    
    void pll()
    {
    /*PLL IS CONFIGURED TO GET 60HZ pCLK*/
    PLLCFG=0X24; // SET PSEL=2 AND MSEL=5
    PLLCON=0X01; //PLL IS ACTIVE BUT NOT YET CONNECT
    PLLFEED=0XAA; //FEED SEQUENCE
    PLLFEED=0X55; //FEED SEQUENCE
    while((PLLSTAT & 0X400)==0); //WAIT FOR FEED SEQUENCE TO BE INSERTED
    PLLCON=0X03; // PLL HAS BEEN ACTIVE AND BEING CONNECTRD
    VPBDIV=0X00; // SET PCLK SAME AS FCCLK
    PLLFEED=0XAA; //FEED SEQUENCE
    PLLFEED=0X55; //FEED SEQUENCE
    }
    
    void spi_ini()
    {
    PINSEL0 |=0x1500; /* P0.4, P0.5, P0.6, P0.7 are set as SCK, MISO, MOSI and GPIO */
    //IODIR0 |= 0X80; /* SSEL is output */
    //IOSET0 |=0X80; /* set SSEL to high */
    S0SPCCR=8; /* SPI clock prescale register minimum value is 8. */
    S0SPCR=0x0030; /* Device select as master, Set data to 8-bit, CPOL = 0, CPHA = 0*/
    }
    
    void spi_tr1(unsigned int x)
    {
    S0SPDR =x;
    while ( !(S0SPSR & 0x80) ); /* Wait until the SPIF bit is set to indicate trabsfer complete */
    }
    
    char spi_re()
    {
    while ( !(S0SPSR & 0x80) ); /* Wait until the SPIF bit is set to indicate trabsfer complete */
    spi_rec= S0SPDR;
    return spi_rec;
    }
    
    void spi_str(unsigned char *str)
    {
    while(*str!='\0')
    {
    spi_tr1(*str);
    str++;
    }
    }
    
    void spi_tr(unsigned char cmd,unsigned char data)
    {
    IO0CLR=(1<<7); //enable transmission
    spi_tr1(cmd);
    spi_tr1(data);
    IO0SET=(1<<7); // disable transmission
    
    }
    
    void delay_ms(unsigned int x)
    {
    int i;
    while(x--)
    {
    for(i=0;i<100;i++);
    }
    }
    [/LEFT]
    واینم شکل مدارشه



    می دونید من می خوام دوتا میکرو رو به هم متصل کنم ولی این برنامه کارش فرستادن چندتا کد به سون سگمنته
    از دوستان اگه کسی می دونه این کدا رو چه جوریا میشه تغییرش داد واسه اتصال دو تا میکرو به هم به من هم یه کمکی برسونه

    مثل اینکه اینجا هیچکس تا حالا با spi میکرو lpc کار نکرده
    جدیدترین ویرایش توسط اشکان غفارزاده; ۱۹:۴۰ ۱۳۹۵/۰۵/۲۰.

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

    خب دوستان ما که مشکلمان حل شد.
    امیدوار بود آدمی به خیر کسان
    مرا به خیرتان امید نیست...

    دیدگاه


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

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

      من یک دستگاه دارم که پردارنده اون یک ارم هست که بادرایور ال ای دی به نام 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