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

📄 uart._c

📁 cc1020 串口通讯
💻 _C
📖 第 1 页 / 共 2 页
字号:
		delay(10);
		if(PData == 1) itmp= itmp+1;
		Pclk_1;
		delay(10);
	}
	Pclk_0;
	PSEL_1;
//	P2MDOUT = 0xA0;
	DDRD  = 0x30;
	DDRB  = 0X03;
	return(itmp);
}		


/****************************************************************************/
/*  This routine writes to a single CC1020 register                         */
/****************************************************************************/
void WriteToCC1020Register(unsigned char addr, unsigned char value)
{
	unsigned char itmp = 0;
	unsigned char tmp=0;;
//	P2MDOUT = 0xE0;
		DDRD  = 0x30;
		DDRB  = 0X03;
	delay(10);
	PSEL_0;
	itmp = (addr&0x7f) <<1;
	itmp = itmp+1;
	for(tmp=8;tmp>0;tmp--){
		Pclk_0;
		if((itmp&0x80) == 0x80) PData_1;
		else         			PData_0;
		delay(10);
		Pclk_1;
		delay(10);
		itmp = itmp<<1;
	}

	itmp = value;
	for(tmp=8;tmp>0;tmp--){
		Pclk_0;
		if((itmp&0x80) == 0x80) PData_1;
		else         			PData_0;
		delay(10);
		Pclk_1;
		delay(10);
		itmp = itmp<<1;
	}
	Pclk_0;
	PSEL_1;
//	P2MDOUT = 0xA0;
		DDRD  = 0x30;
		DDRB  = 0X03;
} 
 
 void SetupAGC(void)
{                                        
  // int RSSI1,RSSI2;
  // unsigned char vga;
   WriteToCC1020Register(CC1020_VGA2,0xbf);    //disable agc LNA2gain maximun
   WriteToCC1020Register(CC1020_VGA3,0x20);   //vga_setting=0
   
   //test rssi
/*   for(int i=0x0300;i>0;i--);
   RSSI1=ReadRSSIlevelCC1020()*4;
   for( vga=0;vga<31;vga++)
   {
     //WriteToCC1020Register(CC1020_VGA3,(0x20+vga));   //vga_setting=vga
     RSSI2=ReadRSSIlevelCC1020();
     if(RSSI2>RSSI1) break;     
   } */
   
   //vga_setting=vga
   WriteToCC1020Register(CC1020_VGA3,(0x20+15));   
   //enable agc
   WriteToCC1020Register(CC1020_VGA2,0x55);
   //set cs_level
   WriteToCC1020Register(CC1020_VGA4,0x20+25); 
//   _NOP();
}

 /****************************************************************************/
/*  This routine wakes the CC1020 up from PD mode to RX mode                */
/****************************************************************************/

void WakeUpCC1020ToRX(unsigned char RXANALOG)
{
  volatile int i;

  // Turn on xtal oscillator core
  WriteToCC1020Register(CC1020_MAIN,0x1B);

  // Setup bias current adjustment
  WriteToCC1020Register(CC1020_ANALOG,RXANALOG);

  // Insert wait routine here, must wait for xtal oscillator to stabilise, 
  // typically takes 2-5ms.
  for (i=0x4260; i > 0; i--);

  // Turn on bias generator
  WriteToCC1020Register(CC1020_MAIN,0x19);

  // Wait for 150 usec
  for (i=0x0210; i > 0; i--);

  // Turn on frequency synthesiser
  WriteToCC1020Register(CC1020_MAIN,0x11);
 
}

/****************************************************************************/
/*  This routine wakes the CC1020 up from PD mode to TX mode                */
/****************************************************************************/

void WakeUpCC1020ToTX(unsigned char TXANALOG)
{
  volatile int i;

  // Turn on xtal oscillator core
  WriteToCC1020Register(CC1020_MAIN,0xDB);

  // Setup bias current adjustment
  WriteToCC1020Register(CC1020_ANALOG,TXANALOG);

  // Insert wait routine here, must wait for xtal oscillator to stabilise, 
  // typically takes 2-5ms. 
  for (i=0x42600; i > 0; i--);

  // Turn on bias generator
  WriteToCC1020Register(CC1020_MAIN,0xD9);

  // Wait for 150 usec
  for (i=0x02100; i > 0; i--);

  // Turn on frequency synthesiser
  WriteToCC1020Register(CC1020_MAIN,0xD1);

}
 
