📄 mac_support.c
字号:
SPI_DISABLE();
if (disableInterrupts) ENABLE_GLOBAL_INT();
address += 8;
} while (count);
}
} // msupWriteRam
//-------------------------------------------------------------------------------------------------------
// void msupReadFifo(void *pData, UINT8 count)
//
// DESCRIPTION:
// Reads data from the CC2420 RX FIFO
//
// PARAMETERS:
// void *pData
// Pointer to data to be read
// UNIT8 count
// Number of bytes to be read
//-------------------------------------------------------------------------------------------------------
void msupReadFifo(BYTE*pData, UINT8 count) {///
DISABLE_GLOBAL_INT();
SPI_ENABLE();
FASTSPI_RX_ADDR(CC2420_RXFIFO);
if (count) {
do {
/// FASTSPI_RX(*((BYTE*) pData));
FASTSPI_RX(* pData);///
pData++;
} while (--count);
}
SPI_DISABLE();
ENABLE_GLOBAL_INT();
} // msupReadFifo
//-------------------------------------------------------------------------------------------------------
// void msupWriteFifo(void *pData, UINT8 count)
//
// DESCRIPTION:
// Write data to the CC2420 TX FIFO
//
// PARAMETERS:
// void *pData
// Pointer to data to be written
// UNIT8 count
// Number of bytes to be written
//-------------------------------------------------------------------------------------------------------
void msupWriteFifo(BYTE *pData, UINT8 count) {///
if (count) {
do {
DISABLE_GLOBAL_INT();
SPI_ENABLE();
FASTSPI_TX_ADDR(CC2420_TXFIFO);
do {
/// FASTSPI_TX(*((BYTE*) pData));
FASTSPI_TX(*pData);///
pData++;
} while ((--count) & 0x07);
SPI_DISABLE();
ENABLE_GLOBAL_INT();
} while (count);
}
} // msupWriteFifo
/*******************************************************************************************************
*******************************************************************************************************
************************** SIMPLE CALCULATIONS **************************
*******************************************************************************************************
*******************************************************************************************************/
//-------------------------------------------------------------------------------------------------------
// UINT32 msupCalcCapDuration(void)
//
// DESCRIPTION:
// Calculates the number off backoff slots in the superframe, minus the CFP. Does not subtract the
// beacon transmission time.
//
// RETURN VALUE:
// UINT32
// See above
//-------------------------------------------------------------------------------------------------------
UINT32 msupCalcCapDuration(void) {
return ((UINT32) (aBaseSlotDuration / aUnitBackoffPeriod) * (UINT32) (mbcnInfo.lastSfSpec.finalCap + (UINT32) 1)) << (UINT32) mpib.macSuperframeOrder;
} // msupCalcCapDuration
//-------------------------------------------------------------------------------------------------------
// UINT32 msupCalcSuperframeDuration(void)
//
// DESCRIPTION:
// Calculates the number off backoff slots in the superframe. Does not subtract the beacon
// transmission time.
//
// RETURN VALUE:
// UINT32
// See above
//-------------------------------------------------------------------------------------------------------
UINT32 msupCalcSuperframeDuration(void) {
return ((UINT32) (aBaseSlotDuration / aUnitBackoffPeriod) * (UINT32) 16) << (UINT32) mpib.macSuperframeOrder;
} // msupCalcCapDuration
//-------------------------------------------------------------------------------------------------------
// UINT32 msupCalcBeaconInterval(void)
//
// DESCRIPTION:
// Calculates the number off backoff slots in the beacon interval.
//
// RETURN VALUE:
// UINT32
// See above
//-------------------------------------------------------------------------------------------------------
UINT32 msupCalcBeaconInterval(void) {
return (UINT32) (aBaseSuperframeDuration / aUnitBackoffPeriod) << (UINT32) mpib.macBeaconOrder;
} // msupCalcBeaconInterval
//-------------------------------------------------------------------------------------------------------
// MAC_ENUM msupTransmitPanConflict(BYTE coordAddrMode, WORD coordPANId, ADDRESS *pCoordAddress, BOOL ...)
//
// DESCRIPTION:
// Transmits a PAN ID conflict notification message.
//
// ARGUMENTS:
// BYTE coordAddrMode
// The address mode used by the coordinator
// WORD coordPANId
// The PAN ID used by the coordinator
// ADDRESS *pCoordAddress
// A pointer to the coordinator address (taken from the MAC PIB, short or extended)
// BOOL securityEnable
// TBD...
//
// RETURN VALUE:
// MAC_ENUM
// SUCCESS No error (the transmission was initiated)
// RESOURCE_SHORTAGE TX packet or task not available
// UNAVAILABLE_KEY No key
// FAILED_SECURITY_CHECK Failed security check
//-------------------------------------------------------------------------------------------------------
MAC_ENUM msupTransmitPanConflict(BYTE coordAddrMode, WORD coordPANId, ADDRESS *pCoordAddress, BOOL securityEnable) {
MAC_TX_PACKET *pPacket;
UINT8 taskNumber;
BYTE txOptions = 0;
UINT8 temp;
BYTE *pPayload;
// Try to reserve a packet
pPacket = mtxpReservePacket();
if (!pPacket) return RESOURCE_SHORTAGE;
// Try to reserve a transmission task
taskNumber = mschReserveTask();
if (taskNumber == NO_TASK) {
mtxpReleasePacket(pPacket);
return RESOURCE_SHORTAGE;
}
#if MAC_OPT_SECURITY
if (securityEnable) {
txOptions |= TX_OPT_SECURITY_ENABLE;
}
#endif
// TX mode
pPacket->txMode = MTX_MODE_USE_CSMACA_BM;
pPacket->retriesLeft = aMaxFrameRetries;
// Generate the packet header (and find security material, if enabled)
if (mpib.macShortAddress >= 0xFFFE) {
msupPrepareHeader(pPacket, FT_MAC_COMMAND, (coordAddrMode << 2) | SRC_ADDR_EXT, mpib.macPANId, (ADDRESS*) &aExtendedAddress, coordPANId, pCoordAddress, txOptions);
} else {
msupPrepareHeader(pPacket, FT_MAC_COMMAND, (coordAddrMode << 2) | SRC_ADDR_SHORT, mpib.macPANId, (ADDRESS*) &mpib.macShortAddress, coordPANId, pCoordAddress, txOptions);
}
// Store the command type
pPacket->mc.commandType = CMD_PAN_ID_CONFLICT_NOTIFICATION;///
// Command frame identifier
pPayload = pPacket->pPayload;
*(pPayload++) = CMD_PAN_ID_CONFLICT_NOTIFICATION;
#if MAC_OPT_SECURITY
// #bytes in frame counter + key sequence counter (0 or 5)
temp = msecProcessSecurityCounters(pPacket, pPayload);
// In case of frame counter overflow or missing key
// Generate error with FAILED_SECURITY_CHECK or UNAVAILABLE_KEY
if (pPacket->securitySuite >= 8) {
mtxpReleasePacket(pPacket);
mschReleaseTask(taskNumber);
return pPacket->securitySuite;
}
// Increment payload pointer when counters inserted
pPayload += temp;
// Include command payload length and optional MIC (integrity code) length
temp += CMD_DATA_REQUEST_PAYLOAD_LENGTH + pPacket->securitySetup.micLength;
#else
// No security material included, set MAC payload length
temp = CMD_PAN_ID_CONFLICT_NOTIFICATION_PAYLOAD_LENGTH;
#endif
// Set the packet length
pPacket->length = pPacket->headerLength + temp + MAC_FCS_LENGTH;
// No further packet payload
// Calculate the packet duration (including FCS)
pPacket->duration = msupCalcPacketDuration(pPacket->length, pPacket->txOptions);
// Initiate the transmission
mschAddTask(taskNumber, MAC_TASK_PRI_LOW, mtxScheduleTransmission, (WORD) pPacket);
return SUCCESS;
} // mipTransmitDataRequest
/*******************************************************************************************************
* Revision history:
*
* $Log: mac_support.c,v $
* Revision 1.15 2005/02/04 13:16:06 thl
* Fixed problem with oncounter and CC2420 when disabling RX
*
* Revision 1.14 2005/02/02 15:08:17 thl
* Added functionality for pan id conflict according to IEEE802.15.4-2003
*
* Revision 1.13 2005/01/05 10:45:29 thl
* Added full suport for ppib.phyTransmitPower, will also now adjust the transmit power
* of the radio chip. to include set compile switch MAC_OPT_TRANSMIT_POWER=1 in
* make file.
*
* Revision 1.12 2004/11/10 09:33:15 thl
* Fixed a number of bugs according to: MAC software check lists.xls
*
* Revision 1.11 2004/08/13 13:04:47 jol
* CC2420 MAC Release v0.7
*
*
*******************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -