1. Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.
    Dismiss Notice

SPI "freezes"

Discussion in 'AVR' started by thebignoob, Aug 18, 2014.

  1. thebignoob

    thebignoob New Member

    Aug 18, 2014
    I have an issue with spi that freezes. I'm using atmega88 with nrf24l01 but when i try to test spi communication i get stuck.
    I initialize spi based on atmel specifications:

    Code (text):
    DDRB |= (1<<DDB5) | (1<<DDB3) | (1<<DDB2) |(1<<DDB1);
    SPCR |= (1<<SPE)|(1<<MSTR);
    And when I try to test out writing to spi (and print out to terminal ) i get stuck looping... ( i have usart initialized and used without any problems)

    Code (text):
    char spi_rw(unsigned char x)
        SPDR = x;  
        //get stuck in this while loop
        while(!(SPSR & (1<<SPIF)));
        //printing to terminal after get's out of loop but never go out  
        return SPDR;
    I'm trying to read STATUS register:

    Code (text):
    uint8_t get_reg(uint8_t reg)

        CLEARBIT(PORTB, 2);    //CSN low so nrf start listen for command
        spi_rw(R_REGISTER + reg);  
        reg = spi_rw(NOP);
        SETBIT(PORTB, 2);    //CSN IR_High nrf do nothing now
        return reg;  

    I try calling get_reg(STATUS) and passing it to usart to print out resultand I get nowhere since code stuck in while loop.

    P.S. i use this simple functions to set and clear bits

    Code (text):
    #define BIT(x) (1<<(x))
    #define SETBITS(x,y) ((x)|=(y)))
    #define CLEARBITS(x,y) ((x) &=(~(y)))
    #define SETBIT(x,y) SETBITS((x), (BIT((y))))
    #define CLEARBIT(x,y) CLEARBITS((x), (BIT((Y))))

    Thanks in advance, any help would be greatly appreciated. :(

Share This Page