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; }
/* called to check if we have something in the RX queue. If so, we queue it */ static uint8_t CheckRx(void) { uint8_t res = ERR_OK; uint8_t RxDataBuffer[RPHY_BUFFER_SIZE]; uint8_t status; RPHY_PacketDesc packet; bool hasRxData; hasRxData = FALSE; packet.flags = RPHY_PACKET_FLAGS_NONE; packet.phyData = &RxDataBuffer[0]; packet.phySize = sizeof(RxDataBuffer); #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 status = RF1_GetStatus(); if (status&RF1_STATUS_RX_DR) { /* data received interrupt */ hasRxData = TRUE; #if NRF24_DYNAMIC_PAYLOAD uint8_t payloadSize; (void)RF1_ReadNofRxPayload(&payloadSize); if (payloadSize>32) { /* packet with error? */ RF1_Write(RF1_FLUSH_RX); /* flush old data */ return ERR_FAILED; } else { RF1_RxPayload(packet.rxtx, payloadSize); /* get payload: note that we transmit <size> as payload! */ RPHY_BUF_SIZE(packet.phyData) = payloadSize; } #else RF1_RxPayload(packet.rxtx, RPHY_PAYLOAD_SIZE); /* get payload: note that we transmit <size> as payload! */ #endif RF1_ResetStatusIRQ(RF1_STATUS_RX_DR|RF1_STATUS_TX_DS|RF1_STATUS_MAX_RT); /* make sure we reset all flags. Need to have the pipe number too */ } if (status&RF1_STATUS_TX_DS) { /* data sent interrupt */ RF1_ResetStatusIRQ(RF1_STATUS_TX_DS); /* clear bit */ } if (status&RF1_STATUS_MAX_RT) { /* retry timeout interrupt */ RF1_ResetStatusIRQ(RF1_STATUS_MAX_RT); /* clear bit */ } if (hasRxData) { /* put message into Rx queue */ res = RMSG_QueueRxMsg(packet.phyData, packet.phySize, RPHY_BUF_SIZE(packet.phyData), packet.flags); if (res!=ERR_OK) { if (res==ERR_OVERFLOW) { Err((unsigned char*)"ERR: Rx queue overflow!\r\n"); } else { Err((unsigned char*)"ERR: Rx Queue full?\r\n"); } } } return res; }
/*! * \brief Radio power-on initialization. * \return Error code, ERR_OK if everything is ok. */ uint8_t RADIO_PowerUp(void) { WAIT1_WaitOSms(100); /* the transceiver needs 100 ms power up time */ RF1_Init(); /* set CE and CSN to initialization value */ RF1_WriteRegister(RF1_RF_SETUP, RF1_RF_SETUP_RF_PWR_0|RF1_RF_SETUP_RF_DR_250); #if NRF24_DYNAMIC_PAYLOAD /* enable dynamic payload */ RF1_WriteFeature(RF1_FEATURE_EN_DPL|RF1_FEATURE_EN_ACK_PAY|RF1_FEATURE_EN_DYN_PAY); /* set EN_DPL for dynamic payload */ RF1_EnableDynanicPayloadLength(RF1_DYNPD_DPL_P0); /* set DYNPD register for dynamic payload for pipe0 */ #else RF1_SetStaticPipePayload(0, RPHY_PAYLOAD_SIZE); /* static number of payload bytes we want to send and receive */ #endif (void)RADIO_SetChannel(RADIO_CHANNEL_DEFAULT); /* Set RADDR and TADDR as the transmit address since we also enable auto acknowledgment */ RF1_WriteRegisterData(RF1_RX_ADDR_P0, (uint8_t*)TADDR, sizeof(TADDR)); RF1_WriteRegisterData(RF1_TX_ADDR, (uint8_t*)TADDR, sizeof(TADDR)); /* Enable RX_ADDR_P0 address matching */ RF1_WriteRegister(RF1_EN_RXADDR, RF1_EN_RXADDR_ERX_P0); /* enable data pipe 0 */ /* clear interrupt flags */ RF1_ResetStatusIRQ(RF1_STATUS_RX_DR|RF1_STATUS_TX_DS|RF1_STATUS_MAX_RT); /* rx/tx mode */ RF1_EnableAutoAck(RF1_EN_AA_ENAA_P0); /* enable auto acknowledge on pipe 0. RX_ADDR_P0 needs to be equal to TX_ADDR! */ RF1_WriteRegister(RF1_SETUP_RETR, RF1_SETUP_RETR_ARD_750|RF1_SETUP_RETR_ARC_15); /* Important: need 750 us delay between every retry */ RX_POWERUP(); /* Power up in receiving mode */ RF1_StartRxTx(); /* Listening for packets */ RADIO_AppStatus = RADIO_INITIAL_STATE; /* init Rx descriptor */ radioRx.phyData = &radioRxBuf[0]; radioRx.phySize = sizeof(radioRxBuf); radioRx.rxtx = &RPHY_BUF_SIZE(radioRx.phyData); /* we transmit the size too */ return ERR_OK; }
void RAPP_SniffPacket(RPHY_PacketDesc *packet, bool isTx) { uint8_t buf[32]; const CLS1_StdIOType *io; int i; uint8_t dataSize; RNWK_ShortAddrType addr; io = CLS1_GetStdio(); if (isTx) { CLS1_SendStr((unsigned char*)"Packet Tx ", io->stdOut); } else { CLS1_SendStr((unsigned char*)"Packet Rx ", io->stdOut); } UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)"flags: "); UTIL1_strcatNum16s(buf, sizeof(buf), packet->flags); CLS1_SendStr(buf, io->stdOut); if (packet->flags!=RPHY_PACKET_FLAGS_NONE) { CLS1_SendStr((unsigned char*)"(", io->stdOut); if (packet->flags&RPHY_PACKET_FLAGS_IS_ACK) { CLS1_SendStr((unsigned char*)"IS_ACK,", io->stdOut); } if (packet->flags&RPHY_PACKET_FLAGS_REQ_ACK) { CLS1_SendStr((unsigned char*)"REQ_ACK", io->stdOut); } CLS1_SendStr((unsigned char*)")", io->stdOut); } UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)" size: "); UTIL1_strcatNum16s(buf, sizeof(buf), packet->phySize); CLS1_SendStr(buf, io->stdOut); /* PHY */ CLS1_SendStr((unsigned char*)" PHY data: ", io->stdOut); dataSize = RPHY_BUF_SIZE(packet->phyData); for(i=0; i<dataSize+RPHY_HEADER_SIZE;i++) { buf[0] = '\0'; UTIL1_strcatNum8Hex(buf, sizeof(buf), packet->phyData[i]); UTIL1_strcat(buf, sizeof(buf), (unsigned char*)" "); CLS1_SendStr(buf, io->stdOut); } /* MAC */ UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)" MAC size:"); UTIL1_strcatNum8u(buf, sizeof(buf), dataSize); UTIL1_strcat(buf, sizeof(buf), (unsigned char*)" type:"); UTIL1_strcatNum8Hex(buf, sizeof(buf), RMAC_BUF_TYPE(packet->phyData)); CLS1_SendStr(buf, io->stdOut); RMAC_DecodeType(buf, sizeof(buf), packet); CLS1_SendStr(buf, io->stdOut); UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)" s#:"); UTIL1_strcatNum8Hex(buf, sizeof(buf), RMAC_BUF_SEQN(packet->phyData)); CLS1_SendStr(buf, io->stdOut); /* NWK */ UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)" NWK src:"); addr = RNWK_BUF_GET_SRC_ADDR(packet->phyData); #if RNWK_SHORT_ADDR_SIZE==1 UTIL1_strcatNum8Hex(buf, sizeof(buf), addr); #else UTIL1_strcatNum16Hex(buf, sizeof(buf), addr); #endif UTIL1_strcat(buf, sizeof(buf), (unsigned char*)" dst:"); addr = RNWK_BUF_GET_DST_ADDR(packet->phyData); #if RNWK_SHORT_ADDR_SIZE==1 UTIL1_strcatNum8Hex(buf, sizeof(buf), addr); #else UTIL1_strcatNum16Hex(buf, sizeof(buf), addr); #endif CLS1_SendStr(buf, io->stdOut); /* APP */ if (dataSize>RMAC_HEADER_SIZE+RNWK_HEADER_SIZE) { /* there is application data */ UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)" APP type:"); UTIL1_strcatNum8Hex(buf, sizeof(buf), RAPP_BUF_TYPE(packet->phyData)); UTIL1_strcat(buf, sizeof(buf), (unsigned char*)" size:"); UTIL1_strcatNum8Hex(buf, sizeof(buf), RAPP_BUF_SIZE(packet->phyData)); CLS1_SendStr(buf, io->stdOut); } CLS1_SendStr((unsigned char*)"\r\n", io->stdOut); }