static uint8_t CheckTx(void) { RPHY_PacketDesc packet; uint8_t res = ERR_OK; uint8_t TxDataBuffer[RPHY_BUFFER_SIZE]; if (RMSG_GetTxMsg(TxDataBuffer, sizeof(TxDataBuffer))==ERR_OK) { RF1_StopRxTx(); /* CE low */ TX_POWERUP(); /* set up packet structure */ packet.phyData = &TxDataBuffer[0]; packet.flags = RPHY_BUF_FLAGS(packet.phyData); packet.phySize = sizeof(TxDataBuffer); #if NRF24_DYNAMIC_PAYLOAD packet.rxtx = RPHY_BUF_PAYLOAD_START(packet.phyData); #else packet.rxtx = &RPHY_BUF_SIZE(packet.phyData); /* we transmit the data size too */ #endif if (RADIO_isSniffing) { RPHY_SniffPacket(&packet, TRUE); /* sniff outgoing packet */ } #if NRF24_DYNAMIC_PAYLOAD RF1_TxPayload(packet.rxtx, RPHY_BUF_SIZE(packet.phyData)); /* send data, using dynamic payload size */ #else RF1_TxPayload(packet.rxtx, RPHY_PAYLOAD_SIZE); /* send data, using fixed payload size */ #endif return ERR_OK; } else { return ERR_NOTAVAIL; /* no data to send? */ } return res; }
/*lint -save -e970 Disable MISRA rule (6.3) checking. */ int main(void) /*lint -restore Enable MISRA rule (6.3) checking. */ { /* Write your local variable definition here */ /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/ PE_low_level_init(); /*** End of Processor Expert internal initialization. ***/ for (;;) { #if IS_SENDER int i; #endif int cntr; uint8_t status; WAIT1_Waitms(100); /* give device time to power up */ RF_Init(); /* set CE and CSN to initialization value */ RF_WriteRegister(RF24_RF_SETUP, RF24_RF_SETUP_RF_PWR_0 | RF24_RF_SETUP_RF_DR_250); RF_WriteRegister(RF24_RX_PW_P0, PAYLOAD_SIZE); /* number of payload bytes we want to send and receive */ RF_WriteRegister(RF24_RF_CH, CHANNEL_NO); /* set channel */ /* Set RADDR and TADDR as the transmit address since we also enable auto acknowledgment */ RF_WriteRegisterData(RF24_RX_ADDR_P0, (uint8_t*) TADDR, sizeof(TADDR)); RF_WriteRegisterData(RF24_TX_ADDR, (uint8_t*) TADDR, sizeof(TADDR)); /* Enable RX_ADDR_P0 address matching */ RF_WriteRegister(RF24_EN_RXADDR, RF24_EN_RXADDR_ERX_P0); /* enable data pipe 0 */ /* clear interrupt flags */ RF_ResetStatusIRQ( RF24_STATUS_RX_DR | RF24_STATUS_TX_DS | RF24_STATUS_MAX_RT); #if IS_SENDER RF_WriteRegister(RF24_EN_AA, RF24_EN_AA_ENAA_P0); /* enable auto acknowledge. RX_ADDR_P0 needs to be equal to TX_ADDR! */ RF_WriteRegister(RF24_SETUP_RETR, RF24_SETUP_RETR_ARD_750|RF24_SETUP_RETR_ARC_15); /* Important: need 750 us delay between every retry */ TX_POWERUP(); /* Power up in transmitting mode */ CE_ClrVal(); /* Will pulse this later to send data */ #else RX_POWERUP(); /* Power up in receiving mode */ CE_SetVal(); /* Listening for packets */ #endif cntr = 0; for (;;) { #if IS_SENDER cntr++; if (cntr==200) { /* send data every 200 ms */ cntr = 0; for(i=0;i<PAYLOAD_SIZE;i++) { payload[i] = i+1; /* just fill payload with some data */ } LEDR_ClrVal(); RF_TxPayload(payload, sizeof(payload)); /* send data */ } if (cntr>50) { /* not able to send data for 50 ms? */ LEDR_SetVal(); } if (isrFlag) { /* check if we have received an interrupt */ isrFlag = FALSE; /* reset interrupt flag */ status = RF_GetStatus(); if (status&RF24_STATUS_RX_DR) { /* data received interrupt */ RF_ResetStatusIRQ(RF24_STATUS_RX_DR); /* clear bit */ } if (status&RF24_STATUS_TX_DS) { /* data sent interrupt */ cntr = 0; /* reset timeout counter */ LEDR_SetVal(); /* indicate data has been sent */ RF_ResetStatusIRQ(RF24_STATUS_TX_DS); /* clear bit */ } if (status&RF24_STATUS_MAX_RT) { /* retry timeout interrupt */ RF_ResetStatusIRQ(RF24_STATUS_MAX_RT); /* clear bit */ } } WAIT1_Waitms(1); #else if (isrFlag) { /* interrupt? */ isrFlag = FALSE; /* reset interrupt flag */ cntr = 0; /* reset counter */ LEDB_SetVal(); LEDG_NegVal(); /* blink green LED to indicate good communication */ status = RF_GetStatus(); if (status & RF24_STATUS_RX_DR) { /* data received interrupt */ RF_RxPayload(payload, sizeof(payload)); /* will reset RX_DR bit */ RF_ResetStatusIRQ( RF24_STATUS_RX_DR | RF24_STATUS_TX_DS | RF24_STATUS_MAX_RT); /* make sure we reset all flags. Need to have the pipe number too */ } if (status & RF24_STATUS_TX_DS) { /* data sent interrupt */ RF_ResetStatusIRQ(RF24_STATUS_TX_DS); /* clear bit */ } if (status & RF24_STATUS_MAX_RT) { /* retry timeout interrupt */ RF_ResetStatusIRQ(RF24_STATUS_MAX_RT); /* clear bit */ } } else { cntr++; if (cntr > 500) { /* blink every 500 ms if not receiving data */ cntr = 0; /* reset counter */ LEDG_SetVal(); LEDB_NegVal(); /* blink blue to indicate no communication */ } WAIT1_Waitms(1); /* burning some cycles here */ } #endif } } /*** Don't write any code pass this line, or it will be deleted during code generation. ***/ /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/ #ifdef PEX_RTOS_START PEX_RTOS_START(); /* Startup of the selected RTOS. Macro is defined by the RTOS component. */ #endif /*** End of RTOS startup code. ***/ /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/ for(;;){} /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/ } /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/