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

📄 cc2420.c

📁 利用zigbee进行定位的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
}
//-----------------------------------------------------------------------
void  cc2420_readrxfifo()
{
  uint8_t status;
  uint8_t i;
  //printf("开始一个读fifo任务\n");
  { os_atomic_t _nesc_atomic = os_atomic_start();
    {
      cc2420fifo_bspi = FALSE;
      OS_CLR_CC_CS_PIN();
	  
      SPDR = 0x3F | 0x40;//read rxfifo
      while (!(SPSR & 0x80))     ;
      status = SPDR;
      SPDR = 0;
      while (!(SPSR & 0x80))      ;
	  
      cc2420_rxlength = SPDR;
	  
      //	printf("开始分配空间给rxbuf,rxflag is %x\n",cc2420_rxflag);
	  
	//printf("the length of the receive pack is %x\n",cc2420_rxlength); 
      cc2420_rxbuf[cc2420_rxflag] =malloc(cc2420_rxlength +1);
      //printf("point is %x\n",cc2420_rxbuf[cc2420_rxflag] );
   
	  
      if (cc2420_rxlength > 0) 
	  	{
          cc2420_rxbuf[cc2420_rxflag] [0] = cc2420_rxlength ;

          cc2420_rxlength ++;

          
          for (i = 1; i < cc2420_rxlength ; i++) 
		{
              	SPDR = 0;
              	while (!(SPSR & 0x80)) 
			{
                	};
             	 	cc2420_rxbuf[cc2420_rxflag] [i] = SPDR;
            	}
        	}
     
      cc2420fifo_bspi = TRUE;
     
      rfpackernum--;
      cc2420_rxflag++;  
      cc2420_rxflag&=0x01;
      
    }
    os_atomic_end(_nesc_atomic); 
}
  OS_SET_CC_CS_PIN();
  OS_post(&demo_handlepacket);
}

//-------------------------------------------------------------------------
inline  uint8_t cc2420_oscon(void)

{
  uint8_t i;
  uint8_t status;
  bool bXoscOn = FALSE;
  i = 0;
  cc2420_sendcmd(cc2420_SXOSCON);
  while (i < 200 && bXoscOn == FALSE) {
      OS_uwait(100);
      status = cc2420_sendcmd(cc2420_SNOP);
      status = status & (1 << 6);
      if (status) {

        bXoscOn = TRUE;
        }

      i++;
    }
  if (!bXoscOn) {
      printf("osc is unsuccess now\n");
    return FAIL;
    }
  printf("osc is success now\n");
  return SUCCESS;
}

inline uint8_t cc2420_oscoff(void) {
    cc2420_sendcmd(cc2420_SXOSCOFF);   //turn-off crystal
    return SUCCESS;
  }

//--------------------------------------------------------
inline  uint8_t cc2420_VREFOn(void){
    OS_SET_CC_VREN_PIN();                    //turn-on  
    OS_uwait(1800);    
    printf("vref is on now\n");
	return SUCCESS;
  }
inline  uint8_t cc2420_VREFOff(void){
    OS_CLR_CC_VREN_PIN();                    //turn-off  
    OS_uwait(1800);  
	return SUCCESS;
  }
//------------------------------------------------------------------
inline  uint8_t cc2420_enableAutoAck() {
    cc2420_currentparameters[CP_MDMCTRL0] |= (1 << cc2420_MDMCTRL0_AUTOACK);
    return cc2420_writereg(cc2420_MDMCTRL0,cc2420_currentparameters[CP_MDMCTRL0]);
  }

inline  uint8_t cc2420_disableAutoAck() {
    cc2420_currentparameters[CP_MDMCTRL0] &= ~(1 << cc2420_MDMCTRL0_AUTOACK);
    return cc2420_writereg(cc2420_MDMCTRL0,cc2420_currentparameters[CP_MDMCTRL0]);
  }

inline  uint8_t cc2420_enableAddrDecode() {
    cc2420_currentparameters[CP_MDMCTRL0] |= (1 << cc2420_MDMCTRL0_ADRDECODE);
    return cc2420_writereg(cc2420_MDMCTRL0,cc2420_currentparameters[CP_MDMCTRL0]);
  }

