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

📄 cc2420.c

📁 CC2420初始化程序
💻 C
字号:
#include "port_config_CC2420.h"
#include "cc2420const.h"
#include "cc2420HAL.h"
#include <msp430x16x.h>
volatile int gCurrentParameters[14];

void CC2420_Set_PIN_DIR(void){

 DIROUT_PHY_RESETn;
 DIROUT_PHY_VREG_EN;
 DIROUT_PHY_CSn;

 SET_PHY_RESETn(1);
 SET_PHY_VREG_EN(0);
 SET_PHY_CSn(1);

 DIRIN_PHY_FIFOP;
 DIRIN_PHY_GIO0;
 DIRIN_PHY_SFD;
 DIRIN_PHY_GIO1;
}
void delay(void)
{
  int i;
  for(i=0;i<1000;i++);
}

void halRfWaitForCrystalOscillator(){  // decide whether the oscillator is stable
	char spiStatusByte;
       PHY_Selected();//CS=0
    // Poll the SPI status byte until the crystal oscillator is stable
    do {
	    SPI_Tx(CC2420_SNOP);
            spiStatusByte = SPI_Rx();
   } while (!(spiStatusByte & 0x40));
     PHY_Deselected();//CS=1
}

void RfRegInit(void){
       // Set default parameters
    gCurrentParameters[CP_MAIN] = 0xf800;


   /* set up REG_MDMCTRL0 */
    // Set AUTOACK bit in MDMCTRL0 register.
    // 15:14 = '00' = Reserved
    // 13    = '0'  = Reserved frames are rejected
    // 12    = '?'  = '1' if this is coordinator, '0' if otherwise
    // 11    = '1'  = Address decoding is enabled
    // 10:8  = '010'    = CCA Hysteresis in DB - default value
    // 7:6   = '11' = CCA = 1, when RSSI_VAL < CCA_THR - CCA_HYST and not receiving valid IEEE 802.15.4 data
    // 5     = '1'  = Auto CRC
    // 4     = '1'  = Auto ACK
    // 3:0   = '0010' = 3 leading zero bytes - IEEE compliant.
 //#ifdef I_AM_COORDINATOR
      //gCurrentParameters[CP_MDMCTRL0]=0x1AF2;
      //0b 0001 1010 1111 0010
 //#else
     //gCurrentParameters[CP_MDMCTRL0]=0x02e2;//关闭了硬件地址解析
     //0b 0000 1010 1111 0010
     gCurrentParameters[CP_MDMCTRL0]=0x0AA2;//打开了硬件地址解析
//#endif
    gCurrentParameters[CP_MDMCTRL0] &= ~(1 << CC2420_MDMCTRL0_AUTOACK);
 gCurrentParameters[CP_MDMCTRL1]=0x0600;
    gCurrentParameters[CP_RSSI] =     0xE080;
    gCurrentParameters[CP_SYNCWORD] = 0xA70F;

 /*
 *  PA_LEVEL determiens output power of transciever
 *          According to Table 9 of CC2420 datasheet
 *
 *          PA_LEVEL (TXCTRL.LSB)       Output Power (dBm)  Current Consumtiion
 *          ====================================================================
 *          0xFF                        0                   17.4 mA
 *          0xFB                        -1                  16.5 mA
 *          0xF7                        -3                  15.2 mA
 *          0xF3                        -5                  13.9 mA
 *          0xEF                        -7                  12.5 mA
 *          0xEB                        -10                 11.2 mA
 *          0xE7                        -15                 9.9 mA
 *          0xE3                        -25                 8.5 mA
 */
    gCurrentParameters[CP_TXCTRL] = ((1 << CC2420_TXCTRL_BUFCUR) |
       (1 << CC2420_TXCTRL_TURNARND) | (3 << CC2420_TXCTRL_PACUR) |
       (1 << CC2420_TXCTRL_PADIFF) | (CC2420_DEF_RFPOWER << CC2420_TXCTRL_PAPWR));

    gCurrentParameters[CP_RXCTRL0] = ((1 << CC2420_RXCTRL0_BUFCUR) |
       (2 << CC2420_RXCTRL0_MLNAG) | (3 << CC2420_RXCTRL0_LOLNAG) |
       (2 << CC2420_RXCTRL0_HICUR) | (1 << CC2420_RXCTRL0_MCUR) |
       (1 << CC2420_RXCTRL0_LOCUR));

    gCurrentParameters[CP_RXCTRL1]  = ((1 << CC2420_RXCTRL1_LOLOGAIN) |
       (1 << CC2420_RXCTRL1_HIHGM) |  (1 << CC2420_RXCTRL1_LNACAP) |
       (1 << CC2420_RXCTRL1_RMIXT) |  (1 << CC2420_RXCTRL1_RMIXV)  |
       (2 << CC2420_RXCTRL1_RMIXCUR));

    gCurrentParameters[CP_FSCTRL]   = ((1 << CC2420_FSCTRL_LOCK) |
       ((357+5*(CC2420_DEF_CHANNEL-11)) << CC2420_FSCTRL_FREQ));

    gCurrentParameters[CP_SECCTRL0] = ((1 << CC2420_SECCTRL0_CBCHEAD) |
       (1 << CC2420_SECCTRL0_SAKEYSEL)  | (1 << CC2420_SECCTRL0_TXKEYSEL) |
       (1 << CC2420_SECCTRL0_SECM));

    gCurrentParameters[CP_SECCTRL1] = 0;
    gCurrentParameters[CP_BATTMON]  = 0;

    // set fifop threshold to greater than size of tos msg,
    // fifop goes active at end of msg
   /* gCurrentParameters[CP_IOCFG0]   = (((127) << CC2420_IOCFG0_FIFOTHR) |
        (1 <<CC2420_IOCFG0_FIFOPPOL)) ;*/
    	gCurrentParameters[CP_IOCFG0]   = (((127) << CC2420_IOCFG0_FIFOTHR) |
        (1 <<CC2420_IOCFG0_FIFOPPOL)) ;
         gCurrentParameters[CP_IOCFG0]|=1<<CC2420_IOCFG0_BCNACCEPT; //add
    gCurrentParameters[CP_IOCFG1]   =  0;

}


