📄 uart._c
字号:
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 + -