اطلاعیه

Collapse
No announcement yet.

ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

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

    ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

    باسلام
    من بین دو میکرو قصد دارم حدود 2 کیلو بایت دیتا را از master به slave ارسال کنم.
    البته master بصورت عادی و بایتها را پشت سر هم با دستور spi(data) ارسال می کند و در slave بخاطر کارهای دیگری که در حال انجام آن است با interupt دیتا ها را می گیرم .
    میکرو master atemga64 با کریستال 14 مگاهرتز است و اسلیو atmega 16 با کریستال 7.3728 .
    متاسفانه دیتاها خیلی وقتها اشتباه دریافت می شوند و برخی بایتها کلا یک چیز دیگر است و نمی دانم مشکل از ارسال است یا دریافت ؟
    ارتباط کاملا یک طرفه است و فقط مستر ارسال می کند و اسلیو دریافت می کند حتی delay هم به من کمک نکرد
    خیلی مقاله و نمونه کد در مورد spi دیدم ولی نتونستم مشکلم رو حل کنم .
    احتمالا باید تنظیماتم مشکل داشته باشه ممنون می شم کمکم کنید :

    برنامه مستر :
    کد:
     SPCR=0x51;
      SPSR=0x00;
      // Global enable interrupts
         #asm("sei")
    
      CS1=0;    delay_ms(350); 
        spi(0xdb);  delay_ms(90);   
        spi(0xbc);  delay_ms(90);   
        spi(0xdb);  delay_ms(90);   
        spi(0xbc);  delay_ms(90);   
        spi(0xdb);  delay_ms(90);   
        spi(0xbc);  delay_ms(90);   
        spi(0xdb);  delay_ms(90);   
        spi(0xbc);  delay_ms(90);   
        spi(0xdb);  delay_ms(90);   
        spi(0xbc);  delay_ms(90); 
        
        spi(0x80);  delay_ms(90);   
        spi(0x01);  delay_ms(90);   
        spi('G');  delay_ms(90);  
         
        spi(0x3a);  delay_ms(90);   
        spi(0x3b);  delay_ms(90);   
        spi(0x3a);  delay_ms(90);   
        spi(0x3b);  delay_ms(90);   
        spi(0x3a);  delay_ms(90);   
        spi(0x3b);  delay_ms(90);   
        spi(0x3a);  delay_ms(90);   
        spi(0x3b);  delay_ms(90);   
        spi(0x3a);  delay_ms(90);   
        spi(0x3b);  delay_ms(500); 
      CS1=1;
    و در اسلیو :

    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.3 Standard
    Automatic Program Generator
    © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date  : 2014/03/29
    Author : PerTic@n
    Company : If You Like This Software,Buy It
    Comments: 
    
    
    Chip type        : ATmega16
    Program type      : Application
    AVR Core Clock frequency: 7.372800 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/
    
    #include <mega16.h>
    #include <delay.h>
    #include <spi.h>
    #include <stdio.h>
    
    #ifndef RXB8
    #define RXB8 1
    #endif
    
    #ifndef TXB8
    #define TXB8 0
    #endif
    
    #ifndef UPE
    #define UPE 2
    #endif
    
    #ifndef DOR
    #define DOR 3
    #endif
    
    #ifndef FE
    #define FE 4
    #endif
    
    #ifndef UDRE
    #define UDRE 5
    #endif
    
    #ifndef RXC
    #define RXC 7
    #endif
    
    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<DOR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)
    
    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];
    
    #if RX_BUFFER_SIZE <= 256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif
    int i;
    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;
    
    // USART Receiver interrupt service routine
    
    
    
    // Standard Input/Output functions
    
    // SPI functions
    
    unsigned char rx_state,d[60],sbuff;
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTA=0x00;
    DDRA=0x00;
    
    // Port B initialization
    // Func7=In Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=0 State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTB=0xd0;
    DDRB=0x40;
    
    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x00;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 115200
    UCSRA=0x00;
    UCSRB=0x98;
    UCSRC=0x06;
    UBRRH=0x00;
    UBRRL=0x03;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;
    
    // SPI initialization
    // SPI Type: Slave
    // SPI Clock Phase: Cycle Start
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First
    SPCR=0xc1;
    SPSR=0x00;
    
    
    // Clear the SPI interrupt flag
    #asm
      in  r30,spsr
      in  r30,spdr
    #endasm
    // TWI initialization
    // TWI disabled
    TWCR=0x00;
    delay_ms(200);
     UDR=0X53;
    // Global enable interrupts
    #asm("sei")
    delay_ms(200);   UDR=0X74;
    rx_state=0;
    sbuff=0;
    while (1)
       {
       if(rx_state>4)
    { 
    if((d[rx_state]==0x3b)&&(d[rx_state-1]==0x3a))   
      // if((d[rx_state]==0x3b)&&(d[rx_state-1]==0x3a)&&(d[rx_state-2]==0x3b)&&(d[rx_state-3]==0x3a))//&&
     //    (d[rx_state-4]==0x3b)&&(d[rx_state-5]==0x3a)&&(d[rx_state-6]==0x3b)&&(d[rx_state-7]==0x3a)&&
       //   (d[rx_state-8]==0x3b)&&(d[rx_state-9]==0x3a))
        {   
       
       sbuff=1;
       rx_state=0;
       } 
      }   
       if(sbuff==1)
       { 
       sbuff=0;     
        for(i=0;i<23;i++)
        { 
          // rx_state=0;
          UDR=d[i];
          delay_ms(10);  
        }
       
     
      //delay_ms(200); 
     // UDR=spi(0x33);  
      // UDR=0X34;
       // delay_ms(200);
       // Place your code here
    
       }
    }
    }
    interrupt [USART_RXC] void ReceiveIntHandler(void)  //slaves
    {
    
    }
     interrupt [USART_TXC] void TransmitIntHandler(void)  //slaves
    {
    
    }
    interrupt [SPI_STC] void spi_isr(void)
    {
    d[rx_state]=SPDR;
    rx_state++;
    
    
    //delay_ms(10);
    }
    البته اینجا فعلا حدود 20 بایت رو میگیرم و برای تست به پورت سریال می فرستم ولی در نهایت تعداد بایتها خیلی زیاد است .
    قبلا این کار را با rs485 انجام می دادم که خیلی کند بود و تصمیم گرفتم سراغ spi بروم.

    #2
    پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

    شما کریستال های هردو میکرو را یکی کن
    1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
    من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
    !Electronic On! Programming On
    هوشمندانه سوال بپرسیم!
    http://ir02x6.persiangig.com/logo/eca/tanks_01.png

    دیدگاه


      #3
      پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

      با تشکر از شما
      یعنی با کریستالهای متفاوت نمیشه !

      دیدگاه


        #4
        پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

        نوشته اصلی توسط داریوش عباسی
        با تشکر از شما
        یعنی با کریستالهای متفاوت نمیشه !
        زیادم مطمئن نیستم :(
        ولی امتحان کن!
        درضمن delayهارو هم وردار!
        1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
        من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
        !Electronic On! Programming On
        هوشمندانه سوال بپرسیم!
        http://ir02x6.persiangig.com/logo/eca/tanks_01.png

        دیدگاه


          #5
          پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

          من کریستالها رو یکی کردم حتی خود میکرو های master و slave هم هردو atmega 64 هستند ولی بازهم در حجم کم که تست می کنم از هر 10 بار ارسال ، یکبار دیتاهای دریافتی خراب هستند البته هنوز سراغ 2 کیلو بایت نرفتم !
          فاصله بین دو میکرو حدود 30 سانت است و هردو میکرو روی دو برد مختلف هستند .
          مشکل از کجا ست آخه
          مگه spi مطمن نیست ؟؟

          دیدگاه


            #6
            پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

            ممکنه منبع تغذیه نویزی باشه!
            در ضمن فاصله رو کمتر کن ببین چی میشه
            اتصالات رو هم چک کن چون پایه ی sckخیلی حساسه!
            1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
            من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
            !Electronic On! Programming On
            هوشمندانه سوال بپرسیم!
            http://ir02x6.persiangig.com/logo/eca/tanks_01.png

            دیدگاه


              #7
              پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

              نوشته اصلی توسط داریوش عباسی
              من کریستالها رو یکی کردم حتی خود میکرو های master و slave هم هردو atmega 64 هستند ولی بازهم در حجم کم که تست می کنم از هر 10 بار ارسال ، یکبار دیتاهای دریافتی خراب هستند البته هنوز سراغ 2 کیلو بایت نرفتم !
              فاصله بین دو میکرو حدود 30 سانت است و هردو میکرو روی دو برد مختلف هستند .
              مشکل از کجا ست آخه
              مگه spi مطمن نیست ؟؟
              اولاً ارتباط SPI ربطی به کریستال نداره ، چون زمانبندی توی این ارتباط مطرح نیست :NO:
              فقط شما باید سرعت Clock مستر را طوری تنظیم کنی که Slave بتونه لبه های پالس را تشخیص بده ، همین.
              ---------------------
              حداکثر فاصله مجاز بین دو میکرو رابطه عکس با سرعت کلاک داره ، هرچه فرکانس بره بالاتر باید فاصله را کم کنید چون:
              استفاده از خطوط طولانی باعث میشه حالت خازنی خط بالا بره و در صورتی که فاصله زیاد باشه و فرکانس را هم بالا ببری به دلیل خازنی بودن خط شکل موج مربعی به ذوذنقه تبدیل میشه و در فرکانس بالا ممکنه Slave لبه های پالس را تشخیص نده ...

              در ضمن ارتباطات TTL برای فاصله های بیش از 20 سانت را توصیه نمیکنم .

              موفق باشید
              امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

              دیدگاه


                #8
                پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

                در ضمن ارتباطات TTL برای فاصله های بیش از 20 سانت را توصیه نمیکنم .
                من قبلا از rs485 استفاده می کردم ولی بخاطر سرعت پایین مجبور شدم از spi استفاده کنم .
                من فرکانس رو به پایین ترین مقدار می رسونم و تست می کنم شما توصیه می کنید از چه مدی استفاده کنم ؟
                اگه این روش جواب نده از چه روش دیگه ای می تونم استفاده کنم ؟

                دیدگاه


                  #9
                  پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

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

                  دیدگاه


                    #10
                    پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

                    نوشته اصلی توسط داریوش عباسی
                    از تمام کسانیکه تجربه عملی کار کردن با spi را دارند خواهش می کنم نظر بدهند .
                    مهندس برای ارتباط دو تا دیوایس و بستر سیم استفاده از SPI کار درستی نیست :NO:
                    حداقل از RS232 استفاده کن ؛ مگه بیشتر از 115.2Kbps سرعت میخواهی ؟؟؟
                    امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                    دیدگاه


                      #11
                      پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

                      چرا هیچکسی رو ندیدم بیاد تو حلقه while تو avr با spi یه چیزی رو بفرسته

                      دیدگاه


                        #12
                        پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

                        نوشته اصلی توسط mohammadfa91
                        چرا هیچکسی رو ندیدم بیاد تو حلقه while تو avr با spi یه چیزی رو بفرسته
                        منظورت چیه ؟
                        ارسال SPI میتونه هرجایی انجام بشه
                        امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                        دیدگاه


                          #13
                          پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

                          نوشته اصلی توسط Abbas Sarami
                          منظورت چیه ؟
                          ارسال SPI میتونه هرجایی انجام بشه
                          یه نمونه کد ارسال میکرو به میکرو با AVR به من بدین ممنون میشم.( تو حلقه while بتونیم بفرستیم)

                          دیدگاه


                            #14
                            پاسخ : ارسال 2کیلو بایت دیتا بین 2 میکرو با spi

                            مهندس برای ارتباط دو تا دیوایس و بستر سیم استفاده از SPI کار درستی نیست :NO:
                            حداقل از RS232 استفاده کن ؛ مگه بیشتر از 115.2Kbps سرعت میخواهی ؟؟؟
                            از rs232 که نمی تونم بخاطر سیستم master , slave استفاده کنم و 485 بهترین راه بود .
                            متاسفانه سرعت 115200 هم برای کار من مناسب نیست .
                            الان اومدم spi رو فعلا با همون کمترین سرعتش که 115200 هست تست کردم تا اگه درست بود برم سراغ یک پله بالاتر

                            فعلا با چند تا بایت مشکل ندارم تا ببینم روی 2 کیلو بایت و بیشتر چی میشه .

                            ه نمونه کد ارسال میکرو به میکرو با AVR به من بدین ممنون میشم.( تو حلقه while بتونیم بفرستیم)
                            من هم منظور شما از توی حلقه while رو نمی فهمم شما دستور spi(22) رو هر جایی می تونی بنویسی

                            دیدگاه

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