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 i SPI problem z transmisją

ePeter1234 17 Lut 2009 12:37 911 0
REKLAMA
  • #1 6162364
    ePeter1234
    Poziom 18  
    Wiatm!!!

    Mam problem z przesyłaniem kilki bajtów po SPI. Pierwszy Bajt jest wysyłany prawidłowo. Ale podczas wysyłania drugiego dzieją się dziwne rzeczy. Po powtórnej inicjalizacji SPI, wpisuje do SPDR kolejne dane do wysłania, w tym momenicie kasuje się mi flaga SPIF i tyransmisja się zawiesza. Co z tym jest nie tak??

    
    #include <avr/io.h>
    #include <util/delay.h>
    
    #define DD_MOSI 	PINB3
    #define DD_SCK		PINB5
    #define DD_SS		PINB2
    #define SPI_DDR		PORTB
    
    volatile char vs_data = 0;
    int cs = 0;
    
    void SPI_Init(int cs);
    void SPI_Send(volatile char vs_data);
    char SPI_Read(volatile char vs_data);
    
    int main(void)
    {
    
    DDRD = 0x03;
    PORTD = 0x02;
    
    vs_data = 0x53;
    SPI_Init(0);
    SPI_Send(vs_data);
    
    vs_data = 0xef;
    SPI_Init(0);
    SPI_Send(vs_data);
    
    vs_data = 0x6e;
    SPI_Init(0);
    SPI_Send(vs_data);
    
    vs_data = 0x62;
    SPI_Init(0);
    SPI_Send(vs_data);
    
    vs_data = 0x00;
    SPI_Init(0);
    SPI_Send(vs_data);
    
    vs_data = 0x00;
    SPI_Init(0);
    SPI_Send(vs_data);
    
    vs_data = 0x00;
    SPI_Init(0);
    SPI_Send(vs_data);
    
    vs_data = 0x00;
    SPI_Init(0);
    SPI_Send(vs_data);
    
    
    /*_delay_ms(2000);
    
    vs_data = 0x45;
    SPI_Init(0);
    SPI_Send(vs_data);
    vs_data = 0x78;
    SPI_Init(0);
    SPI_Send(vs_data);
    vs_data = 0x69;
    SPI_Init(0);
    SPI_Send(vs_data);
    vs_data = 0x74;
    SPI_Init(0);
    SPI_Send(vs_data);
    vs_data = 0x00;
    SPI_Init(0);
    SPI_Send(vs_data);
    vs_data = 0x00;
    SPI_Init(0);
    SPI_Send(vs_data);
    */
    return 0;
    }
    
    void SPI_Init(int cs)
    {
    //Set MOSI, SCK and SS output, all others input
    SPI_DDR = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
    //Enable SPI, Master, set clock rate fck/16
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    //Wybór urządzenia odbierającego dane
    PORTD = (1<<cs);
    }
    
    void SPI_Send(volatile char vs_data)
    {
    /* Start transmission */
    SPDR = vs_data;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));
    _delay_us(6);
    PORTD = (0<<cs);
    }
    
    char SPI_Read(volatile char vs_data)
    {
    /* Start transmission */
    SPDR = vs_data;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));
    return SPDR;
    }
    


    Dodano po 28 [minuty]:

    Już sobie z tym poradziłem:) Brakowało magicznej linijki:
    
    SPI_PORT = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
    


    Zamykam temat
  • REKLAMA
REKLAMA