⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main._c

📁 CC1000通信
💻 _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 + -