اطلاعیه

Collapse
No announcement yet.

راه اندازی میکرو با spi

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

    راه اندازی میکرو با spi

    سلام دوستان عزیز
    من میخوام یه برنامه بنویسم که ازطریق spi دوتا میکرو باهم ارتباط داشته باشن.میخوام وقتی کلید میکروی اول رو میزنیم یه led روی میکروی دومی روشن بشه البته برنامشو نوشتم ولی جواب نمیده :sad:
    میخوام بدونم از بین دوستان کسی هست که همچین برنامه ای رو نوشته باشه یا حداقل تا حدودی بلد باشه .من تازه دارم میکرو میخونم لطفا کمک کنید.
    به زبان c اگه باشه ممنون میشم

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

    با سلام

    بفرمایید ، این یه برنامه ساده جهت ارتباط دو میکرو ، MEGA128 به عنوان MASTER و MEGA16 به عنوان SLAVE :

    فرکانس کلاک دو میکرو : 8 مگ هست .
    فرکانس کار SPI هم 8/16 مگ هست .

    برنامه MASTER :

    کد:
    #include <avr/io.h>
    
    
    
    /* SPI_Port Data Register - PORTB */
    #define	  PORT_SPI		PORTB
    #define  PO_MISO		PB3    
    #define  PO_MOSI		PB2    
    #define  PO_SCK 		PB1    
    #define  PO_SS		PB0    
    /* SPI_Port Data Direction Register - DDRB */
    #define	  DDR_SPI		DDRB
    #define  DD_MISO		DDB3    
    #define  DD_MOSI		DDB2    
    #define  DD_SCK 		DDB1    
    #define  DD_SS		DDB0
    /* SPI_Port Input Pins - PINB */
    #define	  PIN_SPI		PINB
    #define  PI_MISO		PINB3    
    #define  PI_MOSI		PINB2    
    #define  PI_SCK 		PINB1    
    #define  PI_SS		PINB0  
    
    
    
    
    static void avr_init(void);
    
    void SPI_MasterInit(void);
    void SPI_MasterTransmit(char cData);
    char SPI_MasterReceive(void);
    
    int main(void)
    {
    	char send_data,get_data;
    	
    	send_data=0x55;
    	
      avr_init();
      
      for(;;)
      {
        // Tasks here.
      
    		if(!(PINA&(1<<PINA0))) 	SPI_MasterTransmit(send_data); 
    		else 						SPI_MasterTransmit(0); 
    
    		get_data = SPI_MasterReceive();
    	
    		PORTF= get_data;
      }
      
      return(0);
    }
    
    
    
    static void avr_init(void)
    {
     
     SPI_MasterInit(); 
     
     DDRF=0xff;  
     
     PORTA|=(1<<PINA0);//PINA0 SET TO PULLUP
     
      return;
    }
      
    	
    void SPI_MasterInit(void)
    {
    /* Set MOSI and SCK output and SS output and MISO input */
    DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
    /* Set "1" SS PORT */
    PORT_SPI = (1<<PO_SS);
    /* Set "PULLUP" MISO PIN */
    PIN_SPI |=(1<<PI_MISO);
    /* Enable SPI, Master, set clock rate fck/16 */
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    }	
    
    void SPI_MasterTransmit(char cData)
    {
    /* Set "0" SS PORT */
    PORT_SPI&=~(1<<PO_SS);
    /* Start transmission */
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));
    
    }
    
    char SPI_MasterReceive(void)
    {
    char data;
    
    /* Start transmission */
    data = SPDR ;
    
    return data;
    }


    برنامه SLAVE :


    کد:
    #include <avr/io.h>
    
    
    /* SPI_Port Data Register - PORTB */
    #define	  PORT_SPI		PORTB
    #define  PO_MISO		PB6    
    #define  PO_MOSI		PB5    
    #define  PO_SCK 		PB7    
    #define  PO_SS		PB4    
    /* SPI_Port Data Direction Register - DDRB */
    #define	  DDR_SPI		DDRB
    #define  DD_MISO		DDB6    
    #define  DD_MOSI		DDB5    
    #define  DD_SCK 		DDB7    
    #define  DD_SS		DDB4
    /* SPI_Port Input Pins - PINB */
    #define	  PIN_SPI		PINB
    #define  PI_MISO		PINB6    
    #define  PI_MOSI		PINB5    
    #define  PI_SCK 		PINB7    
    #define  PI_SS		PINB4  
    
    
    
    
    static void avr_init(void);
    void SPI_SlaveInit(void);
    void SPI_SlaveTransmit(char cData);
    char SPI_SlaveReceive(void);
    
    int main(void)
    {
    	char send_data,get_data;
    	
    	send_data=0xaa;
    	
      avr_init();
      
      for(;;)
      {
        // Tasks here.
    		SPI_SlaveTransmit(send_data);  
    	
    		get_data = SPI_SlaveReceive();
    	
    		PORTC= get_data;
    	
      }
      
      return(0);
    }
    
    
    
    static void avr_init(void)
    {
     
     SPI_SlaveInit(); 
     
     DDRC=0xff;  
     
      return;
    }
      
    	
    void SPI_SlaveInit(void)
    {
    /* Set MISO output, all others input */
    DDR_SPI = (1<<DD_MISO);
    /* Set "1" MISO port */
    PORT_SPI |=(1<<PO_MISO);
    /* Enable SPI , set clock rate fck/16*/
    SPCR = (1<<SPE)|(1<<SPR0);
    }
    
    void SPI_SlaveTransmit(char cData)
    {
    
    /* Start transmission */
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));
    
    }
    
    char SPI_SlaveReceive(void)
    {
    char data;
    
    
    /* Start transmission */
    data = SPDR ;
    
    return data;
    }


    اتصالات هم ،
    SCK به SCK
    MISO به MISO
    MOSI به MOSI
    SS به SS

    پین 0 پورت A مستر (MEGA128) با یه مقاومت ، پول پ بشه و متصل بشه به یه پوش باتون و اونور پوش باتون هم زمین بشه و دوسر پوش باتون هم یه خازن 100 نانو بزارید.

    از یه LED هم جهت تست خروجی ها استفاده کنید.

    دیدگاه


      #3
      پاسخ : راه اندازی میکرو با spi

      خوب آقا من یه AT90USB162 هم داشتم گفتم بزار این رو هم شبکه بکنم با اون دو تا و نتیجه اش رو بهتون بگم ،
      برای این کار برنامه MASTER به صورت زیر اصلاح کردم :

      برنامه MASTER (مگا 128) :


      کد:
        
      #include <avr/io.h>
      
      
      
      
      /* SPI_Port Data Register - PORTB */
      #define	  PORT_SPI		PORTB
      #define  PO_MISO		PB3    
      #define  PO_MOSI		PB2    
      #define  PO_SCK 		PB1    
      #define  PO_SS1		PB0  
      #define  PO_SS2		PB4   
      /* SPI_Port Data Direction Register - DDRB */
      #define	  DDR_SPI		DDRB
      #define  DD_MISO		DDB3    
      #define  DD_MOSI		DDB2    
      #define  DD_SCK 		DDB1    
      #define  DD_SS1		DDB0
      #define  DD_SS2		DDB4
      /* SPI_Port Input Pins - PINB */
      #define	  PIN_SPI		PINB
      #define  PI_MISO		PINB3    
      #define  PI_MOSI		PINB2    
      #define  PI_SCK 		PINB1    
      #define  PI_SS1		PINB0  
      #define  PI_SS2		PINB4 
      
      
      
      
      static void avr_init(void);
      
      void SPI_MasterInit(void);
      void SPI_MasterTransmit(char cData);
      char SPI_MasterReceive(void);
      
      int main(void)
      {
      	char send_data,get_data;
      	
      	send_data=0x55;
      	
        avr_init();
        
        for(;;)
        {
          // Tasks here.
        
      		/* Set "0" SS1 PORT */
      		PORT_SPI&=~(1<<PO_SS1);//Active device : 1
      		
      		if(!(PING&(1<<PING0))) 		SPI_MasterTransmit(send_data); 
      		else 							SPI_MasterTransmit(0); 
      		
      		
      		get_data = SPI_MasterReceive();
      		
      		PORTF= get_data;
      		/* Set "1" SS1 PORT */
      		PORT_SPI|=(1<<PO_SS1);//Disable device : 1 
      		
      		/* Set "0" SS2 PORT */
      		PORT_SPI&=~(1<<PO_SS2);//Active device : 2
      		
      		if(!(PING&(1<<PING1))) 		SPI_MasterTransmit(send_data); 
      		else 							SPI_MasterTransmit(0); 
      		
      		
      		get_data = SPI_MasterReceive();
      		
      		PORTA= get_data;
      		/* Set "1" SS1 PORT */
      		PORT_SPI|=(1<<PO_SS2);//Disable device : 2 
        }
        
        return(0);
      }
      
      
      //----------avr_init----------------------//
      static void avr_init(void)
      {
       
       SPI_MasterInit(); 
      
       DDRA=0XFF;
       DDRF=0xFF;  
       
       
       PORTG|=(1<<PING0);//PING0 SET TO PULLUP
       PORTG|=(1<<PING1);//PING1 SET TO PULLUP
       
        return;
      }//avr_init-------------------------------//
        
      //--------------SPI_MasterInit----------------//
      void SPI_MasterInit(void)
      {
      /* Set MOSI and SCK output and SS1 output and SS2 output and MISO input */
      DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS1)|(1<<DD_SS2);
      /* Set "1" SS1 PORT */
      PORT_SPI = (1<<PO_SS1);
      /* Set "1" SS2 PORT */
      PORT_SPI = (1<<PO_SS2);
      /* Set "PULLUP" MISO PIN */
      PIN_SPI |=(1<<PI_MISO);
      /* Enable SPI, Master, set clock rate fck/16 */
      SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
      }//SPI_MasterInit-------------------------------//
      	
      //-----------SPI_MasterTransmit-------------------//
      void SPI_MasterTransmit(char cData)
      {
      
      /* Start transmission */
      SPDR = cData;
      /* Wait for transmission complete */
      while(!(SPSR & (1<<SPIF)));
      
      }//SPI_MasterTransmit--------------------------------//
      
      //-------------SPI_MasterReceive---------------------//
      char SPI_MasterReceive(void)
      {
      char data;
      
      /* Start transmission */
      data = SPDR ;
      
      return data;
      }//SPI_MasterReceive-------------------------------//


      برنامه SLAVE 1 (مگا 16) :

      کد:
      #include <avr/io.h>
      
      /* SPI_Port Data Register - PORTB */
      #define	  PORT_SPI		PORTB
      #define  PO_MISO		PB6    
      #define  PO_MOSI		PB5    
      #define  PO_SCK 		PB7    
      #define  PO_SS		PB4    
      /* SPI_Port Data Direction Register - DDRB */
      #define	  DDR_SPI		DDRB
      #define  DD_MISO		DDB6    
      #define  DD_MOSI		DDB5    
      #define  DD_SCK 		DDB7    
      #define  DD_SS		DDB4
      /* SPI_Port Input Pins - PINB */
      #define	  PIN_SPI		PINB
      #define  PI_MISO		PINB6    
      #define  PI_MOSI		PINB5    
      #define  PI_SCK 		PINB7    
      #define  PI_SS		PINB4  
      
      
      
      
      static void avr_init(void);
      void SPI_SlaveInit(void);
      void SPI_SlaveTransmit(char cData);
      char SPI_SlaveReceive(void);
      
      int main(void)
      {
      	char send_data,get_data;
      	
      	send_data=0xaa;
      	
        avr_init();
        
        for(;;)
        {
          // Tasks here.
        SPI_SlaveTransmit(send_data);  
      	get_data = SPI_SlaveReceive();
      	PORTC= get_data;
        }
        
        return(0);
      }
      
      
      //-------------avr_init-----------------//  
      static void avr_init(void)
      {
       
       SPI_SlaveInit(); 
       
       DDRC=0xff;  
       
        return;
      }//avr_init-------------------------------//  
        
      //--------------SPI_SlaveInit-----------------//  	
      void SPI_SlaveInit(void)
      {
      /* Set MISO output, all others input */
      DDR_SPI = (1<<DD_MISO);
      /* Set "1" MISO port */
      PORT_SPI |=(1<<PO_MISO);
      /* Enable SPI , set clock rate fck/16*/
      SPCR = (1<<SPE)|(1<<SPR0);
      }//SPI_SlaveInit-------------------------------//  
      
      //-------------SPI_SlaveTransmit------------------//  
      void SPI_SlaveTransmit(char cData)
      {
      
      /* Start transmission */
      SPDR = cData;
      /* Wait for transmission complete */
      while(!(SPSR & (1<<SPIF)));
      
      }//SPI_SlaveTransmit-------------------------------//  
      
      //-------------SPI_SlaveReceive------------------//  
      char SPI_SlaveReceive(void)
      {
      char data;
      
      
      /* Start transmission */
      data = SPDR ;
      
      return data;
      }//SPI_SlaveReceive-------------------------------//


      برنامه 90USB162 ، SLAVE 2 :


      کد:
        
      #include <avr/io.h>
      
      
      
      
      /* SPI_Port Data Register - PORTB */
      #define	  PORT_SPI		PORTB
      #define  PO_MISO		PB3    
      #define  PO_MOSI		PB2    
      #define  PO_SCK 		PB1    
      #define  PO_SS		PB0    
      /* SPI_Port Data Direction Register - DDRB */
      #define	  DDR_SPI		DDRB
      #define  DD_MISO		DDB3    
      #define  DD_MOSI		DDB2    
      #define  DD_SCK 		DDB1    
      #define  DD_SS		DDB0
      /* SPI_Port Input Pins - PINB */
      #define	  PIN_SPI		PINB
      #define  PI_MISO		PINB3    
      #define  PI_MOSI		PINB2    
      #define  PI_SCK 		PINB1    
      #define  PI_SS		PINB0  
      
      
      
      
      static void avr_init(void);
      void SPI_SlaveInit(void);
      void SPI_SlaveTransmit(char cData);
      char SPI_SlaveReceive(void);
      
      int main(void)
      {
      	char send_data,get_data;
      	
      	send_data=0x07;
      	
        avr_init();
        
        for(;;)
        {
          // Tasks here.
      		SPI_SlaveTransmit(send_data);  
      		
      		get_data = SPI_SlaveReceive();
      		PORTD= get_data;
        }
        
        return(0);
      }
      
      
      
      //-------------avr_init-----------------//  
      static void avr_init(void)
      {
       
       CLKPR=0x80;
       CLKPR=0x00;
       
       SPI_SlaveInit(); 
       
       DDRD=0xff;  
       
        return;
      }//avr_init-------------------------------//  
        
      //--------------SPI_SlaveInit-----------------//  	
      void SPI_SlaveInit(void)
      {
      /* Set MISO output, all others input */
      DDR_SPI = (1<<DD_MISO);
      /* Set "1" MISO port */
      PORT_SPI |=(1<<PO_MISO);
      /* Enable SPI , set clock rate fck/16*/
      SPCR = (1<<SPE)|(1<<SPR0);
      }//SPI_SlaveInit-------------------------------//  
      
      //-------------SPI_SlaveTransmit------------------//  
      void SPI_SlaveTransmit(char cData)
      {
      
      /* Start transmission */
      SPDR = cData;
      /* Wait for transmission complete */
      while(!(SPSR & (1<<SPIF)));
      
      }//SPI_SlaveTransmit-------------------------------//  
      
      //-------------SPI_SlaveReceive------------------//  
      char SPI_SlaveReceive(void)
      {
      char data;
      
      
      /* Start transmission */
      data = SPDR ;
      
      return data;
      }//SPI_SlaveReceive-------------------------------//


      سخت افزار هم ، دو تا پوش باتون ، یکی به PG0 , یکی به PG1 متصل میشه ، با زدن PG0 اسلیو اول مقدار دهی میشه و با زدن PG1 اسلیو دوم.

      دیدگاه

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