📄 main._c
字号:
#include "CC1000.h"
#include "iom128v.h"
#define flag 0
#define MAX 3
//flag 1 is TX,0 is RX ;MAX is long of receive data buf
//=======================================================
// CC1000的参数
//=======================================================
/*const unsigned char Configuration[] =
{
0x58, // 0x01, FREQ_2A
0x20, // 0x02, FREQ_1A
0x00, // 0x03, FREQ_0A
0x58, //0x42, // 0x04, FREQ_2B
0x06, //0x15, // 0x05, FREQ_1B
0x25, //0x78, // 0x06, FREQ_0B
0x00, // 0x07, FSEP1
0xc8, // 0x08, FSEP0
0x63, //0x81, // 0x09, CURRENT
0x12, // 0x0A, FRONT_END
0xFF, // 0x0B, PA_POW
0x18, //0x48, // 0x0C, PLL
0x10, // 0x0D, LOCK
0x26, // 0x0E, CAL
0x8e, // 0x0F, MODEM2
0x6c, // 0x10, MODEM1
0x2B, //0x27, // 0x11, MODEM0
0x70, // 0x12, MATCH
0x01, // 0x13, FSCTRL
0x00, // 0x1C, PRESCALER
0x10, // 40h test6
0x08, // 41h test5
0x25, // 42h, TEST4
0x04, // 43h,test3
0x00, // 44h,test2
0x00, // 45h,test1
0x00, // 46h,test0
};
*/
const unsigned char ConfigurationTX[] =
{
0x58, // 0x01, FREQ_2A
0x20, // 0x02, FREQ_1A
0x00, // 0x03, FREQ_0A
0x42, // 0x04, FREQ_2B
0x14, //0x15, // 0x05, FREQ_1B
0x9C, //0x78, // 0x06, FREQ_0B
0X02,//0x00, // 0x07, FSEP1
0X80,//0xc8, // 0x08, FSEP0
0x81, // 0x09, CURRENT
0X12,//0x10, // 0x0A, FRONT_END
0X0F,//0xFF, // 0x0B, PA_POW
0x48, // 0x0C, PLL
0x10, // 0x0D, LOCK
0x26, // 0x0E, CAL
0x8C, // 0x0F, MODEM2
0x79, // 0x10, MODEM1 //Manchester
0x2B, // 0x11, MODEM0 //Manchester is 0x27 UART is 0x2B NRZ is 0x23
0x70, // 0x12, MATCH
0x01, // 0x13, FSCTRL
0x00, // 0x1C, PRESCALER
0x10, // 40h test6
0x08, // 41h test5
0x25, // 42h, TEST4
0x04, // 43h,test3
0x00, // 44h,test2
0x00, // 45h,test1
0x00, // 46h,test0
};
const unsigned char ConfigurationRX[] =
{
0x58, // 0x01, FREQ_2A
0x20, // 0x02, FREQ_1A
0x00, // 0x03, FREQ_0A
0x42, // 0x04, FREQ_2B
0x14, //0x15, // 0x05, FREQ_1B
0x9C, //0x78, // 0x06, FREQ_0B
0X02,//0x00, // 0x07, FSEP1
0X80,//0xc8, // 0x08, FSEP0
0x44, // 0x09, CURRENT
0X12,//0x10, // 0x0A, FRONT_END
0X0F,//0xFF, // 0x0B, PA_POW
0x60, // 0x0C, PLL
0x10, // 0x0D, LOCK
0x26, // 0x0E, CAL
0x8E, // 0x0F, MODEM2
0x79, // 0x10, MODEM1 //Manchester
0x2B, // 0x11, MODEM0 //Manchester is 0x27 UART is 0x2B NRZ is 0x23
0x70, // 0x12, MATCH
0x01, // 0x13, FSCTRL
0x00, // 0x1C, PRESCALER
0x10, // 40h test6
0x08, // 41h test5
0x25, // 42h, TEST4
0x04, // 43h,test3
0x00, // 44h,test2
0x00, // 45h,test1
0x00, // 46h,test0
};
void delay(int t)
{
int i,j;
for(i = 0;i < t;i++)
for(j = 0;j < t;j++);
}
void C1000_TX_MODE(void)
{
/*WriteToCC1000Register(CC1000_MAIN,0xe1); // set to TX mode
//WriteToCC1000Register(CC1000_PA_POW,0xFF); // no output power needed
WriteToCC1000Register(CC1000_CURRENT,0x60); // set TX current level
WriteToCC1000Register(CC1000_PLL,0x18);
WriteToCC1000Register(CC1000_PA_POW,0xFF);
*/
char MainValue;
MainValue=ReadFromCC1000Register(CC1000_MAIN);
WriteToCC1000Register(CC1000_MAIN,(MainValue & 0xE1) | 0xC0); //RXTX=1,F_REG=1,TX_PD=0,FS_PD=0
WriteToCC1000Register(CC1000_PA_POW,0x00);
WriteToCC1000Register(CC1000_CURRENT, 0x81);//68
WriteToCC1000Register(CC1000_PLL, 0x48);
delay(12);
WriteToCC1000Register(CC1000_PA_POW,0x08);
delay(2);
}
void C1000_RX_MODE(void)
{
/*WriteToCC1000Register(CC1000_MAIN,0x17); // set to RX mode//原先是x11
//WriteToCC1000Register(CC1000_PA_POW,0xFF); // no output power needed
WriteToCC1000Register(CC1000_CURRENT,0x70); // set TX current level
WriteToCC1000Register(CC1000_PLL,0x18);
delay(12);
*/
char MainValue;
MainValue=ReadFromCC1000Register(CC1000_MAIN);
WriteToCC1000Register(CC1000_MAIN,(MainValue & 0x11) ); //RXTX=0,F_REG=0,RX_PD=0,FS_PD=0
WriteToCC1000Register(CC1000_PA_POW,0x00);
WriteToCC1000Register(CC1000_CURRENT, 0x44);//0x44
WriteToCC1000Register(CC1000_PLL, 0x60);
delay(12);
}
void init_usart(void)
{
UCSR0B = 0x00;
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x67; //BOUDRATE 2400
UBRR0H = 0x00;
UCSR0B = 0x18;
}
void Init()
{
char MainValue;
char addr;
WriteToCC1000Register(CC1000_MAIN,0x3F); // Put CC1000 into power-down
WriteToCC1000Register(CC1000_PA_POW,0x00); // Turn off PA to minimise current draw
MainValue=ReadFromCC1000Register(CC1000_MAIN);
WriteToCC1000Register(CC1000_MAIN,MainValue & 0xFE); // Reset CC1000 原先是WriteToCC1000Register(CC1000_MAIN,MainValue & 0xFA);by yu
WriteToCC1000Register(CC1000_MAIN,MainValue | 0x01);
WriteToCC1000Register(CC1000_MAIN,0x3A);
delay(38);
for(addr = 1; addr <= 0x1c; addr ++)
WriteToCC1000Register(addr, ConfigurationRX[addr - 1]);
//WriteToCC1000Register(addr, ConfigurationRX[addr - 1]);
/////////////////////////////////////////by yu //////////////////////////////////////////////
WriteToCC1000Register(0x1c,0x00); //仿造Pic 里的void ConfigureCC1000()
///////////////////////////////////////////////////////////////////////////////////////
for(addr = 0x40; addr <= 0x46; addr ++)
WriteToCC1000Register(addr, ConfigurationTX[addr - 0x40 + 0x14]);
//WriteToCC1000Register(addr, ConfigurationRX[addr - 0x40 + 0x14]);
//原先是WriteToCC1000Register(addr, Configuration[addr - 0x40 + 0x1C]);
/*
//////////////////////////////添加小郭的程序////////////////////////////////////////////////////////////
WriteToCC1000Register(CC1000_MAIN,0x3a); //RXTX=0;F_REQ=0(RX:Register A ,TX:Register B);RX_PD=1;TX_PD=1;FS_PD=1;CORE_PD=0;BIAS_PD=1;REST_N=0
WriteToCC1000Register(CC1000_PA_POW,0x00);
WriteToCC1000Register(CC1000_MAIN,0x3b);
//cal_complete=ReadfromCC1000Register(CC1000_MAIN);
// cal_complete=0;
// WriteToCC1000Register(CC1000_MAIN,cal_complete);
delay(35);
// WriteToCC1000Register(CC1000_MAIN,0x01);
// writes 24-bit frequency value used for RX to 433.9164 MHz.
// Check CC1000 data sheet for equations used to find
// 0x582000.
WriteToCC1000Register(CC1000_FREQ_2A,0x58);
WriteToCC1000Register(CC1000_FREQ_1A,0x20);
WriteToCC1000Register(CC1000_FREQ_0A,0x00);
// writes 24-bit frequency value used for TX to 433.9164 MHz.
// Check CC1000 data sheet for equations used to find
// 0x448856.
WriteToCC1000Register(CC1000_FREQ_2B,0x42);
WriteToCC1000Register(CC1000_FREQ_1B,0x14);
WriteToCC1000Register(CC1000_FREQ_0B,0x9C);
// sets frequency separation between 0 value and 1 value
//设定误码率
WriteToCC1000Register(CC1000_FSEP1,0x02);
WriteToCC1000Register(CC1000_FSEP0,0x80);
WriteToCC1000Register(CC1000_CURRENT,0x81);
// sets some internal current levels, and enables RSSI output to pin
WriteToCC1000Register(CC1000_FRONT_END,0x12);
WriteToCC1000Register(CC1000_PA_POW,0xff);
// sets the PLL reference divider to divide by 6
WriteToCC1000Register(CC1000_PLL,0x18);
// sets External LNA control lock indicator to output on the CHP_OUT pin
WriteToCC1000Register(CC1000_LOCK,0x10);
WriteToCC1000Register(CC1000_CAL,0x26);
// sets threshold level for peak detector (not used in this design)
WriteToCC1000Register(CC1000_MODEM2,0x8E);
// sets the averaging filter to free-running and controlled by writes
// to bit 4 of this register.
// Sets averaging filter sensitivity to .6dB worst-case loss of sensitivity
WriteToCC1000Register(CC1000_MODEM1,0x6F);
// baud rate to 2.4 k, Manchester, and crystal freq. to 11.0592 MHz
WriteToCC1000Register(CC1000_MODEM0,0x2B);
// sets capacitor array values for RX and TX
WriteToCC1000Register(CC1000_MATCH,0x70);
// disables dithering and data shaping
WriteToCC1000Register(CC1000_FSCTRL,0x01);
// sets prescaling to nominal values
WriteToCC1000Register(CC1000_FSHAPE7,0x1c);
WriteToCC1000Register(CC1000_FSHAPE6,0x16);
WriteToCC1000Register(CC1000_FSHAPE5,0x10);
WriteToCC1000Register(CC1000_FSHAPE4,0x0a);
WriteToCC1000Register(CC1000_FSHAPE3,0x06);
WriteToCC1000Register(CC1000_FSHAPE2,0x03);
WriteToCC1000Register(CC1000_FSHAPE1,0x01);
WriteToCC1000Register(CC1000_FSDELAY,0x1f);
WriteToCC1000Register(CC1000_PRESCALER,0x00);
WriteToCC1000Register(CC1000_TEST6,0x10);
WriteToCC1000Register(CC1000_TEST5,0x08);
WriteToCC1000Register(CC1000_TEST4,0x25);
WriteToCC1000Register(CC1000_TEST3,0x04);
WriteToCC1000Register(CC1000_TEST2,0x00);
WriteToCC1000Register(CC1000_TEST1,0x00);
WriteToCC1000Register(CC1000_TEST0,0x00);
//////////////////////////////////////////////////////////////////////////////////////////
*/
WakeUpCC1000ToRX(0x44,0x60);
//设置DIO为输入
//PORTE = 0x00;
//DDRE = 0x00;
while(!CalibrateCC1000());
//////////////////////
WakeUpCC1000ToTX(0x81,0x48); //PIC的程序与数据手册上的算法正好反了,先RX,再TX的
//设置DIO为输出
// PORTE = 0x00;
// DDRE = 0x40;
while(!CalibrateCC1000());
/////////////////
//SetupCC1000TX(0x44,0x60);
/*
WriteToCC1000Register(CC1000_MAIN,0x3F); //
WriteToCC1000Register(CC1000_PA_POW,0x00); // Power down
MainValue=ReadFromCC1000Register(CC1000_MAIN);
WriteToCC1000Register(CC1000_MAIN,MainValue & 0xFB); // CORE_PD=0
delay(38);
MainValue=ReadFromCC1000Register(CC1000_MAIN);
WriteToCC1000Register(CC1000_MAIN,MainValue & 0xFD); // BLAS_PD=0
delay(12);
MainValue=ReadFromCC1000Register(CC1000_MAIN);
WriteToCC1000Register(CC1000_MAIN,(MainValue & 0xE7) | 0xC0); //RXTX=1,F_REG=1,TX_PD=0,FS_PD=0
WriteToCC1000Register(CC1000_PA_POW,0x00);
WriteToCC1000Register(CC1000_CURRENT, 0x81);
WriteToCC1000Register(CC1000_PLL, 0x48);
delay(12);
WriteToCC1000Register(CC1000_PA_POW,0x80);
delay(2);
*/
//1-----------
// SetupCC1000RX(0x44,0x60);
//2-------------------
MainValue=ReadFromCC1000Register(CC1000_MAIN);
WriteToCC1000Register(CC1000_MAIN,MainValue & 0xFB); // CORE_PD=0
delay(38);
MainValue=ReadFromCC1000Register(CC1000_MAIN);
WriteToCC1000Register(CC1000_MAIN,MainValue & 0xFD); // BLAS_PD=0
delay(12);
}
//******************************************************//
unsigned char SoftUART_Send(unsigned char data)
{
///while (!CHECK_BIT(UCSR0A,1<<UDRE0));
int i,j;
UDR0 = data ;
for(i=0;i<200;i++)
for(j=0;j<200;j++);
///while (!CHECK_BIT(UCSR0A, 1<<TXC0));
return 0;
}
//****************************************************************
unsigned char SoftUART_Receive(void) //USART0接收数据
{
while ((UCSR0A&(1<<RXC0))==(1<<RXC0)) return UDR0;
return 0;
}
//********************************************************
int main(void)
{
unsigned char sycode,precode,endcode,rdata;
unsigned char databuf[MAX];
int i;
//DDRB = 0x46 ;
//DDRA = 0x40 ;
//DDRE = 0x40 ;
DDRD = 0x3E;
init_usart();
Init();
//CC1000_init();
if(flag)
{
C1000_TX_MODE();
//SetupCC1000TX(0x81,0x48); //切换到发射状态
//PORTE = 0x00;
//DDRE = 0x40;
while(1)
{
SoftUART_Send(0x55);
SoftUART_Send(0xFF);
for(i=0;i<MAX;i++)
{
SoftUART_Send(0x33);
}
}
return 0;
}
else
{
C1000_RX_MODE();
// WakeUpCC1000ToRX(0x44,0x60);
//SetupCC1000RX(0x38,0x60); //切换到接收状态
//SetupCC1000RX(0x44,0x60); //切换到接收状态
//PORTE = 0x00;
//DDRE = 0x00;
while(1)
{
AverageFreeRunCC1000();
sycode = SoftUART_Receive();
precode = SoftUART_Receive();
if(sycode == 0x55)
{
AverageManualLockCC1000();
// if(precode == 0xFF)
// {
SoftUART_Send(sycode);
SoftUART_Send(precode);
for(i=0;i<MAX;i++)
{
databuf[i] = SoftUART_Receive();
SoftUART_Send(databuf[i]);
}
// }
}
//endcode = SoftUART_Receive();
}
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -