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

📄 cc2420.c

📁 csma-ca 算法的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//----------------------------------------------------//
//-------Institute Of  Computing Technology-----------//
//------------Chinese Academic  Science---------------//
//-----中国科学院计算技术研究所先进测试技术实验室-----//
//----------------------------------------------------//

/**
 * www.wsn.net.cn
 * @copyright:nbicc_lpp
 * @data:2005.11.22
 * @version:0.0.1
 * @updata:$
 *
 */
#include "cc2420.h"
//send

//------------------------------HPL-------------------------------------------------------------------
inline  uint8_t cc2420_pin_init(void)
{

  cc2420_bramspi = TRUE;
  OS_MAKE_MISO_INPUT();
  OS_MAKE_MOSI_OUTPUT();
  OS_MAKE_SPI_SCK_OUTPUT();
  OS_MAKE_CC_RSTN_OUTPUT();
  OS_MAKE_CC_VREN_OUTPUT();
  OS_MAKE_CC_CS_OUTPUT();
  OS_MAKE_CC_FIFOP1_INPUT();
  OS_MAKE_CC_CCA_INPUT();
  OS_MAKE_CC_SFD_INPUT();
  OS_MAKE_CC_FIFO_INPUT();
  
    return SUCCESS;
}

inline static  uint8_t SPI_init(void)
{
   { os_atomic_t _nesc_atomic = os_atomic_start();
    {
      OS_MAKE_SPI_SCK_OUTPUT();
      OS_MAKE_MISO_INPUT();
      OS_MAKE_MOSI_OUTPUT();
      SPSR |= 1 << 0;//SPI STATE 
      SPCR |= 1 << 4;
      SPCR &= ~(1 << 3);
      SPCR &= ~(1 << 2);
      SPCR &= ~(1 << 1);
      SPCR &= ~(1 << 0);
      SPCR |= 1 << 6;
    }
    os_atomic_end(_nesc_atomic); }
	return SUCCESS;
}

inline  uint8_t cc2420_reginit(void)
{
  
  // Set default parameters
  cc2420_currentparameters[CP_MAIN] = 0xf800;
  cc2420_currentparameters[CP_MDMCTRL0] = ((0 << cc2420_MDMCTRL0_PANCRD) |(0 << cc2420_MDMCTRL0_ADRDECODE) | //is not coordinator disable auto adr_decode
       (2 << cc2420_MDMCTRL0_CCAHIST) | (3 << cc2420_MDMCTRL0_CCAMODE)  | //cca mode is 3
       (1 << cc2420_MDMCTRL0_AUTOCRC) | (2 << cc2420_MDMCTRL0_PREAMBL)); //auto crc is set 

  cc2420_currentparameters[CP_MDMCTRL1] = 20 << cc2420_MDMCTRL1_CORRTHRESH;//default
  cc2420_currentparameters[CP_RSSI] =     0xE080;//default 
  cc2420_currentparameters[CP_SYNCWORD] = 0xA70F;
  cc2420_currentparameters[CP_TXCTRL] = ((1 << cc2420_TXCTRL_BUFCUR) | //default is 2-1.16ma,now is 980ua
       (1 << cc2420_TXCTRL_TURNARND) | (3 << cc2420_TXCTRL_PACUR) | //default ,turnaround time is 12 symbols
       (1 << cc2420_TXCTRL_PADIFF) | (0x1f << cc2420_TXCTRL_PAPWR));//default
 cc2420_currentparameters[CP_RXCTRL0] = ((1 << cc2420_RXCTRL0_BUFCUR) | //default is 980ua
       (2 << cc2420_RXCTRL0_MLNAG) | (3 << cc2420_RXCTRL0_LOLNAG) | 
       (2 << cc2420_RXCTRL0_HICUR) | (1 << cc2420_RXCTRL0_MCUR) | 
       (1 << cc2420_RXCTRL0_LOCUR));//default
 cc2420_currentparameters[CP_RXCTRL1]  = ((1 << cc2420_RXCTRL1_LOLOGAIN)   | (1 << cc2420_RXCTRL1_HIHGM    ) |//default
	                                   (1 << cc2420_RXCTRL1_LNACAP)     | (1 << cc2420_RXCTRL1_RMIXT    ) |
									   (1 << cc2420_RXCTRL1_RMIXV)      | (2 << cc2420_RXCTRL1_RMIXCUR  ) );//default
							    
 cc2420_currentparameters[CP_FSCTRL]   = ((1 << cc2420_FSCTRL_LOCK)        | ((357+5*(cc2420_DEF_CHANNEL-11)) << cc2420_FSCTRL_FREQ));//2405mhz
 cc2420_currentparameters[CP_SECCTRL0] = ((0 << cc2420_SECCTRL0_PROTECT) |(1 << cc2420_SECCTRL0_CBCHEAD)  |
	                                   (1 << cc2420_SECCTRL0_SAKEYSEL)  | (1 << cc2420_SECCTRL0_TXKEYSEL) |
									   (1 << cc2420_SECCTRL0_SECM ) );//disable the security
 cc2420_currentparameters[CP_SECCTRL1] = 0;
 cc2420_currentparameters[CP_BATTMON]  = 0;//battery monitor is disable 
    //cc2420_currentparameters[CP_IOCFG0]   = (((TOSH_DATA_LENGTH + 2) << cc2420_IOCFG0_FIFOTHR) | (1 <<cc2420_IOCFG0_FIFOPPOL)) ;
	//set fifop threshold to greater than size of  msg, fifop goes active at end of msg
 cc2420_currentparameters[CP_IOCFG0]   = (((127) << cc2420_IOCFG0_FIFOTHR) | (1 <<cc2420_IOCFG0_FIFOPPOL)) ;//polarity is inverted as compareed to the specification
 cc2420_currentparameters[CP_IOCFG1]   =  0;
  return SUCCESS;

}

