www.pudn.com > CC2420_TRX.rar > basic_rf_send_packet.c
/******************************************************************************************************* * * * ********** * * ************ * * *** *** * * *** +++ *** * * *** + + *** * * *** + CHIPCON CC2420 BASIC RF LIBRARY * * *** + + *** Packet transmission * * *** +++ *** * * *** *** * * ************ * * ********** * * * ******************************************************************************************************* * This file contains packet transmission function. * * * * More information can be found in basic_rf.h * ******************************************************************************************************* * Compiler: AVR-GCC * * Target platform: CC2420DB, CC2420 + any MCU with very few modifications required * ******************************************************************************************************* * Revision history: * * $Log: basic_rf_send_packet.c,v $ * Revision 1.4 2004/07/26 11:28:10 mbr * Modified RXFIFO flushing by strobing CC2420_SFLUSHRX * * Revision 1.3 2004/03/30 14:59:22 mbr * Release for web * * * *******************************************************************************************************/ #include//------------------------------------------------------------------------------------------------------- // BYTE basicRfSendPacket(BASIC_RF_TX_INFO *pRTI) // // DESCRIPTION: // Transmits a packet using the IEEE 802.15.4 MAC data packet format with short addresses. CCA is // measured only once before backet transmission (not compliant with 802.15.4 CSMA-CA). // The function returns: // - When pRTI->ackRequest is FALSE: After the transmission has begun (SFD gone high) // - When pRTI->ackRequest is TRUE: After the acknowledgment has been received/declared missing. // The acknowledgment is received through the FIFOP interrupt. // // ARGUMENTS: // BASIC_RF_TX_INFO *pRTI // The transmission structure, which contains all relevant info about the packet. // // RETURN VALUE: // BOOL // Successful transmission (acknowledgment received) //------------------------------------------------------------------------------------------------------- BOOL basicRfSendPacket(BASIC_RF_TX_INFO *pRTI) { WORD frameControlField; UINT8 packetLength; BOOL success; BYTE spiStatusByte; // Wait until the transceiver is idle while (FIFOP_IS_1 || SFD_IS_1); // Turn off global interrupts to avoid interference on the SPI interface DISABLE_GLOBAL_INT(); // Flush the TX FIFO just in case... FASTSPI_STROBE(CC2420_SFLUSHTX); // Turn on RX if necessary if (!rfSettings.receiveOn) FASTSPI_STROBE(CC2420_SRXON); // Wait for the RSSI value to become valid do { FASTSPI_UPD_STATUS(spiStatusByte); } while (!(spiStatusByte & BM(CC2420_RSSI_VALID))); // TX begins after the CCA check has passed do { FASTSPI_STROBE(CC2420_STXONCCA); FASTSPI_UPD_STATUS(spiStatusByte); halWait(100); } while (!(spiStatusByte & BM(CC2420_TX_ACTIVE))); // Write the packet to the TX FIFO (the FCS is appended automatically when AUTOCRC is enabled) packetLength = pRTI->length + BASIC_RF_PACKET_OVERHEAD_SIZE; FASTSPI_WRITE_FIFO((BYTE*)&packetLength, 1); // Packet length frameControlField = pRTI->ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK; FASTSPI_WRITE_FIFO((BYTE*) &frameControlField, 2); // Frame control field FASTSPI_WRITE_FIFO((BYTE*) &rfSettings.txSeqNumber, 1); // Sequence number FASTSPI_WRITE_FIFO((BYTE*) &rfSettings.panId, 2); // Dest. PAN ID FASTSPI_WRITE_FIFO((BYTE*) &pRTI->destAddr, 2); // Dest. address FASTSPI_WRITE_FIFO((BYTE*) &rfSettings.myAddr, 2); // Source address FASTSPI_WRITE_FIFO((BYTE*) pRTI->pPayload, pRTI->length); // Payload // Wait for the transmission to begin before exiting (makes sure that this function cannot be called // a second time, and thereby cancelling the first transmission (observe the FIFOP + SFD test above). while (!SFD_IS_1); success = TRUE; // Turn interrupts back on ENABLE_GLOBAL_INT(); // Wait for the acknowledge to be received, if any if (pRTI->ackRequest) { rfSettings.ackReceived = FALSE; // Wait for the SFD to go low again while (SFD_IS_1); // We'll enter RX automatically, so just wait until we can be sure that the ack reception should have finished // The timeout consists of a 12-symbol turnaround time, the ack packet duration, and a small margin halWait((12 * BASIC_RF_SYMBOL_DURATION) + (BASIC_RF_ACK_DURATION) + (2 * BASIC_RF_SYMBOL_DURATION) + 100); // If an acknowledgment has been received (by the FIFOP interrupt), the ackReceived flag should be set success = rfSettings.ackReceived; } // Turn off the receiver if it should not continue to be enabled DISABLE_GLOBAL_INT(); if (!rfSettings.receiveOn) FASTSPI_STROBE(CC2420_SRFOFF); ENABLE_GLOBAL_INT(); // Increment the sequence number, and return the result rfSettings.txSeqNumber++; return success; } // halRfSendPacket