//----------------------------------------------------//
//-------Institute Of Computing Technology-----------//
//------------Chinese Academic Science---------------//
//-----中国科学院计算技术研究所先进测试技术实验室-----//
//----------------------------------------------------//
/**
* www.wsn.net.cn
* @copyright:nbicc_lpp
* @data:2006.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 倍速SPI选择
SPCR |= 1 << 4; //选择SPI主机工作模式
SPCR &= ~(1 << 3); //CPOL位为0,sck在闲置时是低电平
SPCR &= ~(1 << 2); //CPHA位为0,上升延数据锁存,下降延数据建立
SPCR &= ~(1 << 1);
SPCR &= ~(1 << 0);
SPCR |= 1 << 6; //允许SPI接口
}
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 (!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空间,等待中!");
return SUCCESS;
}
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)) {
}