//---------------------------------------------------------设置cc2420寄存器的值
bool cc2420_setreg(void)

{
  uint16_t data;
  
  cc2420_writereg(cc2420_MAIN, cc2420_currentparameters[CP_MAIN]);
  cc2420_writereg(cc2420_MDMCTRL0, cc2420_currentparameters[CP_MDMCTRL0]);
  data = cc2420_readreg(cc2420_MDMCTRL0);
  if (data != cc2420_currentparameters[CP_MDMCTRL0]) {
    printf("reginit is unsuccess\n");
    return FALSE;
    }
  cc2420_writereg(cc2420_MDMCTRL1, cc2420_currentparameters[CP_MDMCTRL1]);
  cc2420_writereg(cc2420_RSSI, cc2420_currentparameters[CP_RSSI]);
  cc2420_writereg(cc2420_SYNCWORD, cc2420_currentparameters[CP_SYNCWORD]);
  cc2420_writereg(cc2420_TXCTRL, cc2420_currentparameters[CP_TXCTRL]);
  cc2420_writereg(cc2420_RXCTRL0, cc2420_currentparameters[CP_RXCTRL0]);
  cc2420_writereg(cc2420_RXCTRL1, cc2420_currentparameters[CP_RXCTRL1]);
  cc2420_writereg(cc2420_FSCTRL, cc2420_currentparameters[CP_FSCTRL]);

  cc2420_writereg(cc2420_SECCTRL0, cc2420_currentparameters[CP_SECCTRL0]);
  cc2420_writereg(cc2420_SECCTRL1, cc2420_currentparameters[CP_SECCTRL1]);
  cc2420_writereg(cc2420_IOCFG0, cc2420_currentparameters[CP_IOCFG0]);
  cc2420_writereg(cc2420_IOCFG1, cc2420_currentparameters[CP_IOCFG1]);

  cc2420_sendcmd(cc2420_SFLUSHTX);
  cc2420_sendcmd(cc2420_SFLUSHRX);
   printf("reginit is success\n");
  return TRUE;
}

//----------------------------------------------------------------FIFOP中断处理中转
inline uint8_t cc2420_fifopintr(void){
    
 
   if (Is_CSMA)
		{
			cc2420_readreg(0x3F);
			rfpackernum=0;
			cc2420_sendcmd(0x08);
			cc2420_sendcmd(0x08);
			Leds_redOff();
			printf("\nsystem is in csmaca\n");
			return SUCCESS;
		}
   if (!OS_READ_CC_FIFO_PIN()) {
      printf("收到一个包,但芯片缓存 溢出\n");
      cc2420_readreg(0x3F);
      rfpackernum=0;
      cc2420_sendcmd(0x08);
      cc2420_sendcmd(0x08);
      return SUCCESS;
    }
    
    rfpackernum++;
    
   // printf("收到一个包,启动接收任务\n");
    if (cc2420_rxbufuse>1) 
		{
		      printf("没有可用的ram空间,等待中!");
			  cc2420_readreg(0x3F);
              rfpackernum=0;
              cc2420_sendcmd(0x08);
              cc2420_sendcmd(0x08);
		      
		
    	}
    else 
		{
              cc2420_rxbufuse++;
		      OS_post(&cc2420_readrxfifo);
    	}
    return SUCCESS;
 }