inline  uint8_t cc2420_disableAddrDecode() {
    cc2420_currentparameters[CP_MDMCTRL0] &= ~(1 << cc2420_MDMCTRL0_ADRDECODE);
    return cc2420_writereg(cc2420_MDMCTRL0,cc2420_currentparameters[CP_MDMCTRL0]);
  }

//---------------------------------------------------------命令cc2420进入rx模式

inline   uint8_t cc2420_setrxmode(void)

{
  cc2420_sendcmd(cc2420_SRXON);
  return SUCCESS;
}

inline   uint8_t cc2420_settxmode(void)

{
  cc2420_sendcmd(cc2420_STXON);
  return SUCCESS;
}

inline   uint8_t cc2420_settxccamode(void)

{
  cc2420_sendcmd(cc2420_STXONCCA);
  return SUCCESS;
}

inline   uint8_t cc2420_setrfoff(void)

{
  cc2420_sendcmd(cc2420_SRFOFF);
  return SUCCESS;
}


//---------------------------------------------------------设置cc2420 的频道
 inline uint8_t cc2420_setchnl(uint8_t chnl)

{
  int fsctrl;

  fsctrl = 357 + 5 * (chnl - 11);
  cc2420_currentparameters[CP_FSCTRL] = (cc2420_currentparameters[CP_FSCTRL] & 0xfc00) | (fsctrl << 0);
  cc2420_writereg(cc2420_FSCTRL, cc2420_currentparameters[CP_FSCTRL]);
  return SUCCESS;
}

//---------------------------------------------------------设置cc2420短地址,同时写入cc2420
inline uint8_t cc2420_setshortaddress(uint16_t addr)

{
   addr = toLSB16(addr);
   cc2420_writelargeram(cc2420_RAM_SHORTADR, 2, (uint8_t *)&addr);
   printf("shortaddress is set\n");
   return SUCCESS;
}

inline uint8_t cc2420_getshortaddress(uint16_t * addr)

{
     cc2420_readlargeram(cc2420_RAM_SHORTADR, 2, (uint8_t *)addr);
     printf("shortaddress is get\n");
	 return SUCCESS;
}

 inline uint8_t cc2420_setpanid(uint16_t id)
 {
 	id = toLSB16(id);
       cc2420_writelargeram(cc2420_RAM_PANID, 2, (uint8_t *)&id);
       printf("PANID is set\n");
       return SUCCESS;
 }

inline uint8_t cc2420_getpanid(uint16_t * id)

{
     cc2420_readlargeram(cc2420_RAM_PANID, 2, (uint8_t *)&id);
     printf("PANID is get\n");
     return SUCCESS;
}



inline void cc2420_init(void)
{
	cc2420_pin_init();
	SPI_init();
	cc2420_VREFOn();
	OS_CLR_CC_RSTN_PIN();
	OS_uwait(1800);  
	OS_uwait(1800);  
	OS_SET_CC_RSTN_PIN();
	cc2420_oscon();
	cc2420_reginit();
	cc2420_setreg();
       cc2420_rxbuf_now=0;
       cc2420_rxlength_now=0;
	cc2420_rxflag=0;
	cc2420_rxbufuse=0;
	rfpackernum=0;
       printf("cc2420 init is success\n");
}

