#include #include #include #include #include #include "led.h" // TODO: for debugging #include "spi.h" #include "nrf24l01.h" #include "nrf24l01_definitions.h" /* TODO * - Send functions * - Interrupt handling for Send */ extern volatile bool nrfInterruptRaised; void Print_Register_Contents(uint8_t address); void Send_TX_Flush_Command(void); /* Startup and initial configuration of the NRF24L01 */ void Initialize_NRF24L01(void) { CONFIG_REGISTER configRegisterContents = {.byte = 0x0}; /* Configure the AVR pins for the nrf24l01 */ Set_NRF24L01_Pins(); /* Wait more than 10.3 ms to make sure the nrf24l01 is running */ _delay_ms(11); /* Write the PWR_UP bit of the CONFIG register (EN_CRC is also set) */ configRegisterContents.bits.EN_CRC = 0x1; configRegisterContents.bits.PWR_UP = 0x1; Write_NRF_Register(CONFIG_ADDRESS, configRegisterContents.byte); /* Wait more than 1.5 ms for the change to take effect */ _delay_ms(2); /* The NRF24L01 is now in the mode Standby-I */ } void Set_NRF24L01_Pins(void) { /* Set up the NRF24L01 */ NRF_CE_DDR |= (1 << NRF_CE_PIN); NRF_CSN_DDR |= (1 << NRF_CSN_PIN); /* Set the chip select pin to not selected */ NRF_CSN_PORT |= (1 << NRF_CSN_PIN); /* Ensure that the CE pin is set to 0*/ NRF_CE_PORT &= ~(1 << NRF_CE_PIN); /* Set the interrupt pin */ /* TODO: PCINT21 -> PCINT2 */ NRF_IRQ_DDR &= ~(1 << NRF_IRQ_PIN); // Set the pin as input NRF_IRQ_PORT |= (1 << NRF_IRQ_PORT); // Enable the pullup for the pin } void Configure_Transmission(uint8_t moduleId) { FEATURE_REGISTER featureRegisterContents = {.byte = 0x0}; DYNPD_REGISTER dyndpRegisterContents = {.byte = 0x0}; SETUP_RETR_REGISTER setupRetrRegisterContents = {.byte = 0x0}; uint8_t txAddress[5] = {0xB3, 0xB3, 0xB3, 0xB3, 0x00}; uint8_t rx0Address[5] = {0xB3, 0xB3, 0xB3, 0xB3, 0x20}; /* * - Length of CRC (CRCO in CONFIG) * - Enable auto acknowledgment (EN_AA) * -> Register already set correctly after reset * - Enable data pipes (EN_RXADDR)? * -> Two pipes are already enabled on reset * - Set up address width (SETUP_AW) * -> 3 bytes * - Automatic Retransmission (SETUP_RETR) * -> ARD = 0b0000 * -> 3 retransmits -> ARC = 0b0011 * -> Register already set correctly after reset * - RF Channel (RF_CH) * -> RF_CH = 0b1010000 * - RF Setup (RF_SETUP) * -> first use reset values, can be fine tuned later * - Enable dynamic payload length (DYNPD) -> command activate + 0x73, then set bits in FEATURE? */ /* Set the address width to 3 bytes */ //Write_NRF_Register(0x03, 0x1); /* Set the frequency to 1450 MHz */ Write_NRF_Register(RF_CH_ADDRESS, 0x32); /* Enable dynamic payload length */ Send_Activate_Command(); featureRegisterContents.bits.EN_DPL = 1; // enable dynamic payload length Write_NRF_Register(FEATURE_ADDRESS, featureRegisterContents.byte); /* */ setupRetrRegisterContents.bits.ARC = 0x3; setupRetrRegisterContents.bits.ARD = 0xF; Write_NRF_Register(SETUP_RETR_ADDRESS, setupRetrRegisterContents.byte); /* set dynamic payload length for all data pipes */ // TODO: only pipe 0 is currently in use -> don't set the other values dyndpRegisterContents.bits.DPL_P0 = 1; dyndpRegisterContents.bits.DPL_P1 = 1; dyndpRegisterContents.bits.DPL_P2 = 1; dyndpRegisterContents.bits.DPL_P3 = 1; dyndpRegisterContents.bits.DPL_P4 = 1; dyndpRegisterContents.bits.DPL_P5 = 1; Write_NRF_Register(DYNPD_ADDRESS, dyndpRegisterContents.byte); /* Set the TX address */ Set_TX_Address(txAddress, MAX_ADDRESS_LENGTH); rx0Address[4] = moduleId; // The last byte of the address corresponds to the Id set by the pin programming Set_RX_P0_Address(rx0Address, MAX_ADDRESS_LENGTH); PCMSK2 |= (1< 32) || (length == 0)) { return; } PCICR |= (1<