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

📄 cc2420init.c

📁 CC2420基本收发功能的实现。mcu:msp430
💻 C
字号:
#include "port_config_CC2420.h"
#include "cc2420const.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++);
}
int isTxIntrPending()	//TXFIFO EMPTY 返回true
{
  if (IFG1 & UTXIFG0){
    IFG1 &= ~UTXIFG0;
    return 1;
  }
  return 0;
}
int isRxIntrPending()//RXFIFO FULL 返回true
{
  if (IFG1 & URXIFG0){
    IFG1 &= ~URXIFG0;
    return 1;
  }
  return 0;
}
void SPI_Tx(unsigned char data) //SPI tx
{
  while((UTCTL0 & 0x01 )!=0x01);
  TXBUF0 = data;

}
unsigned char SPI_Rx() //SPI rx
{
  unsigned char data;
  data = RXBUF0;
  return data;
}
void HPLCC2420_cmd(char addr) {


   P4OUT &= ~0x04;
      isTxIntrPending();
      SPI_Rx();
      SPI_Tx(addr);
      while(!(isRxIntrPending())) ;
   P4OUT |= 0x04;



}
void halRfWaitForCrystalOscillator(){
	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
}
 /**
   * Read 16-bit data
   *
   * @return 16-bit register value
   */
int HPLCC2420_read(char addr) {
    int data = 0;
    PHY_Selected();
      isTxIntrPending();
      SPI_Rx();
      SPI_Tx(addr | 0x40);
      while(!isRxIntrPending()) ;
      SPI_Rx();
      SPI_Tx(0);
      while(!(isRxIntrPending())) ;
      data = SPI_Rx();
      SPI_Tx(0);
      while( !(isRxIntrPending())) ;
      data = ((data << 8) & 0x0FF00 )| (SPI_Rx() & 0x0FF);
    PHY_Deselected();
   return data;
}
void flushRxfifo(void)
{
     HPLCC2420_read(CC2420_RXFIFO);          //flush Rx fifo
     HPLCC2420_cmd(0x08);//FASTSPI_STROBE(CC2420_SFLUSHRX);
     HPLCC2420_cmd(0x08);//FASTSPI_STROBE(CC2420_SFLUSHRX);
}
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]=0x0AF2;
     //0b 0000 1010 1111 0010
//#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) |
        (0 <<CC2420_IOCFG0_FIFOPPOL)) ;
         gCurrentParameters[CP_IOCFG0]|=1<<CC2420_IOCFG0_BCNACCEPT; //add
    gCurrentParameters[CP_IOCFG1]   =  0;

}
int isTxEmpty(){//发送缓冲区为空返回true
    if (U0TCTL & TXEPT) {
      return 1;
    }
    return 0;
}
char HPLCC2420_write(char addr, int data) {
    char status = 0;
    PHY_Selected();

      isTxIntrPending();
     SPI_Rx();
     SPI_Tx(addr);

      while(!(isRxIntrPending())) ;


      status = (SPI_Rx()&0x7E);
      SPI_Tx((data >> 8) & 0x0FF);
      while( !(isTxIntrPending())) ;
      SPI_Tx(data & 0x0FF);
      while(!(isTxEmpty())) ;
      PHY_Deselected();
    return status;
}
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;

}
/*初始化CC2420,开启接收网络功能*/
void HPLCC2420_ini(){
	HPLCC2420_cmd(CC2420_SXOSCON);//HPLCC2420_cmd(0x01);    //
	   halRfWaitForCrystalOscillator();
        RfRegInit();  	
	if(!SetRegs())return;
	
	
	

	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

}
void 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
    HPLCC2420_ini();

    //enable I/O receive interrupt
 P1IES = 0X00;
    P1IE = 0x01;//BIT0; //PKT_INT  FIFOP ,Rising Edge
    P1IFG = 0X00;
}

⌨️ 快捷键说明

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