📄 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 + -