logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMega8][C] Komunikacja SPI Master->Slave

Prezes87 08 Kwi 2011 00:48 3454 2
REKLAMA
  • #1 9373868
    Prezes87
    Poziom 11  
    Witam!
    Chciałem połączyć poprzez SPI ATmegę8 i AtMegę16 gdzie 8 jest masterem a 16 slavem. Jednak 16 nie wykazuję, żeby dostawała jakiekolwiek dane. Poniżej zamieszczam kod. Procki mają połączone ze sobą MISO, MOSI, SCK i SS.

    Master[ATMega8]:
    
    #define F_CPU            14318000ul
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    
    void SPI_MasterInit(void)
    {
    /* Set MOSI, SCK and SS output, all others input */
    DDRB = (1<<DDB3)|(1<<DDB5)|(1<<DDB2);
    /* Enable SPI, Master, set clock rate fck/16 */
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    }
    void SPI_MasterTransmit(char cData)
    {
    /* Start transmission */
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)))
    ;
    }
    
    void main()
    {	
    	SPI_MasterInit();
    	
    	while(1)
    	{
    		_delay_ms(1000);
    		PORTB &= ~(1<<PB2);
    		SPI_MasterTransmit('Y');
    		PORTB |= (1<<PB2);
    	}
    }
    


    Slave[ATMega16]

    
    #define F_CPU            1000000ul
    #include <avr/io.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include <string.h>
    #include <avr/interrupt.h> 
    #include "lcd.h"
    
    
    void SPI_SlaveInit(void)
    {
    	/* Set MISO output, all others input */
    	DDRB = (1<<DDB6);
    	/* Enable SPI */
    	SPCR = (1<<SPE)| (1<<SPIE);
    }
    char SPI_SlaveReceive(void)
    {
    	/* Wait for reception complete */
    	PORTC = 0x01;
    	while(!(SPSR & (1<<SPIF)));
    	/* Return data register */
    	PORTC = 0x00;
    	return SPDR;
    }
    
    int main(void){
    DDRA = 0xff;
    DDRD = 0X07;
    PORTA = 0x00;
    DDRC = 0x01;
    PORTC = 0x00;
    
    _delay_ms(200);
    
    sei();
    initLCD();
    clearLCD();
    
    SPI_SlaveInit();
    
       while(1)
       {
    	
       }
    
    return 0;
    }
    
    ISR(SPI_STC_vect)
    
    {
    	putLCD(SPI_SlaveReceive());
    }
    
  • REKLAMA
  • #2 9378277
    asembler
    Poziom 32  
    Schemat vysie przydał żeby nie musiec skakac po PDF-ach

    Dodano po 3 [minuty]:

    A czy dostajesz "echo" spowrotem do atm8.?
  • #3 10654822
    dominon
    Poziom 18  
    W jaki sposób masz podłączone linie SS? Dla pewności podłącz SS master'a przez rezystor do zasilania a slave'a ściągnij ja do masy.

    Schemat rzeczywiście był by przydatny.
REKLAMA