📄 cc2420.c~
字号:
#include <mega128.h>
#include <spi.h>
#include <delay.h>
#include "typedef.h"
#include "app.h"
#include "cc2420.h"
#include "serialdrv.h"
#include "18B20.h"
bit receive_ok = 0;
bit on_ok = 0;
unsigned char cc2420_data_send[CC2420_MAX];
unsigned char cc2420_data_recive[CC2420_MAX];
unsigned char cc2420_data_temp[CC2420_MAX];
#pragma warn-
eeprom unsigned char SET_OUT;
#pragma warn+
unsigned int HOME_ID;
unsigned int MY_ID;
unsigned int CALL_TIMER;
// SPI functions
// SPI interrupt service routine
/*interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
data=SPDR;
// Place your code here
}*/
void myid_no(unsigned char value)
{
HOME_ID = 10001;
MY_ID = 18180 + value;
CALL_TIMER = 30000 + value; //60000
}
void cc2420_initial(void)
{
unsigned int i;
myid_no(NAME_NO);
if (SET_OUT > 1) //8
SET_OUT = 0;
if (SET_OUT)
{
RELAY1 = 1;
RELAY2 = 0;
delay_ms(1000);
wdr();
led_send0(1);
WORK_LED = 0; //ON
on_ok = 1;
}
else
{
RELAY1 = 0;
RELAY2 = 0;
// delay_ms(1000);
wdr();
// led_send0(0);
WORK_LED = 1; //OFF
}
// CC2420 initialization
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 115.200 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x52;
SPSR=0x00;
for (i=0;i<CC2420_MAX;i++)
{
cc2420_data_send[i]=0x00;
cc2420_data_recive[i]=0x00;
}
}
void cc2420_ready(void)
{
unsigned int i;
VREG_EN=0;
delay_ms(100); //100ms //100
VREG_EN=1;
delay_ms(5); //0.6ms //5
RESETn=0;
delay_ms(50); //100ms //100
RESETn=1;
wdr();
CSn=0;
i=spi(SXOSCON);
delay_ms(2); //0.86ms //5
while ((i&0x40)==0)
{
i=spi(SXOSCON);
wdr();
}
i=spi(SFLUSHRX);
i=spi(SFLUSHTX);
i=spi(MAIN);
i=spi(0xF8);
i=spi(0x00);
i=spi(MDMCTRL0);
i=spi(0x02); //0A
i=spi(0xE2);
i=spi(MDMCTRL1);
i=spi(0x05);
i=spi(0x00);
i=spi(RSSI);
i=spi(0xE0);
i=spi(0x80);
i=spi(SYNCWORD);
i=spi(0xA7);
i=spi(0x0F);
i=spi(TXCTRL);
i=spi(0xA0);
i=spi(0xFF);
i=spi(RXCTRL0);
i=spi(0x12);
i=spi(0xE5);
i=spi(RXCTRL1);
i=spi(0x0A);
i=spi(0x56);
i=spi(FSCTRL);
i=spi(0x41);
i=spi(0x65);
i=spi(SECCTRL0);
i=spi(0x01); //03
i=spi(0xC4);
i=spi(SECCTRL1);
i=spi(0x00);
i=spi(0x00);
i=spi(BATTMON);
i=spi(0x00);
i=spi(0x00);
i=spi(IOCFG0);
i=spi(0x00);
i=spi(0x40);
i=spi(IOCFG1);
i=spi(0x00);
i=spi(0x00);
i=spi(FSMTC);
i=spi(0x7A);
i=spi(0x94);
i=spi(MANAND);
i=spi(0xFF);
i=spi(0xFF);
i=spi(MANOR);
i=spi(0x00);
i=spi(0x00);
i=spi(AGCCTRL);
i=spi(0x07);
i=spi(0xF0);
i=spi(AGCTST0);
i=spi(0x36);
i=spi(0x49);
i=spi(AGCTST1);
i=spi(0x08);
i=spi(0x54);
i=spi(AGCTST2);
i=spi(0x01);
i=spi(0x2A);
i=spi(FSTST0);
i=spi(0x02);
i=spi(0x00);
i=spi(FSTST1);
i=spi(0x50);
i=spi(0x02);
i=spi(FSTST2);
i=spi(0x06);
i=spi(0x00);
i=spi(FSTST3);
i=spi(0x82);
i=spi(0xDD);
i=spi(RXBPFTST);
i=spi(0x00);
i=spi(0x00);
i=spi(FSMSTATE);
i=spi(0x00);
i=spi(0x00);
i=spi(ADCTST);
i=spi(0x00);
i=spi(0x00);
i=spi(DACTST);
i=spi(0x00);
i=spi(0x00);
i=spi(TOPTST);
i=spi(0x00);
i=spi(0x10);
i=spi(SRXON);
CSn=1;
CSn=0;
i=spi(SRXON);
CSn=1;
wdr();
}
void cc2420_send(unsigned char ncont)
{
unsigned char i;
while (SFD);
CSn=0;
i=spi(SFLUSHTX);
CSn=1;
CSn=0;
i=spi(TXFIFO);
for (i=0; i<ncont; i++)
{
spi(cc2420_data_send[i]);
}
CSn=1;
CSn=0;
i=spi(STXON);
while (SFD);
CSn=1;
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
unsigned char i,j;
// memset(cc2420_data_recive, 0x00, CC2420_MAX);
if (FIFO)
{
CSn=0;
i=spi(0x7f);
if (FIFO)
{
cc2420_data_recive[0] = spi(SNOP);
j = 0;
while ((FIFO == 1) && (j < cc2420_data_recive[0]))
{
wdr();
cc2420_data_recive[++j] = spi(SNOP);
if(j > CC2420_MAX)
break;
}
}
CSn=1;
receive_ok = 1;
/* for (nloop = 0; nloop < (RECV_NO+1); nloop ++)
{
cc2420_data_temp[nloop] = cc2420_data_recive[nloop];
}*/
wdr();
CSn=0;
i=spi(SFLUSHRX);
i=spi(SFLUSHRX);
CSn=1;
}
}
unsigned char cc2420_receive(unsigned char ncont)
{
unsigned char i,j;
if (FIFO)
{
CSn=0;
i=spi(0x7f);
j = 0;
if (FIFO)
{
cc2420_data_recive[0] = spi(SNOP);
j = 0;
while ((FIFO == 1) && (j < cc2420_data_recive[0]))
{
wdr();
cc2420_data_recive[++j] = spi(SNOP);
if(j > ncont)
break;
}
}
CSn=1;
wdr();
CSn=0;
i=spi(SFLUSHRX);
i=spi(SFLUSHRX);
CSn=1;
wdr();
return 1;
}
return 0;
}
void cc2420_deal(void)
{
unsigned char szsum;
unsigned char nloop;
unsigned int nTemp;
for (nloop = 0; nloop < (RECV_NO+1); nloop ++)
{
cc2420_data_temp[nloop] = cc2420_data_recive[nloop];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -