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

Komunikacja SPI, konfiguracja Mastera

raptor37 13 Maj 2009 17:39 1762 5
REKLAMA
  • #1 6525740
    raptor37
    Poziom 12  
    Witam,
    Próbuje połączyć dwa uP atmega8 ze sobą poprzez SPI. Na układ slave wgrałem soft
    i działa jedynie gdy układ master skonfigurowany jest w ten sposób:
    
    void SPI_init(void){
    	DDRB = ((1<<DDB3)|(1<<DDB5)|(1<<DDB0)); //spi pins on port b MOSI SCK,SS outputs
    	SPCR = ((1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)|(1<<CPHA));  // SPI enable, Master, f/16
    
    }
    
    int SPI_manipulator(int slij){
    	SPDR = slij;
    	while(!(SPSR & (1<<SPIF))) ;
    } 
    
    int main()
    {
    	int wyslij=137;
    	
    	while(1)
    	{
    		SPI_init();
    		SPI_manipulator(wyslij);
    		SPDR = 0;
    	}
    } 
     


    kod ten zaczerpnąłem z jakiejś stronki (chciałem poprostu sprawdzić w praktyce jak ta komunikacja przebiega) nie doszukałem się w tym kodzie jednak ustawienia wyprowadzenia SS w stan wysoki w spoczynku i niski przy komunikacji. Sprawdziłem miernikiem i jest cały czas stan niski. Chciałbym aby po komunikacji pojawił się stan wysoki więc dodałem:

    
    void SPI_init(void){
    	DDRB = ((1<<DDB3)|(1<<DDB5)|(1<<DDB0)); //spi pins on port b MOSI SCK,SS outputs
    	SPCR = ((1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)|(1<<CPHA));  // SPI enable, Master, f/16
    
    }
    
    int SPI_manipulator(int slij){
    	PORTB &= ~_BV(0);
    	SPDR = slij;
    	while(!(SPSR & (1<<SPIF))) ;
    	PORTB |= _BV(0);
    } 
    
    int main()
    {
    	int wyslij=137;
    	
    	while(1)
    	{
    		SPI_init();
    		SPI_manipulator(wyslij);
    		SPDR = 0;
    	}
    } 
    


    No i teraz wyprowadzenie SS zmienia swój stan ale układ slave nie odbiera żadnej danej. Co zrobiłem źle?
  • REKLAMA
  • REKLAMA
  • #3 6525948
    kirby
    Poziom 10  
    Bity CPOL i CPHA (polaryzacja i faza zegara) w rejestrze SPCR muszą mieć takie same ustawienie zarówno w układnie master jak i slave.

    Wyrzuć inicjalizację SPI przed pętlę while() i w funkcji inicjalizującej (master i slave) ustawiającej bity skorzystaj z zapisu:

    DDRB |= ...
    
    SPCR |= ...
  • REKLAMA
  • #4 6526000
    BoskiDialer
    Poziom 34  
    kirby: Z pierwszą częścią (bity cpol i cpha) się zgodzę, z wyrzuceniem inicjalizacji również, ale z ustawianiem bitów przez |= już nie: to jest inicjalizacja, nie chodzi tylko o ustawienie wybranych bitów, ale o skasowanie pozostałych - do tego doskonale nadaje się proste "=". Dodatkowo kod jest prostszy - nie trzeba ładować poprzedniej wartości do rejestru. Ewentualnie zrozumiem "|=" przy DDRB, ale przy SPCR już nie.

    Dodano po 20 [minuty]:

    Swoją drogą: jaki jest cel tej instrukcji:
    Przecież to tylko spowoduje wysłanie dodatkowego bajtu (równego 0), po którym brak jest pętli oczekiwania na koniec transmisji, tak więc następne wywołanie SPI_manipulator może nie wysłać bajtu poprawnie.
  • REKLAMA
  • #5 6526132
    kirby
    Poziom 10  
    Cytat:
    to jest inicjalizacja, nie chodzi tylko o ustawienie wybranych bitów, ale o skasowanie pozostałych - do tego doskonale nadaje się proste "=". Dodatkowo kod jest prostszy - nie trzeba ładować poprzedniej wartości do rejestru. Ewentualnie zrozumiem "|=" przy DDRB, ale przy SPCR już nie.


    Masz rację. Zasugerowałem się tym, że wartości początkowe bitów w rej. SPCR wynoszą "0".
  • #6 6526193
    raptor37
    Poziom 12  
    W układzie slave ustawiłem bity tak samo jak w masterze(oczywiście poza bitem MSTR) inicjacje wyrzuciłem przed pętle i to samo. Po skasowaniu tych poleceń
    PORTB &= ~_BV(0); i PORTB |= _BV(0);
    układ działa normalnie jednak cały czas SS jest w stanie niskim.

    Poleceniem SPDR=0 chciałem wyczyścić rejestr SPDR skasowałem je również nic nie dało;/.

    Co ciekawe gdy do procedury inicjującej dodam jeszcze jeden pin np. DDRD=(1<<DDD4); to oba są w stanie niskim. Czyli master włącza jednocześnie dwa układy slave odpowienio z SS na pinie(PB0 i PD4).
REKLAMA