void restoretask()
{
       uint8_t temp=0;
	if (isready)
		{
			//printf("payload is %04x\n",payload);
			//for (int i=0;i<1000;i++)
       		//	{
       		//
			//		printf(" 0x%02x ",rssi[i]);
       		//	}
			{ os_atomic_t _nesc_atomic = os_atomic_start();
  				  {
      
					extflash_ini();
					printf("\nbegin restore,testnum is %02x\n",testnum);
					
					//for (int i=0;i<264;i++)
	       			//{
	       		
					//	printf(" 0x%02x ",rssi[i]);
	       			//}
					
					
					Memory_Pageprogram_throuth_Buffer(Main_Program_through_Buffer1, pagenum++, 0x0000,264,&rssi[0]);
					
					while(!(Status_Register_Get()&0x80));
					//
					Main_Memory_PageRead(pagenum-1, 0x0000, test, 264);
					while(!(Status_Register_Get()&0x80));
					for (int i=0;i<264;i++)
					       	{
					       		printf("\ntestnum%02x-page%04x is -%02x-",testnum,pagenum-1,test[i]);
					        	}    
		                    //
		                     printf("\nbegin restore1\n");
					
					Memory_Pageprogram_throuth_Buffer(Main_Program_through_Buffer1, pagenum++, 0x0000,264,&rssi[264]);
					while(!(Status_Register_Get()&0x80));
					//
					Main_Memory_PageRead(pagenum-1, 0x0000, test, 264);
					while(!(Status_Register_Get()&0x80));
					for (int i=0;i<264;i++)
					       	{
					       		printf("\ntestnum%02x-page%04x is -%02x-",testnum,pagenum-1,test[i]);
					        	}    
					//
					printf("\nbegin restore2\n");
					Memory_Pageprogram_throuth_Buffer(Main_Program_through_Buffer1, pagenum++, 0x0000,264,&rssi[264+264]);
				       while(!(Status_Register_Get()&0x80));
					 //
					Main_Memory_PageRead(pagenum-1, 0x0000, test, 264);
					while(!(Status_Register_Get()&0x80));
					for (int i=0;i<264;i++)
					       	{
					       		printf("\ntestnum%02x-page%04x is -%02x-",testnum,pagenum-1,test[i]);
					        	}    
					//
					   printf("\nbegin restore3\n");
				       Memory_Pageprogram_throuth_Buffer(Main_Program_through_Buffer1, pagenum++, 0x0000,210,&rssi[264+264+264]);
				       while(!(Status_Register_Get()&0x80));
					 //
					Main_Memory_PageRead(pagenum-1, 0x0000, test, 264);
					while(!(Status_Register_Get()&0x80));
					for (int i=0;i<210;i++)
					       	{
					       		printf("\ntestnum%02x-page%04x is -%02x-",testnum,pagenum-1,test[i]);
					        	}    
					//
					
					//while(!(Status_Register_Get()&0x80));
				}
			  os_atomic_end(_nesc_atomic); }
			
                     isready=0;
			payload=0;
			for (int i=0;i<1003;i++)
			       	{
			       		
						rssi[i]=0;
			       	}
			Leds_greenOff();
			Leds_redOff();
		       Leds_yellowOn();
		
			cc2420_setrxmode();
		}
}
void demo_handlepacket(void) //数据包处理程序
{
       uint8_t num,i,flag;
	uint8_t packetlength=0,linkquality=0;
	uint16_t tempindex=0;
	
	//printf("\n-b-\n");
	flag=(cc2420_rxflag+cc2420_rxbufuse)&0x01;
	cc2420_rxbuf_now=cc2420_rxbuf[flag];
	packetlength=cc2420_rxbuf_now[0];
//	printf("packetlength=%02d,",packetlength);
	linkquality=cc2420_rxbuf_now[packetlength-1];
	tempindex=(cc2420_rxbuf_now[packetlength-2]<<8)+cc2420_rxbuf_now[packetlength-3];
//	printf("%02d\n",linkquality);
	linkquality=~linkquality;//change fu shu wei shi jin zhi 
	printf("-%02d\n",linkquality);
//	printf("[packetlength-7]=%x,",cc2420_rxbuf_now[packetlength-7]);
//	printf("[packetlength-8]=%x,",cc2420_rxbuf_now[packetlength-8]);
//	printf("[packetlength-5]=%x,",cc2420_rxbuf_now[packetlength-5]);
//	printf("[packetlength-6]=%x,",cc2420_rxbuf_now[packetlength-6]);
	if ((cc2420_rxbuf_now[packetlength-5]==0x01))
		{


	  	demopacket->payload=linkquality;

		}
	
       
	Leds_greenToggle();
//	Leds_redOff();
	Leds_yellowOff();
	free(cc2420_rxbuf[flag]); //add on 7.14
	cc2420_rxbufuse--;
	if  ((cc2420_rxbufuse==0) && (rfpackernum!=0))
		{
		   cc2420_rxbufuse++;
		   OS_post(&cc2420_readrxfifo);
		}
	cc2420_rxbuf[flag]=NULL;
	
	
	

}
	



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -