⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mftphy2500.c.bak

📁 motorola jw32 usb 源码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
	描述: 无线收发器有三种状态,一是处于接收,二是处于发送,三是处于关闭.在关
	闭收发器时,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 + -