cc2420.c

来自「无线传感器星型网络的节点的基站程序,采用802.15.4协议」· C语言 代码 · 共 654 行 · 第 1/2 页

C
654
字号
//-------------------------------------------------------------------------
uint8_t cc2420_writetxfifo(uint8_t len, uint8_t *msg)
{
  uint8_t i = 0;
  uint8_t status;
  { os_atomic_t _nesc_atomic = os_atomic_start();
    {
      cc2420fifo_bspi = FALSE;
      cc2420fifo_txlength = len;
      cc2420fifo_txbuf = msg;
      OS_CLR_CC_CS_PIN();
      SPDR = 0x3E;
      while (!(SPSR & 0x80)) {
        }
      ;
      status = SPDR;
      for (i = 0; i < cc2420fifo_txlength; i++) {
          SPDR = *cc2420fifo_txbuf;
          cc2420fifo_txbuf++;
          while (!(SPSR & 0x80)) {
            }
          ;
        }
      cc2420fifo_bspi = TRUE;
    }
    os_atomic_end(_nesc_atomic); }
  OS_SET_CC_CS_PIN();
 // printf("a packet will be send!\n");
  cc2420_sendcmd(cc2420_STXON); //send 
  //printf("a packet is success send!\n");
  return status;
}
//-----------------------------------------------------------------------
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);
	  
    
      cc2420_rxbuf[cc2420_rxflag] =malloc(cc2420_rxlength +1);
     // printf("point is %04x\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(10);  
	OS_SET_CC_RSTN_PIN();
	OS_uwait(10); 
	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 demo_handlepacket(void)
{
       uint8_t num,i,flag;
	flag=(cc2420_rxflag+cc2420_rxbufuse)&0x01;
	cc2420_rxbuf_now=cc2420_rxbuf[flag];
	//intf("\nreceive a packet in channel %04x!\n",cc2420_readreg(cc2420_FSCTRL));
	
	num=cc2420_rxbuf_now[0]+1;
	for (i=0;i<num;i++)
		printf("%02x",cc2420_rxbuf_now[i]);
	   
	usart_putbyte(0x7e);
	usart_putbyte(0x42);
	
	usart_putbyte(0x21);
	usart_putbyte(0x02);
	usart_putbyte(0x03);
	usart_putbyte(cc2420_rxbuf_now[10]);//source address
	usart_putbyte(0x01);
	usart_putbyte(cc2420_rxbuf_now[3]);//adc sequec
	
	usart_putbyte(cc2420_rxbuf_now[12]);//adc data0
	usart_putbyte(cc2420_rxbuf_now[13]);//adc data0
	
	usart_putbyte(cc2420_rxbuf_now[14]);//adc data1
	usart_putbyte(cc2420_rxbuf_now[15]);//adc data1
	
	usart_putbyte(cc2420_rxbuf_now[16]);//adc data2
	usart_putbyte(cc2420_rxbuf_now[17]);//adc data2
	
	usart_putbyte(cc2420_rxbuf_now[18]);//adc data3
	usart_putbyte(cc2420_rxbuf_now[19]);//adc data3
	
	usart_putbyte(cc2420_rxbuf_now[20]);//adc data4
	usart_putbyte(cc2420_rxbuf_now[21]);//adc data4
	
	usart_putbyte(cc2420_rxbuf_now[22]);//adc data5
	usart_putbyte(cc2420_rxbuf_now[23]);//adc data5
	
	usart_putbyte(cc2420_rxbuf_now[24]);//adc data6
	usart_putbyte(cc2420_rxbuf_now[25]);//adc data6
	
	usart_putbyte(cc2420_rxbuf_now[26]);//adc data7
	usart_putbyte(cc2420_rxbuf_now[27]);//adc data7
	
	usart_putbyte(cc2420_rxbuf_now[28]);//adc data8
	usart_putbyte(cc2420_rxbuf_now[29]);//adc data8
	
	usart_putbyte(cc2420_rxbuf_now[30]);//adc data9
	usart_putbyte(cc2420_rxbuf_now[31]);//adc data9
	
	usart_putbyte(0x01);//crc1
	usart_putbyte(0x01);//crc0
	
	usart_putbyte(0x7e);
	
	 
	free(cc2420_rxbuf[flag]);
	cc2420_rxbufuse--;
	if  ((cc2420_rxbufuse==0) && (rfpackernum!=0))
		{
		   cc2420_rxbufuse++;
		   OS_post(&cc2420_readrxfifo);
		}
	cc2420_rxbuf[flag]=NULL;
	//printf("释放rxbuf,now point is %04x\n",cc2420_rxbuf[flag]);
}
	



⌨️ 快捷键说明

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