?? mftphy2500.c.bak
字號:
描述: 無線收發器有三種狀態,一是處于接收,二是處于發送,三是處于關閉.在關
閉收發器時,PHY_TRX_FORCE_OFF 表示強制關閉.不管現在是什么狀態.?
PHY_TRX_OFF 表示關閉收發器,但如果現在仍然在發送或接收,則等現在的工作
完成后,才切換到關閉狀態.
**********************************************************************/
void PHYSetTRXState(BYTE state)
{
if(state==PHY_TRX_RX_ON){
halSpiStrobe(CCxxx0_SIDLE);
halSpiStrobe(CCxxx0_SFRX);
halSpiStrobe(CCxxx0_SRX);
// KBIER = 0x20 ; //allow receive interrupt
} else if(state==PHY_TRX_TX_ON){
halSpiStrobe(CCxxx0_SIDLE);
// PHYClearRXFifo();
}
else if(state==PHY_TRX_FORCE_OFF){
halSpiStrobe(CCxxx0_SPWD);
}
else if(state==PHY_TRX_OFF){
// KBIER = 0x20 ; //allow receive interrupt
//halSpiStrobe(CCxxx0_SWOR);
}
}
/**********************************************************************
函數: void PHYSetTxPower(BYTE val)
功能:設置無線收發器的發送功率.
輸入:val 表示發送功率值,此值的范圍由RF 芯片決定.
描述:在發送數據時,可以調用此函數控制無線收發器的發送功率,從而控制無線
發送的距離和發送的功耗.
**********************************************************************/
/*void PHYSetTxPower(BYTE val)
{
PHYPower=val;
halSpiWriteReg(CCxxx0_FREND0,PHYPower);
} */
/*********************************************************************
函數: Bool PHYInit(BYTE channel,int Phyaddress,BYTE PhyDataLength)
功能: 物理層初始化
輸入:
channel:設置的初始化頻道,值的范圍由RF 芯片決定。
Phyaddress:物理層地址,兩個字節,如果為鍵盤.鼠標.遙控器.USB 協調器等,其
物理層地址都初始化為0x1234.
PhyDataLength:物理層數據幀長度,最大長度不能超出RF芯片決定的物理幀數據長
度.
描述:上層在與RF芯片通信時,需要首先初始化RF芯片內部寄存器的設置,如設
置頻道,物理地址,數據幀長度等;同時需要初始化PHY 層的一些基本參數等.
初始化的內容包括:
1. 復位RF 芯片
2. 打開RF芯片的振蕩器,并等待其穩定.
3. 初始化當前頻道,設置當前頻道的狀態為關閉狀態.
4. 設置CCA 模式.
5. 其它某些變量的初始化等.
**********************************************************************/
BYTE PHYInit(BYTE channel,BYTE Phyaddress)
{
if(channel>200)
{
return(FALSE);
}
else
{
PHYClearExChannel();
PHYSendFlag = 0;
PHYPower = 0;
PHYChannel = channel;
PHYRvLength = 0x00;
CC2500_init();
halSpiWriteReg(CCxxx0_ADDR, Phyaddress); //set phy address
halSpiWriteReg(CCxxx0_CHANNR,PHYChannel); //set Channel
PHYCaliberateOsc();
//PHYSetTRXState(PHY_TRX_RX_ON);
PHY_IntInit();
return TRUE;
}
}
/*********************************************************************
函數: BYTE PHYGetED(void)
功能: 取接收器接收的能量值.
返回: 接收的能量值,由RF 芯片決定其范圍.
此函數用于在協調器掃描頻道前,檢測哪一些頻道是被占用的,哪些是空閑的.
**********************************************************************/
/*BYTE PHYGetED(void)
{
return halSpiReadReg(CCxxx0_RSSI);
}*/
/*********************************************************************
函數: BYTE PHYCCARequest()
功能:進行載波沖突檢測算法.
輸出:當前頻道空閑或被占用.
描述:在發送數據前,需要檢測頻道是否干凈,當物理層接收到此消息后,將進行載
波沖突檢測算法.如果檢測到此頻道已經被占用,則返回BUSY.否則返回IDLE.
**********************************************************************/
/*BYTE PHYCCARequest()
{
unsigned char i,j;
PHYSetTRXState(PHY_TRX_RX_ON) ;
halWait(1);
halSpiStrobe(CCxxx0_STX);
for(j=0;j<100;j++)
{
i=halSpiReadReg(CCxxx0_PKTSTATUS);
if(i&0x10>0)
return IDLE;
__RESET_WATCHDOG();
halWait(10);
}
return BUSY;
}
*/
/*********************************************************************
函數: BYTE PHYDataRequest(BYTE psduLength,BYTE xdata*psdu)
功能:發送無線數據.
輸入:psduLength發送數據的長度psdu 發送數據的地址
描述:當物理層接收到此消息后,將打開發送通道,打包組成物理幀的格式,然后發
送出去,在發送結束后,物理層應返回表示發送成功SUCCESS或失敗FAIL.
**********************************************************************/
void PHYDataRequest(BYTE psduLength,BYTE * psdu)
{
if(MACWaitGdo()) ;
PHYSetTRXState(PHY_TRX_TX_ON) ;
PHYSendFlag =1;
halSpiStrobe(CCxxx0_SFTX);
PHYClearRxBuffer();
halRfSendPacket(psdu,psduLength);
// while(GDO2_PIN)
// _nop_();
// while(PHYSendFlag) ;
// PTD_PTD4=0;
//delayms(1);
// halSpiStrobe(CCxxx0_SRX); //change for lost package jc
}
/*********************************************************************
函數: void PHYDataIndication(BYTE *psduLength,BYTE psdu,BYTE * LQI)
功能:物理層接收到一幀數據.
輸出:psduLength 接收數據的長度,psdu 接收數據的地址,LQI 接收數據的質量.
描述:物理層接收到一幀數據時,如果長度0 或大于了物理幀的最大長度127.則過濾掉接收
數據.否則通知MAC層,物理層接收到一幀數據,然后MAC層便通過此函數取出接收的數據.
物理層需要填入接收數據的長度,接收數據的地址以及接收數據的LQI連接質量.
**********************************************************************/
BYTE PHYDataIndication(BYTE *psdu,BYTE * LQI)
{
PHYRvLength = halRfReceivePacket(psdu,LQI);
/* if((!PHYRvLength)&&(!MACMsIsGameMode()))
{
PHYCaliberateOsc();
}*/
halSpiStrobe(CCxxx0_SRX);
return PHYRvLength;
}
/*********************************************************************
函數: BYTE PHYGet(BYTE PIB,int * PIBVaule)
功能:取物理層基本參數.
輸入:PIB參數ID,PIBVaule 參數值.
輸出:成功或失敗
描述:物理層基本參數參見下表:
phycurrentchannel: ID=0x00,當前頻道,范圍由RF芯片決定.
phyTransmitMaxPower: ID=0x01,發送器最大發送功率。
PhychannleMaxSupport: ID=0x02,物理層支持的最大邏輯頻道數.如27,則表白物理層支持27個頻道。
PhyFramMaxLength: ID=0x03,物理層支持的幀數據最大長度.
PhyAddrMaxValue: ID=0x04,物理地址的最大值.
phycurrentPower: ID=0x05,當前發送器功率,范圍由RF芯片決定.
**********************************************************************/
BYTE PHYGetPIB(BYTE PIB,BYTE * PIBVaule)
{
if(PIB==0) {
*PIBVaule=PHYChannel; //當前頻道
} else if(PIB==1){
*PIBVaule=0x07; //最大發送功率
}
else if(PIB==2){
*PIBVaule=max_channr; //最大邏輯頻道數
}
else if(PIB==3){
*PIBVaule=rfSettings.PKTLEN; //幀數據最大長度
}
else if(PIB==4){
*PIBVaule=0xFF; //物理地址的最大值
}
else if(PIB==5){
*PIBVaule=PHYPower; //當前發送器功率
} else
return FAIL;
return SUCCESS;
}
// check whether we receive radio data
uchar PHYGetRssi()
{
return halSpiReadStatus(CCxxx0_FREQEST);
}
void interrupt 15 INT1_ISR(void) //INT1中斷
{
BYTE kbcr;
if(PHYSendFlag)
{
PHYSendFlag =0;
// halSpiStrobe(CCxxx0_SRX);
//return;
} else {
//while(!GDO2_PIN) ;
MACPhyDataReady();
}
kbcr = KBSCR ;
kbcr |= 0x04;//write ack,clear keyf
KBSCR = kbcr;
//KBSCR |=0x04;//write ack,clear keyf
KBSCR &=0xfb;//write ack,clear keyf
//PTD_PTD4 = 1 ;
}
//-------------------------------------------------------------------------------------------------------
// void PHYWriteBuffer(BYTE size,BYTE *txBuffer)
//
// DESCRIPTION:
// this function only write tx buffer,dont send it immediately.must call
// halSpiStrobe(CCxxx0_STX),this tx buffer data can be sended.
//
// ARGUMENTS:
// BYTE *txBuffer
// Pointer to a buffer containing the data that are going to be transmitted
//
// UINT8 size
// The size of the txBuffer
//-------------------------------------------------------------------------------------------------------
void PHYWriteBuffer(BYTE size,BYTE *txBuffer)
{
if()
halSpiStrobe(CCxxx0_SFTX);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);
}
//-------------------------------------------------------------------------------------------------------
// PHYSend()
//
// DESCRIPTION:this function only change 2500 to tx state,if tx fifo has data,
// Sending data will begin
void PHYSend(void)
{
PHYSendFlag=1;
halSpiStrobe(CCxxx0_STX);
// while(PHYSendFlag) ;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -