📄 main.c.bak
字号:
/******************************************************************
PROJECT:chipcon DEMO
PART:master
RF: CC1100 or cc2500 or cc1000(Chipcon)
MCU: PIC16F877A(Microchip)
Designed : Ben xie(Infortech)
Date : 2006-1
Checksum:
******************************************************************/
#include <pic.h>
#include "pic_setting.h"
#include "CCxxx0.h"
#include "cc1000.h"
#include "CCxxx0LIB.C"
#include "cc1000pic.c"
BYTE paTable_CC1100[] = {0xc0, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F };
BYTE paTable_CC2500[] = {0xFF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F };
BYTE txBuffer_CCxx00[] = {2, 1, 1};
BYTE rxBuffer_CCxx00[2];
BYTE dpybuffer[10]={0x11,0xF9,0x23,0x61,0xC9,0x45,0x05,0xF1,0x01,0x41};
//////////////////////////////////////////////////////////////////////
static void interrupt
isr(void) // Here be interrupt function - the name is
// unimportant.
{
if(INTF)
{
switch (State)
{
case 2://TX_STATE:
if(ShiftReg&0x80) DIO=1;
else DIO=0;
ShiftReg=ShiftReg<<1;
BitCounter++;
if(BitCounter==8)
{
BitCounter=0;
ShiftReg=TXBuffer[TXBufferIndex++];
if(TXBufferIndex>sizeof(TXBuffer))
{
TXBufferIndex=0;
BitCounter = 0;
ShiftReg = 0x00;
flag.TX_End=1;
RXBufferWriteIndex=0;
State=IDLE_STATE;
while(!DCLK) ;
while(DCLK) ;
DIO=0;
}
}
break;
case 1://RX_STATE:
if(flag.PreambleEnd)
{
l_start_rec:
ShiftReg=ShiftReg<<1;
if(DIO) ShiftReg=ShiftReg|0x01;
else ShiftReg=ShiftReg&0xFE;
BitCounter++;
if(BitCounter==8)
{
BitCounter=0;
RXBuffer[RXBufferWriteIndex]=ShiftReg;
RXBufferWriteIndex++;
if(RXBufferWriteIndex>BytesToReceive)
{
flag.RX_OK=1;
BitCounter=0;
RXBufferWriteIndex=0;
State=IDLE_STATE;
GIE = 0;
}
}
}
else
{
flag.PreambleFound=0;
if(flag.PreambleNextbit)
{
if(DIO) flag.PreambleNextbit=0;
else
{
flag.PreambleFound=0; //error
State=IDLE_STATE;
}
}
else
{
if(!DIO) flag.PreambleNextbit=1;
else
{
flag.PreambleEnd=1;
BitCounter=0;
goto l_start_rec;
}
}
}
break;
case 0://IDLE_STATE:
// flag.RX_OK=0;
if(flag.PreambleNextbit)
{
if(DIO)
{
flag.PreambleNextbit=0;
BitCounter++;
if(BitCounter==24)
flag.PreambleFound=1;
}
else
{
flag.PreambleNextbit=0; //error
BitCounter=0;
}
}
else
{
if(!DIO)
{
flag.PreambleNextbit=1;
BitCounter++;
}
else
{
flag.PreambleNextbit=0; //error
BitCounter=0;
}
}
if(flag.PreambleFound)
{
BitCounter=0;
ByteCounter=0;
RXBufferWriteIndex=0;
flag.PreambleEnd=0;
State = RX_STATE;
}
break;
default:
State=IDLE_STATE;
break;
}
INTF=0;
}
}
/////////////////////////////////////////////////////////////
//
//initialize PIC16F877A
//
/////////////////////////////////////////////////////////////
void InitPIC16F877A() {
// TRISA=RACNF;
TRISB=RBCNF;
TRISC=RCCNF;
CMCON=0x07; //COMPARATOR OFF
ADCON1=0x06; //ADC OFF
TRISE=0;
OPTION=0x87;
T1CON=0x31;
PORTC=0X00; //数码管 On
Dly1mS(300);
PORTC=0Xff; //数码管 Off
}
//=============================================================
//
//=============================================================
void SetupCCxx00(void)
{
TRISA=RACNF_RF4;
P_SCLK=0;
P_CSn=1;
P_SI=0;
POWER_UP_RESET_CCxx00();
if(Current_State=CC1100_State)
{
halRfWriteRfSettings_cc1100();
halSpiWriteBurstReg(CCxxx0_PATABLE, paTable_CC1100, sizeof(paTable_CC1100));
}
else
{
halRfWriteRfSettings_cc2500();
halSpiWriteBurstReg(CCxxx0_PATABLE, paTable_CC2500, sizeof(paTable_CC2500));
}
halSpiStrobe(CCxx00_SRX);
}
///////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////
void SetupCC1000(void)
{
TRISA=RACNF_RF2;
PCLK=1;
PDATA=1;
PALE=1;
SetupCC1000PD();
ResetCC1000();
ConfigureCC1000();
WakeUpCC1000ToTX(0x81,0x48);
TRISB&=~(0x02); // Set DIO as output
while(!CalibrateCC1000());
WakeUpCC1000ToRX(0x44,0x60);
TRISB|=0x02; // Set DIO as input
while(!CalibrateCC1000());
SetupCC1000RX(0x44,0x60);
State=IDLE_STATE;
INTEDG = 1; // rising edge trigger the interrupt
INTE = 1; // enable the external interrupt
PEIE=1;
GIE = 1; // Global interrupt enable
}
//=============================================================
//
//=============================================================
void CheckState(void)
{
Current_key=PORTB|0xc3;
switch(Current_key)
{
case SW1_KEY:
Current_State=CC1100_State;
break;
case SW2_KEY:
Current_State=CC1000_State;
break;
default:
Current_State=CC2500_State;
break;
}
while((PORTB|0xc3)!=0xff) ;
}
//=============================================================
// scan key
//=============================================================
BYTE KeyScan(void)
{
OPTION=0x07;
TMR0=0; T0IF=0;
while(1)
{
if(T0IF) goto l_exit_key;
Current_key=PORTB|0xc3;
if(Current_key!=Old_key)
{
Dly1mS(20);
Current_key=PORTB|0xc3;
if(Current_key!=Old_key)
{
Old_key=Current_key;
if(Old_key!=0xff)
{
Keyflag=1;
goto l_exit_key;
}
else
Keyflag=0;
}
else
Keyflag=0;
}
else
Keyflag=0;
}
l_exit_key:
OPTION=0x87;
return(Keyflag);
}
//------------------------------------------------------------
// TX OPTION
//------------------------------------------------------------
//-------------------------------------------------------------
void TxCCxx00()
{
unsigned char i;
// halSpiWriteReg(0x3E,0xC0);
halSpiWriteReg(CCxx00_FREND0, 0x10);//POWER=10DBM
Dly1mS(50);
for(i=0;i<4;i++)
{
halRfSendPacket(txBuffer_CCxx00, sizeof(txBuffer_CCxx00));
Dly1mS(50);
}
// halSpiWriteReg(0x3E,0x7f); //POWER=0DBM
halSpiWriteReg(CCxx00_FREND0, 0x11);
Dly1mS(50);
halRfSendPacket(txBuffer_CCxx00, sizeof(txBuffer_CCxx00));
Dly1mS(100);
PORTC=0xFF;
}
//-----------------------------------------------------------
unsigned char RxCCxx00(void)
{
unsigned char length,i;
length = sizeof(rxBuffer_CCxx00);
if (halRfReceivePacket(rxBuffer_CCxx00, length))
{
i=rxBuffer_CCxx00[0];
PORTC=dpybuffer[i];
LED2=0;
LED1=1;
return 1;
}
else return 0;
}
void TestingCCxx00(void);
void TestingCC1100(void);
/////////////////////////////////////////////////////////////
//main program
//===========================================================
void main()
{
InitPIC16F877A();
CheckState();
switch(Current_State)
{
case CC2500_State:
SetupCCxx00();
TestingCCxx00();
break;
case CC1100_State:
SetupCCxx00();
TestingCCxx00();
break;
case CC1000_State:
SetupCC1000();
TestingCC1000();
break;
}
}
void TestingCCxx00(void)
{
while(1)
{
rfstate=halSpiReadStatus(CCxxx0_MARCSTATE);
if((rfstate& 0x1f)==0x00)
{
// LED1=0;
// LED2=0;
POWER_UP_RESET_CCxxx0();
if(Current_State=CC1100_State) halRfWriteRfSettings_cc1100();
else halRfWriteRfSettings_cc2500();
}
KeyScan();
if(Keyflag)
{
txBuffer[1]=0;
if(Old_key==SW1_KEY)
txBuffer_CCxx00[1]=1;
if(Old_key==SW2_KEY)
txBuffer_CCxx00[1]=2;
if(Old_key==SW3_KEY)
txBuffer_CCxx00[1]=3;
if(Old_key==SW4_KEY)
txBuffer_CCxx00[1]=4;
txBuffer_CCxx00[2]=0x01;
TxCCxxx0();
}
else
{
if(RxCCxxx0())
{
if(rxBuffer_CCxx00[1]==0x01)
{
txBuffer_CCxx00[2]=0x07;
txBuffer_CCxx00[1]=rxBuffer_CCxx00[0];
halSpiStrobe(CCxxx0_SIDLE);
Dly1mS(500);
TxCCxxx0();
}
else
if(rxBuffer_CCxx00[1]==0x07) Dly1mS(500);
}
}
}
}
//============================================================================
//
//===========================================================================
void TestingCC1000(void)
{
while(1)
{
KeyScan();
if(Keyflag)
{
GIE = 0;
TXBuffer[7]=0;
if(Old_key==SW1_key)
TXBuffer[7]=1;
if(Old_key==SW2_key)
TXBuffer[7]=2;
if(Old_key==SW3_key)
TXBuffer[7]=3;
if(Old_key==SW4_key)
TXBuffer[7]=4;
LED1=LED_ON;
SetupCC1000TX(0x81,0x48);
TRISB&=~(0x02); // Set DIO as output
INTEDG = 0; // falling edge trigger the interrupt
GIE = 1;
for(i=0;i<3;i++)
{
State=TX_STATE;
Dly1mS(50);
TXBuffer[6]=1;
ShiftReg=TXBuffer[0];
BitCounter=0;
TXBufferIndex=0;
flag.TX_End=0;
while(flag.TX_End) ;
DIO=0;
}
GIE = 0;
Dly1mS(50);
SetupCC1000RX(0x44,0x60);
flag.PreambleNextbit=1;
TRISB|=0x02; // Set DIO as input
INTEDG = 1; // rising edge trigger the interrupt
GIE = 1;
}
else
{
if(flag.RX_OK)
{
// GIE = 0;
LED2=LED_ON;
if(RXBuffer[0]==0xCA)
{
if(RXBuffer[1]==0x01)
{
PORTC=dpybuffer[RXBuffer[2]];
TXBuffer[6]=0;
TXBuffer[7]=RXBuffer[2];
Dly1mS(150);
SetupCC1000TX(0x81,0x48);
TRISB&=~(0x02); // Set DIO as output
INTEDG = 0; // falling edge trigger the interrupt
GIE = 1;
LED2=LED_OFF;
LED1=LED_ON;
for(i=0;i<3;i++)
{
State=TX_STATE;
Dly1mS(50);
ShiftReg=TXBuffer[0];
BitCounter=0;
TXBufferIndex=0;
flag.TX_End=0;
while(flag.TX_End) ;
}
GIE = 0;
Dly1mS(50);
SetupCC1000RX(0x44,0x60);
flag.PreambleNextbit=1;
TRISB|=0x02; // Set DIO as input
INTEDG = 1; // rising edge trigger the interrupt
GIE = 1;
}
else
PORTC=dpybuffer[RXBuffer[2]];
}
flag.RX_OK=0;
}
}
}
}
//=================================================================
// END
//=================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -