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

nRF24L01 - wysłanie danych w eter

czopas 12 Sty 2011 22:06 2112 0
REKLAMA
  • #1 8997669
    czopas
    Poziom 12  
    Witam serdecznie szanownych kolegów i koleżanki.

    Mam mały problem z modułem nRF24L01 a dokładniej z samą procedurą wysłania czegokolwiek w eter. W chwili obecnej interesuje mnie samo wysłanie jednego bajtu danych i oczekiwanie na ustawienie bitu MAX_RT określającego wykonanie maksymalnej ilości prób retransmisji danych po których nie otrzymano zgłoszenia ACK z drugiego modułu. Komunikacja z modułem odbywa się poprzez SPI. Sama komunikacja z modułem działa prawidłowo, tzn. mogę odczytywać zawartości rejestrów a także je zapisywać. Dla jasności przedstawię funkcje jakie używam do komunikacji:

    SPI.C
    void spi_init(void){
    	    SPI_DDR |= (1<<SPI_MOSI) | (1<<SPI_SCK) | (1<<SPI_SS);
    	    SPI_DDR &= ~(1<<SPI_MISO);
    	    SPCR |= (1<<SPE) | (1<<MSTR) | (1<<SPR0);
    }/* spi_init */
    
    uint8_t spi_read_byte(void){
    	spi_write_byte(0xFF);
    	return SPDR;
    }/* spi_read_byte */
    
    void spi_write_byte(uint8_t byte){
        SPDR = byte;
        while((SPSR & (1<<SPIF))==0);
    }/* spi_write_byte */


    NRF24L01.C
    void nrf24l01_init(void){
    	spi_init();
    
    	NRF24L01_DDR |= (1<<NRF24L01_CE) | (1<<NRF24L01_CSN);
        NRF24L01_PORT |= (1<<NRF24L01_CSN);
        NRF24L01_PORT &= ~(1<<NRF24L01_CE);
    
        _delay_ms(10.3);
    }/* nrf24l01_init */
    
    void nrf24l01_read_register(uint8_t reg, uint8_t *data_out, uint8_t lenght){
    	uint8_t i;
    
    	NRF24L01_CSN_LOW;
    
    	spi_write_byte(0x1F & reg);
    
    	for(i=0; i<lenght; i++){
    		*data_out++ = spi_read_byte();
    	}
    
    	NRF24L01_CSN_HIGH;
    }/* nrf24l01_read_register */
    
    void nrf24l01_write_register(uint8_t reg, uint8_t byte){
    	NRF24L01_CSN_LOW;
    
    	spi_write_byte(reg | 0x20);
    	spi_write_byte(byte);
    
    	NRF24L01_CSN_HIGH;
    }/* nrf24l01_write_register */
    
    void nrf24l01_send_data(uint8_t data){
    	nrf24l01_write_register(CONFIG, (1<<PWR_UP) | (1<<EN_CRC));	// przejście z trybu Power Down do Stanby-I
    
    	_delay_ms(1.5);
    
    	nrf24l01_write_register(RX_PW_P0, PAYLOAD_LENGHT);
    
    	spi_write_byte(FLUSH_TX);
    	spi_write_byte(FLUSH_RX);
    
    	spi_write_byte(W_TX_PAYLOAD);
    	spi_write_byte(data);
    
    	NRF24L01_CE_HIGH;
    	_delay_us(50);
    	NRF24L01_CE_LOW;
    
    }/* nrf24l01_send_data */


    Plików nagłówkowych nie dołączam żeby nie zaśmiecać posta. Jest w nich oczywiście określona każda z funkcji oraz definicje preprocesora odnośnie nazw rejestrów (widać to w kodzie, np. MAX_RT, FLUSH_TX itp.).

    W programie głównym korzystam z funkcji nrf24l01_send_data po której w pętli while() oczekuje sprawdzając cały czas rejestr statusu na ustawienie bitu MAX_RT, który będzie oznaczał że wysłanie się nie powiodło ze względu na przekroczoną liczbę retransmisji pakietu.

    Domyślam się że problem leży gdzieś w funkcji nrf24l01_send_data. Przerwanie generowane przez nRF24L01 pojawia się zaraz po wpisie do rejestru CONFIG danych PWR_UP oraz EN_CRC. Jak wiadomo tutaj takie przerwanie występować nie powinno.

    Zna ktoś może przyczynę takiego stanu rzeczy? Z góry dziękuję za jakąkolwiek pomoc :)
  • REKLAMA
REKLAMA