📄 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 + -