int SetRegs(void){
    int data;
/*
   HPLCC2420_write(CC2420_IOCFG0, gCurrentParameters[CP_IOCFG0]);
	HPLCC2420_write(CC2420_FSCTRL, gCurrentParameters[CP_FSCTRL]);
		
     HPLCC2420_write(CC2420_MDMCTRL0, gCurrentParameters[CP_MDMCTRL0]);
    data =  HPLCC2420_read(CC2420_MDMCTRL0);
    if (data != gCurrentParameters[CP_MDMCTRL0]) return 0;
    //return 1;
*/
   HPLCC2420_write(CC2420_MAIN,gCurrentParameters[CP_MAIN]);   		
   HPLCC2420_write(CC2420_MDMCTRL0, gCurrentParameters[CP_MDMCTRL0]);
    data =   HPLCC2420_read(CC2420_MDMCTRL0);
    if (data != gCurrentParameters[CP_MDMCTRL0]) return 0;

     HPLCC2420_write(CC2420_MDMCTRL1, gCurrentParameters[CP_MDMCTRL1]);
     HPLCC2420_write(CC2420_RSSI, gCurrentParameters[CP_RSSI]);
     HPLCC2420_write(CC2420_SYNCWORD, gCurrentParameters[CP_SYNCWORD]);
     HPLCC2420_write(CC2420_TXCTRL, gCurrentParameters[CP_TXCTRL]);
     HPLCC2420_write(CC2420_RXCTRL0, gCurrentParameters[CP_RXCTRL0]);
     HPLCC2420_write(CC2420_RXCTRL1, gCurrentParameters[CP_RXCTRL1]);
      HPLCC2420_write(CC2420_FSCTRL, gCurrentParameters[CP_FSCTRL]);

     HPLCC2420_write(CC2420_SECCTRL0, gCurrentParameters[CP_SECCTRL0]);
     HPLCC2420_write(CC2420_SECCTRL1, gCurrentParameters[CP_SECCTRL1]);
      HPLCC2420_write(CC2420_IOCFG0, gCurrentParameters[CP_IOCFG0]);
     HPLCC2420_write(CC2420_IOCFG1, gCurrentParameters[CP_IOCFG1]);

     HPLCC2420_cmd(CC2420_SFLUSHTX);    //flush Tx fifo
     HPLCC2420_cmd(CC2420_SFLUSHRX);

 return 1;

}

void Set_MAC_ShortAddress(void)
{
  unsigned char MAC_ShortAddr[2];
  MAC_ShortAddr[0] = LOCAL_ADDRESS & 0xff;
  MAC_ShortAddr[1] = (LOCAL_ADDRESS >> 8) &0xff;
  HPLCC2420_RAMwrite(CC2420_RAM_SHORTADR,2,MAC_ShortAddr);
}
/*初始化CC2420,开启接收网络功能*/
int HPLCC2420_ini(){
	HPLCC2420_cmd(CC2420_SXOSCON);//HPLCC2420_cmd(0x01);    //
	 RfRegInit();  	
         if(!SetRegs()) {P5DIR=0x20;P5OUT&=~0x20;return 0;}
	  halRfWaitForCrystalOscillator();
	
	Set_MAC_ShortAddress();

	flushRxfifo();//HPLCC2420_cmd(CC2420_SFLUSHRX);//HPLCC2420_cmd(0x08);//FASTSPI_STROBE(CC2420_SFLUSHRX);//0x08
	HPLCC2420_cmd(CC2420_SFLUSHTX);	 //flush tx
	HPLCC2420_cmd(CC2420_SRXON);//HPLCC2420_cmd(0x03);//FASTSPI_STROBE(CC2420_SRXON);//0x03
        return 1;
}
int cc2420init()
{
   CC2420_Set_PIN_DIR();//置引脚状态

    //PHY_Enable
    SET_PHY_VREG_EN(1);//Enable voltage regulator

    delay();              //wait 1ms
    //PHY_RESET
    SET_PHY_RESETn(0);//P6OUT &= ~0x40;   //reset
    delay();             //wait 1ms
    SET_PHY_RESETn(1);//P6OUT |= 0x40;
    delay();             //wait 1ms
    //power down status now
    return (HPLCC2420_ini());
  
}

⌨️ 快捷键说明

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