/** Copyright (c) 2008 Freescale Semiconductor Freescale Confidential Proprietary \file Phy.c \brief Physical Layer RF \author Freescale Semiconductor \author Ioseph Martinez, b06623 \author Guadalajara Applications Laboratory RTAC Americas \version 0.8 \date 29/Jan/2008 \warning * History: */ /*****************************************************************************/ #include "Phy.h" UINT8 gu8PhyState = PHY_STATE_JOB_IDLE; UINT8 *gu8PhyDataBuffer; UINT8 gu8PhyLengthBuffer; UINT8 gu8PhyDataBits; UINT8 gu8PhyLength; UINT8 gu8PhyIndex; UINT8 gu8PhyToggle; UINT8 u8fnPhyGetState(void) { return gu8PhyState; } void static vfnPhyInternalBits(void) { UINT8 temp; temp = !(gu8PhyDataBits&0x80); if(gu8PhyToggle){ PHY_PINOUTPUT = (~PHY_PINOUTPUT); gu8PhyLength--; gu8PhyDataBits = gu8PhyDataBits<<1; } else { PHY_PINOUTPUT = !temp; } gu8PhyToggle = !gu8PhyToggle; } void vfnPhyTimerCall(void) { if(gu8PhyState == PHY_STATE_JOB_BITS) { vfnPhyInternalBits();; if(!gu8PhyLength) { gu8PhyState = PHY_STATE_JOB_IDLE; } } else if(gu8PhyState == PHY_STATE_JOB_BYTES) { vfnPhyInternalBits(); if(!gu8PhyLength) { gu8PhyIndex++; gu8PhyDataBits = gu8PhyDataBuffer[gu8PhyIndex]; gu8PhyLengthBuffer--; gu8PhyLength = 8; gu8PhyToggle = 0; } if(!gu8PhyLengthBuffer) { gu8PhyState = PHY_STATE_JOB_IDLE; } } else if(gu8PhyState == PHY_STATE_JOB_AGC) { PHY_PINOUTPUT = 1; gu8PhyLength--; if(!gu8PhyLength) { gu8PhyState = PHY_STATE_JOB_IDLE; } } else if(gu8PhyState == PHY_STATE_JOB_DELAY) { PHY_PINOUTPUT = PHY_PINOUTPUT_IDLE; gu8PhyLength--; if(!gu8PhyLength) { gu8PhyState = PHY_STATE_JOB_IDLE; } } else { PHY_PINOUTPUT = PHY_PINOUTPUT_IDLE; } } void vfnPhySendBits(UINT8 Data, UINT8 Length) { gu8PhyState = PHY_STATE_JOB_BITS; gu8PhyDataBits = Data; gu8PhyLength = Length; gu8PhyToggle = 0; } void vfnPhySendBytes(UINT8 *Data, UINT8 Length) { gu8PhyState = PHY_STATE_JOB_BYTES; gu8PhyDataBuffer = Data; gu8PhyLengthBuffer = Length; gu8PhyDataBits = gu8PhyDataBuffer[0]; gu8PhyIndex = 0; gu8PhyToggle = 0; gu8PhyLength = 8; } void vfnPhySendAGC(void) { gu8PhyLength = 4; gu8PhyState = PHY_STATE_JOB_AGC; } void vfnPhyBitDelay(void) { gu8PhyLength = 4; gu8PhyState = PHY_STATE_JOB_DELAY; } void vfnPhySendPID(void) { vfnPhySendBits(0x08,8); while(gu8PhyState != PHY_STATE_JOB_IDLE){;} /* 4 bits time delay between PID */ vfnPhyBitDelay(); while(gu8PhyState != PHY_STATE_JOB_IDLE){;} } void vfnPhySendMsg(UINT8 *Data, UINT8 Length) { /*Preamble is 2-bit 0b00,ID is 6-bit 0b001000 */ vfnPhySendPID(); vfnPhySendPID(); vfnPhySendPID(); /*Preamble is 2-bit 0b00,header is 4-bit 0b0110 */ vfnPhySendBits(0x18,6); while(gu8PhyState != PHY_STATE_JOB_IDLE){;} vfnPhySendBytes(Data, Length); while(gu8PhyState != PHY_STATE_JOB_IDLE){;} }