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
NRF24L01.C
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
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