//---------------------------------------------------------打开对fifop的中断支持,下降延触发
inline  uint8_t cc2420_enablefifop(void)
{
  EICRB &= ~(1 << 4);
  EICRB |= 1 << 5;
  EIMSK |= 1 << 6;
  return SUCCESS;
}

//---------------------------------------------------------向cc2420发送一个命令
uint8_t cc2420_sendcmd(uint8_t addr)
{
   uint8_t status;

  { os_atomic_t _nesc_atomic = os_atomic_start();

    {
      OS_CLR_CC_CS_PIN();
      SPDR = addr;//这是单片机内部spi数据寄存器的地址
      while (!(SPSR & 0x80)) {//这是单片机内部spi状态寄存器的地址
        }
      ;
      status = SPDR;
    }
    os_atomic_end(_nesc_atomic); }
    OS_SET_CC_CS_PIN();
  return status;
}
//---------------------------------------------------------向cc2420指定的地址写数据
uint8_t cc2420_writereg(uint8_t addr, uint16_t data)
{
  uint8_t status;
  { os_atomic_t _nesc_atomic = os_atomic_start();
    {
      cc2420_bramspi = FALSE;
      OS_CLR_CC_CS_PIN();
      SPDR = addr;
      while (!(SPSR & 0x80)) {
        }
      ;
      status = SPDR;
      if (addr > 0x0E) {
          SPDR = data >> 8;
          while (!(SPSR & 0x80)) {
            }
          ;
          SPDR = data & 0xff;
          while (!(SPSR & 0x80)) {
            }
          ;
        }
      cc2420_bramspi = TRUE;
    }
    os_atomic_end(_nesc_atomic); }
  OS_SET_CC_CS_PIN();
  return status;
}

//---------------------------------------------------------------从cc2420指定的地址读数据
uint16_t cc2420_readreg(uint8_t addr)
{
  uint16_t data = 0;
  uint8_t status;
  { os_atomic_t _nesc_atomic = os_atomic_start();
    {
      cc2420_bramspi = FALSE;
      OS_CLR_CC_CS_PIN();
      SPDR = addr | 0x40;
      while (!(SPSR & 0x80)) {
        }
      ;
      status = SPDR;
      SPDR = 0;
      while (!(SPSR & 0x80)) {
        }
      ;
      data = SPDR;
      SPDR = 0;
      while (!(SPSR & 0x80)) {
        }
      ;
      data = (data << 8) | SPDR;
      OS_SET_CC_CS_PIN();
      cc2420_bramspi = TRUE;
    }
    os_atomic_end(_nesc_atomic); }
  return data;
}

uint8_t cc2420_readlargeram(uint16_t addr, uint8_t length, uint8_t *buffer)
{
   uint8_t i = 0;
   uint8_t status;
  if (!cc2420_bramspi) {
    return FALSE;
    }

  { os_atomic_t _nesc_atomic = os_atomic_start();

    {
      cc2420_bramspi = FALSE;
      cc2420_ramaddr = addr;
      cc2420_ramlen = length;
      
      OS_CLR_CC_CS_PIN();
		  
      SPDR = (cc2420_ramaddr & 0x7F) | 0x80;
      while (!(SPSR & 0x80)) {
        }
      ;
      status = SPDR;
      //printf("status1 is %x\n",status);
       
       SPDR = (cc2420_ramaddr >> 1) & 0xe0;
       while (!(SPSR & 0x80)) ;
	status=SPDR;
      	SPDR=0;
	for (i = 0; i < cc2420_ramlen; i++) {
		 	 
                      while (!(SPSR & 0x80)) {
					  	
                       }
		        buffer[i]=SPDR;
			 SPDR=0;
		 	//printf("%x\n",buffer[i]);
        }
    }
  OS_SET_CC_CS_PIN();
    os_atomic_end(_nesc_atomic); }
  cc2420_bramspi = TRUE;
  return SUCCESS;
}

//---------------------------------------------------------连续写cc2420ram
uint8_t cc2420_writelargeram(uint16_t addr, uint8_t length, uint8_t *buffer)
{
  uint8_t i = 0;
  uint8_t status;
  if (!cc2420_bramspi) {
    return FALSE;
    }
  { os_atomic_t _nesc_atomic = os_atomic_start();

⌨️ 快捷键说明

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