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

ATmega168 Atmega8 - komunikacja SPI

elakota 13 Mar 2009 08:47 2336 3
  • #1 6275136
    elakota
    Poziom 13  
    Witam,

    Pierwszy raz próbuję komunikować po SPI atmega8 z atmega168 i mam z tym problem.
    Mega168 jest masterem, w jego programie wywołuje procedurę SPI_MasterInit() a następnie co sekundę SPI_MasterTransmit(char cData).
    I tu pojawia się pierwszy problem: podglądając oscyloskopem statusy linii mam przebieg zegara nie na SCK ale na SS, na MOSI stan zmienia sie cyklicznie 0,1 ale ze znacznie mniejsza czestotliwoscia niż przebieg zegara tak jak by to był sygnał SS. Stan SCK i MISO to zawsze stan niski.

    W atemega8 wywołuje procedurę SPI_SlaveInit() i nastepnie w procedurze przerwania interrupt [SPI_STC] void spi_isr() zmieniam wartosc zmiennej spichar by wykryć czy w ogóle przerwanie miało miejsce - czy coś zostało odebrane ale przerwanie bez wzgledu czy układy połaczone sa standardowo: MISO-MISO, MOSI-MOSI,SCK-SCK, SS-SS czy też tak jak ja interpretuje je po przebiegach, to procedura przerwania nie jest wykonywana.

    Proszę o pomoc w analizie co robie źle. Sieć przeszukałem ale nie znalazłem rozwiązania mojego problemu.


    
    
    #define	SPIF	7
    #define	SPIE	7    
    #define	SPE		6          
    #define	MSTR	4
    #define	SPR0	0          
    
    
    #define DIR_MOSI	DDRB.3
    #define DIR_MISO	DDRB.4
    #define DIR_SCK		DDRB.5
    #define DIR_SS		DDRB.2
    
    #define d_INPUT	0
    #define d_OUTPUT 1
    #define d_I_NO_PULLUP 0
    #define d_I_PULLUP 1
    #define d_Q_INIT0 0
    #define d_Q_INIT1 1    
    
    
    void SPI_MasterInit()
    {  
    	DIR_MOSI = d_OUTPUT;					// Set MOSI and SCK output, all others input
    	DIR_MISO = d_INPUT;
    	DIR_SCK = d_OUTPUT; 
    	DIR_SS = d_OUTPUT;
    	SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);	// Enable SPI, Master, set clock rate fck/16 
    }
    
    
    
    void SPI_SlaveInit()
    {		    
    	DIR_MOSI = d_INPUT;				// Set MISO output, all others input    
    	DIR_MISO = d_OUTPUT;
    	DIR_SCK = d_INPUT; 
    	DIR_SS = d_INPUT;	
    	SPCR = (1<<SPE);				// Enable SPI 	
    }
    
    
    
    void SPI_MasterTransmit(char cData)
    {
    	SPDR = cData;				// Start transmission 
    	while(!(SPSR & (1<<SPIF)));		// Wait for transmission complete 
    }
    
    
    
    char SPI_SlaveReceive()
    {
    	while(!(SPSR & (1<<SPIF)));		// Wait for reception complete
    	return SPDR;
    }                      
    
    
    
    interrupt [SPI_STC] void spi_isr()
    {                                   
    
    	spichar = 88; //SPI_SlaveReceive();
    } 
    
  • #2 6275278
    mm_pawel
    Poziom 11  
    Ustaw rejestr DDRB w całości, tak jak to robisz dla SPCR.

    A jak zacznie działać, to poszukaj jak się ustawia pojedyńcze bity w porcie.

    Pozdrawiam
    Paweł
  • #3 6278574
    elakota
    Poziom 13  
    Nie ma różnicy konfiguracji całego rejestru DDRB czy też bit po bicie. Może mój sposób jest w zapisie mniej "profesjonalny" ale za to składając program z klocków mam pewność że nie nadpisuje ustawień z innych procedur.

    Problem z Masterem wydaje mi się rozwiązany. Po dopisaniu do kodu PORT_SS = 1; wszystko zaczęło pracować poprawnie.

    Jutro walczę dalej ze slavem.


    
    void SPI_MasterInit()
    {  
    	DIR_MOSI = d_OUTPUT;	// Set MOSI and SCK output, all others input
    	DIR_MISO = d_INPUT;
    	DIR_SCK = d_OUTPUT; 
    	DIR_SS = d_OUTPUT;    
    	PORT_SS = 1;
    	SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);	// Enable SPI, Master, set clock rate fck/16 
    }
    
  • #4 6288625
    mm_pawel
    Poziom 11  
    Oczywiście, masz rację. Można ustawiać całe porty razem lub każdy bit po kolei.
    Ja tylko miałem wątpliwości (i nadal mam), czy kompilator poprawnie rozumie ten zapis:
    Cytat:

    #define DIR_MOSI DDRB.3
    #define d_OUTPUT 1

    void SPI_MasterInit()
    {
    DIR_MOSI = d_OUTPUT;
    }

    i wygeneruje rozkazy do ustawiania odpowiedniego bitu w porcie.

    Pozdrawiam
REKLAMA