📄 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 <include.h>
//-------------------------------------------------------------------------------------------------------
// 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -