اطلاعیه

Collapse
No announcement yet.

پروتکل SPI

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

    پروتکل SPI

    ُلام
    من میخوام SPI نرم افزاری راه اندازی کنم
    طبق سرچی که زدم دو تا رجیستر هستند که یکی کلاک میزنه که میشه مستر و دومی کلاک دریافت میکنه و دیتا داخل هم شیفت میدند اینجوری

    حالا من کد زدم از مستر به اسلیو دیتا درست میره
    ولی از اسلیو به مستر دیتا چرت پرت میاد
    مشکل من کجاست
    برای اسلیو از SPI سخت افزاری استفاده کردم ولی برای مستر نوشتم
    اینم کد مستر




    #include <mega8.h>
    #include <delay.h>
    // SPI functions
    //#include <spi.h>


    #define SS_PIN PORTB.2
    #define MOSI_PIN PORTB.3
    #define MISO_PIN PINB.4
    #define SCK_PIN PORTB.5


    // Declare your global variables here
    char j,SEND_BYTE,RECEVE_BYTE;




    void main(void)
    {
    PORTB=0x00;
    DDRB=0x2C;


    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;


    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;


    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;


    DDRC=0XFF;


    // SPI initialization
    // SPI Type: Master
    // SPI Clock Rate: 250.000 kHz
    // SPI Clock Phase: Cycle Half
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First
    //SPCR=0x50;
    //SPSR=0x00;


    PORTD=0XFF;
    DDRC=0XFF;
    while (1)
    {



    SS_PIN=1;
    SEND_BYTE=PIND;
    PORTC=RECEVE_BYTE;
    RECEVE_BYTE=0xff;



    SS_PIN=0;
    for(j=0 ; j<8 ; j++){
    MOSI_PIN=SEND_BYTE & 0b10000000;
    SEND_BYTE<<=1;
    SCK_PIN=0,delay_ms(1),SCK_PIN=1,delay_ms(1);

    RECEVE_BYTE=RECEVE_BYTE>>1;
    if(MISO_PIN==1)RECEVE_BYTE = RECEVE_BYTE | 0b10000000;
    RECEVE_BYTE>>=1;



    }


    };
    }




    این هم کد و فایل پروتئوس


    #2
    پاسخ : پروتکل SPI

    آقا مگه اینجوری نیست که با زدن هر کلاک یک بیت از MASTER به SLAVE انتقال پیدا میکنه و یک بیت هم از SLAVE به MASTER میرسه ؟؟؟ پس چرا دریافت از MASTER چرت دریافت میکنه ؟؟ حتی دیتا وارونه هم نیست .

    دیدگاه


      #3
      پاسخ : پروتکل SPI

      سلام
      مشکل برنامه ی Master در خطوط 73 تا 77 است:

      1-در خط 73، سیگنال کلاک به ترتیب پایین رونده-بالارونده نوشته شده، در حالی که با توجه به پیکربندی Slave باید به ترتیب بالارونده-پایین رونده نوشته شود. یعنی:

      [COLOR=#000000][FONT=Consolas]SCK_PIN=1;delay_ms(1);SCK_PIN=0;delay_ms(1);[/FONT][/COLOR][COLOR=#000000][FONT=Consolas][/FONT][/COLOR]


      2-دستور شیفت در خط 77 اضافخ است.

      3-با توجه به اینگه اولین بیت منتقل شده بیت هفتم است، پس باید در خط 76 ابتدا بیت صفرم نوشته شود، سپس با شیفت دادن به چپ که باید در خط 75 اصلاح شود، به جایگاه بیت هفتم منتقل میشود.

      دیدگاه


        #4
        پاسخ : پروتکل SPI

        کد پیشنهادی من برای Master:

        #include <mega8.h>
        #include <delay.h>


        #define SS_PIN PORTB.2
        #define MOSI_PIN PORTB.3
        #define MISO_PIN PINB.4
        #define SCK_PIN PORTB.5


        char sw_spi(char data);


        void main(void)
        {
        // Pin_Name Dir Init_Value
        // SS_PIN Out 1
        // MOSI_PIN Out 0
        // MISO_PIN In 1
        // SCK_PIN Out 0

        PORTB=0x14;
        DDRB=0x2C;


        // SPI initialization
        // SPI Type: Master
        // SPI Clock Rate: F_CPU / 11 (or F_CPU / 14)
        // SPI Clock Phase: Cycle Half
        // SPI Clock Polarity: Low
        // SPI Data Order: MSB First


        PORTD=0XFF;
        DDRC=0XFF;
        while (1)
        {
        PORTC = sw_spi(PIND);
        }
        }


        char sw_spi(char data)
        {
        char count = 8;


        // transfer start
        SS_PIN = 0;
        do
        {
        SCK_PIN = 0;


        /*
        if ((data & 0x80) != 0)
        MOSI_PIN = 1;
        else
        MOSI_PIN = 0;
        */
        MOSI_PIN = 0;
        if ((data & 0x80) != 0) MOSI_PIN = 1;


        data <<= 1;
        if (MISO_PIN) data |= 0x01;
        SCK_PIN = 1;
        } while (--count);
        // transfer end
        SS_PIN = 1;
        return data;
        }
        جدیدترین ویرایش توسط Ali_masjesi; ۰۹:۵۲ ۱۴۰۲/۰۴/۰۵.

        دیدگاه

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