/****************************************************************************/
/*  This routine calibrates the CC1020                                      */
/*  Returns 0 if calibration fails, non-zero otherwise. Checks the LOCK     */
/*  to check for success.                                                   */
/****************************************************************************/

char CalibrateCC1020(unsigned char PA_POWER)
{
  volatile int TimeOutCounter;
  volatile int nCalAttempt;

  // Turn off PA to avoid spurs during calibration in TX mode
  WriteToCC1020Register(CC1020_PA_POWER,0x00);

  // Calibrate, and re-calibrate if necessary:
  for (nCalAttempt = CAL_ATTEMPT_MAX; nCalAttempt>0; nCalAttempt--) 
  {

    // Start calibration
    WriteToCC1020Register(CC1020_CALIBRATE,0xB4);

    // Monitor actual calibration start (ref. Errata Note 04 - CC1020)
    for(TimeOutCounter=CAL_TIMEOUT; TimeOutCounter>0; TimeOutCounter--)
	{
		if((ReadFromCC1020Register(CC1020_STATUS)&0x80)==0x00) break;
	}
   
    // Monitor calibration complete
//    for(TimeOutCounter=CAL_TIMEOUT; ((ReadFromCC1020Register(CC1020_STATUS)&0x80)==0x00)&&(TimeOutCounter>0); TimeOutCounter--);
	for(TimeOutCounter=CAL_TIMEOUT; TimeOutCounter>0; TimeOutCounter--)
	{
		if((ReadFromCC1020Register(CC1020_STATUS)&0x80)==0x80) break;
	}
    // Monitor lock
    for(TimeOutCounter=LOCK_TIMEOUT; TimeOutCounter>0; TimeOutCounter--)
	{
		if((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10) break;
	}
	
	if(TimeOutCounter>0) break;
    // Abort further recalibration attempts if successful LOCK
 //   if((ReadFromCC1020Register(CC1020_STATUS)&0x10) == 0x10) {
 //     break;
  //  }
  }

  // Restore PA setting
  WriteToCC1020Register(CC1020_PA_POWER, PA_POWER);
//  if((ReadFromCC1020Register(CC1020_STATUS)&0x10)!=0x10) SMG=dpybuffer[3];
  // Return state of LOCK_CONTINUOUS bit
  return ((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10);
}

/****************************************************************************/
/*  This routine puts the CC1020 into RX mode (from TX). When switching to  */
/*  RX from PD, use WakeupC1020ToRX first                                   */
/****************************************************************************/

char SetupCC1020RX(char RXANALOG, char PA_POWER)
{
  volatile int TimeOutCounter;
  char lock_status;

  // Switch into RX, switch to freq. reg A
  WriteToCC1020Register(CC1020_MAIN,0x11);

  // Setup bias current adjustment
  WriteToCC1020Register(CC1020_ANALOG,RXANALOG);

  // Monitor LOCK
  for(TimeOutCounter=LOCK_TIMEOUT; ((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0)&&(TimeOutCounter>0); TimeOutCounter--);

  // If PLL in lock
  if((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10){
    // Indicate PLL in LOCK
    lock_status = LOCK_OK;
  // Else (PLL out of LOCK)
  }else{
    // If recalibration ok
    if(CalibrateCC1020(PA_POWER)){
      // Indicate PLL in LOCK
      lock_status = LOCK_RECAL_OK;
    // Else (recalibration failed)
    }else{
      // Indicate PLL out of LOCK
      lock_status = LOCK_NOK;
    }
  }

  // Switch RX part of CC1020 on
  WriteToCC1020Register(CC1020_MAIN,0x01);

  // Return LOCK status to application
  return (lock_status);
}

/****************************************************************************/
/*  This routine puts the CC1020 into TX mode (from RX). When switching to  */
/*  TX from PD, use WakeupCC1020ToTX first                                  */
/****************************************************************************/

char SetupCC1020TX(unsigned char TXANALOG,unsigned char PA_POWER)
{
  volatile int TimeOutCounter;
  char lock_status;

  // Turn off PA to avoid frequency splatter
  WriteToCC1020Register(CC1020_PA_POWER,0x00);

  // Setup bias current adjustment
  WriteToCC1020Register(CC1020_ANALOG,TXANALOG);

  // Switch into TX, switch to freq. reg B
  WriteToCC1020Register(CC1020_MAIN,0xC1);
  
//  WriteToCC1020Register(CC1020_MAIN,0x81);

  // Monitor LOCK
  for(TimeOutCounter=LOCK_TIMEOUT; TimeOutCounter>0; TimeOutCounter--)
  {
	if((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10) break;
  }	

  // If PLL in lock
  if((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10){
    // Indicate PLL in LOCK
    lock_status = LOCK_OK;
  // Else (PLL out of LOCK)
  }else{
    // If recalibration ok
    if(CalibrateCC1020(PA_POWER)){
      // Indicate PLL in LOCK
      lock_status = LOCK_RECAL_OK;
    // Else (recalibration failed)
    }else{
      // Indicate PLL out of LOCK
      lock_status = LOCK_NOK;
    }
  }

  // Restore PA setting
  WriteToCC1020Register(CC1020_PA_POWER,PA_POWER);

  // Turn OFF DCLK squelch in TX
  WriteToCC1020Register(CC1020_INTERFACE,ReadFromCC1020Register(CC1020_INTERFACE)&~0x10);

  // Return LOCK status to application
  return (lock_status);
}


/****************************************************************************/
/*  This routine puts the CC1020 into power down mode. Use WakeUpCC1020ToRX */
/*  followed by SetupCC1020RX or WakeupCC1020ToTX followed by SetupCC1020TX */
/*  to wake up from power down                                              */
/****************************************************************************/

void SetupCC1020PD(void)
{
  // Put CC1020 into power-down
  WriteToCC1020Register(CC1020_MAIN,0x1F);

  // Turn off PA to minimise current draw
  WriteToCC1020Register(CC1020_PA_POWER,0x00);
}

/****************************************************************************/
/*  This routine resets the CC1020, clearing all registers.                 */
/****************************************************************************/  

void ResetCC1020(void)
{
  // Reset CC1020
  WriteToCC1020Register(CC1020_MAIN, 0x0F&~0x01);

  // Bring CC1020 out of reset
  WriteToCC1020Register(CC1020_MAIN, 0x1F);
}

/****************************************************************************/
/*  This routine sends new configuration data to the CC1020                 */
/****************************************************************************/

void ConfigureCC1020(void)
{
  unsigned char counter;
  unsigned char value;
  for(counter=0x01; counter<=0x20; counter++){
    value=DefaultConfig433[counter-1];
    WriteToCC1020Register(counter,value); 
  }
}


/*		RS232通信main函数		*/

void main(void)
{
	uchar i,j;
	databak[0]=0x00;
	databak[1]=0x00;
	databak[2]=0x00;
	Tx_Rx=2;
	Rx_Time=0;
	init_devices();	// MCU初始化 
	Initial();      // 变量初始化 
  WDR();			// 喂狗

	port_init();
	uart_init();
	SEI(); 
 
	SetupCC1020PD();
 	ResetCC1020() ;
 	ConfigureCC1020();
 	
 	WakeUpCC1020ToRX(RXANALOG);   
  if(!CalibrateCC1020(PA_POWER))
	boolval=2;
   
  WakeUpCC1020ToTX(TXANALOG);   
  if (!CalibrateCC1020(PA_POWER))
  boolval=3;  
 	
	SetupAGC();
	SetupCC1020PD() ;
	bool_val = SetupCC1020RX(RXANALOG, PA_POWER);
	retrn_val = ReadFromCC1020Register(CC1020_INTERFACE);
	WriteToCC1020Register(CC1020_INTERFACE, retrn_val);
	
while(1)
{
 if(rsok40==1)
 {
 //串行通讯
	WDR();
	if(rscnt12==entercomm){
		entcomm();
						}
	else if(rscnt12==voltagedata){
		voltagerepol();
								}
	else if(rscnt12==currentdata){
		currentrepol();
								}
	else{}	
	rsok00=0;
	rsok10=0;
	rsok20=0;
	rsok30=0;
	rsok40=0;
	rscnt01=0;
	rscnt11=0;	
	rscnt12=0x00;
 	rscnt13=0x00;
  }
 else{
 	  WDR();
// 	P2MDOUT = 0xA0;
//	P2 =0xff;
		DDRB  = 0x03;
	DDRD  = 0x30;
   	bool_val = SetupCC1020RX( RXANALOG, PA_POWER);
	retrn_val = ReadFromCC1020Register(CC1020_INTERFACE);
//	retrn_val = 0x1f;
	WriteToCC1020Register(CC1020_INTERFACE, retrn_val);
	delay(100000);


	bool_val = SetupCC1020TX( TXANALOG, PA_POWER);
	retrn_val = ReadFromCC1020Register(CC1020_INTERFACE);
//	retrn_val = 0x0f;
	WriteToCC1020Register(CC1020_INTERFACE, retrn_val);
 //  	P2MDOUT = 0xA8;
//	P2 =0xff;
		DDRB  = 0x03;
	DDRD  = 0x30;
		j = 0;

	retrn_val = ReadFromCC1020Register(CC1020_STATUS);
	retrn_val = ReadFromCC1020Register(CC1020_RSSI);
	retrn_val = ReadFromCC1020Register(CC1020_AFC);
	retrn_val = ReadFromCC1020Register(CC1020_GAUSS_FILTER);
		while(1){
			if(j==2) break;
			for(looptmp = 0;looptmp<32;looptmp++){
			//	if((looptmp & 1) == 1) DIO_1;
				//else DIO_0;
//				delay(14);
	//			delay(23);
			//	delay(7);
		  		//while(Dclk == 0);
				//delay(1);
				while(Dclk == 0);
		   		while(Dclk == 1);
				if(looptmp == 10 || looptmp == 13) continue;			
				if(j ==1) DIO_1;
				else      DIO_0;

				if(j ==1) j = 0;
				else            j = 1;
				while(Dclk == 0);

			}
			delay(10000);
		}
	retrn_val = ReadFromCC1020Register(CC1020_TEST1);
	retrn_val = ReadFromCC1020Register(CC1020_TEST2);
	retrn_val = ReadFromCC1020Register(CC1020_TEST3);
	retrn_val = ReadFromCC1020Register(CC1020_TEST4);
	retrn_val = ReadFromCC1020Register(CC1020_TEST5);
	retrn_val = ReadFromCC1020Register(CC1020_TEST6);
	retrn_val = ReadFromCC1020Register(CC1020_TEST7);

	retrn_val = ReadFromCC1020Register(CC1020_RESET_DONE);
	retrn_val = ReadFromCC1020Register(CC1020_RSSI);
	retrn_val = ReadFromCC1020Register(CC1020_AFC);
	retrn_val = ReadFromCC1020Register(CC1020_GAUSS_FILTER);

	retrn_val = ReadFromCC1020Register(CC1020_STATUS);
	retrn_val = ReadFromCC1020Register(CC1020_STATUS1);
	retrn_val = ReadFromCC1020Register(CC1020_STATUS2);
	retrn_val = ReadFromCC1020Register(CC1020_STATUS3);
	retrn_val = ReadFromCC1020Register(CC1020_STATUS4);
	retrn_val = ReadFromCC1020Register(CC1020_STATUS5);
	retrn_val = ReadFromCC1020Register(CC1020_STATUS6);
	retrn_val = ReadFromCC1020Register(CC1020_STATUS7);
/*
	WriteToCC1020Register(CC1020_INTERFACE, 0x1f);
	SetupCC1020RX(RXANALOG, PA_POWER);
		delay(50000);
*/
 	 }
 }
}














⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -