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

SPI, Atmega8: Niewłaściwe działanie połączenia Master-Slave, jak rozwiązać?

nazgulos 17 Wrz 2006 15:04 1002 0
REKLAMA
  • #1 3029024
    nazgulos
    Poziom 1  
    Posty: 1
    Witam!
    Mam 2 atmegi8 na 12MHz kwarcach. Połączone są ze sobą poprzez SPI. Wysyłanie i odpierane zrobione poprzez pooling. Nóżka SS w slave podłączona jest do masy (aktywacja SPI).

    Generalnie chodzi o to, że połączenie nie działa... ale nie zawsze.
    Mam podłączone 2 procesory.
    1) Master wysyła 1 bajt, slave go nie odbiera.
    2) odczekanie około _sekundy_ w pustej pętli (master) a slave ciągle czeka na transfer.
    3) Master wysyła 2 bajt i teraz albo:
    3a) jest błąd, że chcę wysłać 2 bajt a pierwszy jeszcze jest nie wysłany
    3b) zaczyna wysyłać ale nie kończy (nie ustawia flagi końca transferu)

    Kiedy podłącze mastera do programatora to bajty są wysyłane 1 za 2 i wszystko śmiga... Może mam lewego slava, połączenie albo program?

    Kod mastera:
    
    void Init_Master (void)
    {
            char IOReg;
            // set PB4(/SS), PB5(MOSI), PB7(SCK) as output 
            DDRB    = (1<<PB4)|(1<<PB5)|(1<<PB7);
            // enable SPI in Master Mode with SCK = CK/4
            SPCR    = (1<<SPE)|(1<<MSTR);//|(1<<SPR0)|(1<<SPR1);
            IOReg   = SPSR;                 	// clear SPIF bit in SPSR
            IOReg   = SPDR;
    }
    
    int main(void) {
      unsigned char   i, j, z;
      Init_Master();
      z = 100;
      //diody PC4 i PC5, przycisk PC3
      DDRC = ~(1<<PC3);
      for(;;) {	
        PORTC = (1<<PC4);
        for (j=0; j<100; j++)
          for (i=0; i<200; i++) Delay(); //duuuzo czasu
    
        SPDR = z;
        while(!(SPSR & (1<<SPIF))) 
          if (SPSR & (1<<WCOL)) 
            PORTC = ~((1<<PC5)|(1<<PC4)); //zaswieca obie gdy 3a)
        PORTC = (1<<PC5);
        for (j=0; j<100; j++)
          for (i=0; i<200; i++) Delay(); //znow duza przerwa
      }
      return 0;
    }


    Kod Slave:
    
    void Init_Slave (void)
    {
      char IOReg;
      // Set PB6(MISO) as output 
      DDRB    = (1<<PB6);
      // Enable SPI in Slave Mode with SCK = CK/4
      SPCR    = (1<<SPE);//|(1<<SPR0)|(1<<SPR1);
      IOReg   = SPSR;                         // Clear SPIF bit in SPSR
      IOReg   = SPDR;
    }
    
    int main(void)
    {
      unsigned char   i, j, z, y;
      Init_Slave();
      DDRC = ~(1<<PC3);
    
      for(;;){
        PORTC = (1<<PC4);
        while (!(SPSR & (1<<SPIF)))
          if (SPSR & (1<<WCOL))
            PORTC = ~((1<<PC5)|(1<<PC4));
          y = SPDR;
          PORTC = (1<<PC5);
        }
        return 0;
    }
  • REKLAMA
REKLAMA