/***********************************************************************************
 * @fn      CC2520_REGWR24
 *
 * @brief   Write three register bytes
 *
 * @param  uint8 addr
 *         uint32 value
 *
 * @return  none
 */
void CC2520_REGWR24(uint8 addr, uint32 value)
{
	CC2520_SPI_BEGIN();
	CC2520_SPI_TXRX(CC2520_INS_REGWR | addr);
	CC2520_SPI_TXRX(LO_UINT16(LO_UINT32(value)));
	CC2520_SPI_TXRX(HI_UINT16(LO_UINT32(value)));
	CC2520_SPI_TXRX(LO_UINT16(HI_UINT32(value)));
	CC2520_SPI_END();
}
/***********************************************************************************
 * @fn      CC2520_MEMWR24
 *
 * @brief   Write memory 24 bits
 *
 * @param   uint16 addr
 *          uint32 value
 *
 * @return  uint8 - status byte
 */
uint8 CC2520_MEMWR24(uint16 addr, uint32 value)
{
	uint8 s;
	CC2520_SPI_BEGIN();
	s = CC2520_SPI_TXRX(CC2520_INS_MEMWR | HI_UINT16(addr));
	CC2520_SPI_TXRX(LO_UINT16(addr));
	CC2520_SPI_TXRX(LO_UINT16(LO_UINT32(value)));
	CC2520_SPI_TXRX(HI_UINT16(LO_UINT32(value)));
	CC2520_SPI_TXRX(LO_UINT16(HI_UINT32(value)));
	CC2520_SPI_END();
	return s;
}
Exemple #3
0
/***********************************************************************************
* @fn          basicRfBuildHeader
*
* @brief       Builds packet header according to IEEE 802.15.4 frame format
*
* @param       buffer - Pointer to buffer to write the header
*              destAddr - destination short address
*              payloadLength - length of higher layer payload
*
* @return      uint8 - length of header
*/
static uint8 basicRfBuildHeader(uint8* buffer, uint16 destAddr, uint8 payloadLength)
{
    basicRfPktHdr_t *pHdr;
    uint16 fcf;

    pHdr= (basicRfPktHdr_t*)buffer;

    // Populate packet header
    pHdr->packetLength = payloadLength + BASIC_RF_PACKET_OVERHEAD_SIZE;
    //pHdr->frameControlField = pConfig->ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK;
    fcf= pConfig->ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK;
    pHdr->fcf0 = LO_UINT16(fcf);
    pHdr->fcf1 = HI_UINT16(fcf);
    pHdr->seqNumber= txState.txSeqNumber;
    pHdr->panId= pConfig->panId;
    pHdr->destAddr= destAddr;
    pHdr->srcAddr= pConfig->myAddr;

    #ifdef SECURITY_CCM

    // Add security to FCF, length and security header
    pHdr->fcf0 |= BASIC_RF_SEC_ENABLED_FCF_BM_L;
    pHdr->packetLength += PKT_LEN_MIC;
    pHdr->packetLength += BASIC_RF_AUX_HDR_LENGTH;

    pHdr->securityControl= SECURITY_CONTROL;
    pHdr->frameCounter[0]=   LO_UINT16(LO_UINT32(txState.frameCounter));
    pHdr->frameCounter[1]=   HI_UINT16(LO_UINT32(txState.frameCounter));
    pHdr->frameCounter[2]=   LO_UINT16(HI_UINT32(txState.frameCounter));
    pHdr->frameCounter[3]=   HI_UINT16(HI_UINT32(txState.frameCounter));

    #endif

    // Make sure bytefields are network byte order
    UINT16_HTON(pHdr->panId);
    UINT16_HTON(pHdr->destAddr);
    UINT16_HTON(pHdr->srcAddr);

    return BASIC_RF_HDR_SIZE;
}