亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cc1000pic.c

?? 通過PIC單片機控制CC00通信
?? C
字號:

#include "pic.h"
#include "cc1000.h"

#define BYTE unsigned char
#define UINT8 unsigned char
// Value of time-out timer during calibration
#define CAL_TIMEOUT   0x7FFE
#define LOCK_TIMEOUT  0x7FFE

// PA power setting
#define PA_VALUE 0xFF
//=======================================================
//	CC1000的參數
//=======================================================
const unsigned char Configuration[] =
{
  0x58,  // 0x01, FREQ_2A
  0x20,  // 0x02, FREQ_1A
  0x00,  // 0x03, FREQ_0A
  0x42,  // 0x04, FREQ_2B
  0x15,  // 0x05, FREQ_1B
  0x78,  // 0x06, FREQ_0B
  0x00,  // 0x07, FSEP1
  0xc8,  // 0x08, FSEP0
  0x81,  // 0x09, CURRENT
  0x10,  // 0x0A, FRONT_END
  0xFF,  // 0x0B, PA_POW
  0x48,  // 0x0C, PLL
  0x10,  // 0x0D, LOCK
  0x26,  // 0x0E, CAL
  0x8c,  // 0x0F, MODEM2
  0x6f,  // 0x10, MODEM1
  0x27,  // 0x11, MODEM0
  0x70,  // 0x12, MATCH
  0x01,  // 0x13, FSCTRL
  
  0x00,  // 0x1C, PRESCALER
  0x25,  // 0x42, TEST4
};
/****************************************************************************/
//初始化CC1000
/*  This routine sends configuration data to the CC1000                 */
/****************************************************************************/

void ConfigureCC1000()
{
  char i,val;
  for (i=0;i<19;i++) 
	{
    	val=Configuration[i];
    	WriteToCC1000Register(i+1, val);
  	}
	WriteToCC1000Register(0x1c,0x00);	
    WriteToCC1000Register(0x42,0x25);
}

/****************************************************************************/
//	寫單個寄存器
//	IN:地址;數據
//	OUT:NONE
/*  This routine writes to a single CC1000 register                         */
/****************************************************************************/

void WriteToCC1000Register(char addr, char data)
{
  
  unsigned char BitCounter;
  PCLK=1;	
  PALE=0;
  addr=(addr<<1)|0x01;	
  // Send address bits 
  for (BitCounter=0;BitCounter<8;BitCounter++)
  {
	if(addr&0x80) 
	{
		PCLK=1;
		PDATA=1;
	}
	else	
	{
		PCLK=1;
		PDATA=0;
	}
	asm("nop"); asm("nop"); asm("nop"); asm("nop");asm("nop");
	PCLK=0;		
    addr=addr<<1;
  }
  PCLK=1;
  PALE=1;		
  // Send data bits 
  for (BitCounter=0;BitCounter<8;BitCounter++)
  {
	if(data&0x80) 
			{
			  PCLK=1;
			  PDATA=1;
			}
		else 
			{
			  PCLK=1;
			  PDATA=0;
			}	
	asm("nop"); asm("nop"); asm("nop"); asm("nop");asm("nop");
    data=data<<1;
    PCLK=0;
  }
  PCLK=1;
}

/****************************************************************************/
//	讀單個寄存器
//	IN:地址
//	OUT:數據
/*  This routine reads from a single CC1000 register                        */
/****************************************************************************/

unsigned char ReadFromCC1000Register(unsigned char addr1)
{
  char BitCounter;
  unsigned char Byte;

  PALE=1;
  PCLK=1;
  Byte=(addr1<<1)&0xFE;
  PALE=0;
    
  // Send address bits
  for (BitCounter=0;BitCounter<8;BitCounter++)
  {
	if(Byte&0x80) 
			{
			  PCLK=1;
			  PDATA=1;
			}
		else 
			{
			  PCLK=1;
			  PDATA=0;
			}	
	asm("nop"); asm("nop"); asm("nop"); asm("nop");asm("nop");	
    Byte=Byte<<1;
    PCLK=0;
  }
 
  PCLK=1;
  PDATA=1;
  PALE=1; 
  TRISA|=0x04; // Set up PDATA as an input
  Byte=0;  
  for (BitCounter=0;BitCounter<8;BitCounter++)
  {
    PCLK=0;
    Byte=Byte<<1;
//    Byte=Byte|PDO;
	if(PDATA) Byte|=0x01;
		else Byte&=0xFE;
	asm("nop"); asm("nop"); asm("nop"); asm("nop");asm("nop");
    PCLK=1;
  }
  
  TRISA&=~0x04; // Set up PDATA as an output again
  PCLK=1;
  PALE=1;

  return Byte;
}



  
/****************************************************************************/
//復位CC1000,清所有寄存器
//IN:NONE
//OUT:NONE
/*  This routine resets the CC1000, clearing all registers.                 */
/****************************************************************************/  

void ResetCC1000(void)
{
  char MainValue;
  
  MainValue=ReadFromCC1000Register(CC1000_MAIN);
  WriteToCC1000Register(CC1000_MAIN,MainValue & 0xFE);         // Reset CC1000
  WriteToCC1000Register(CC1000_MAIN,MainValue | 0x01);         // Bring CC1000 out of reset
}


/****************************************************************************/
//	對CC1000進行校驗
//IN:NONE
//OUT:0--》失敗
/*  This routine calibrates the CC1000                                      */
/*  Returns 0 if calibration fails, non-zero otherwise. Checks the LOCK     */
/*  to check for success.                                                   */
/****************************************************************************/

char CalibrateCC1000(void)
{
  int TimeOutCounter;

  WriteToCC1000Register(CC1000_PA_POW,0x00); // Turn off PA to avoid spurs
                                             // during calibration in TX mode
  WriteToCC1000Register(CC1000_CAL,0xA6); // Start calibration
  
  // Wait for calibration complete
  for(TimeOutCounter=CAL_TIMEOUT; ((ReadFromCC1000Register(CC1000_CAL)&0x08)==0)&&(TimeOutCounter>0); TimeOutCounter--);

  WriteToCC1000Register(CC1000_CAL,0x26); /* End calibration */
  WriteToCC1000Register(CC1000_PA_POW,PA_VALUE); /* Restore PA setting */

  // Wait for lock
  for(TimeOutCounter=LOCK_TIMEOUT; ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0)&&(TimeOutCounter>0); TimeOutCounter--);

  return ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==1);
}

/****************************************************************************/
//從TX切換到RX。
//IN:RXCURRENT,RXPLL
//OUT:lock_status
/*  This routine puts the CC1000 into RX mode (from TX). When switching to  */
/*  RX from PD, use WakeupC1000ToRX first                                   */
/****************************************************************************/


char SetupCC1000RX(char RXCurrent,char RXPLL)
{
  int i;
  char lock_status;

  WriteToCC1000Register(CC1000_MAIN,0x11);    // Switch into RX, switch to freq. reg A
  WriteToCC1000Register(CC1000_PLL,RXPLL);   // Use RX refdiv setting
  WriteToCC1000Register(CC1000_CURRENT,RXCurrent); // Program VCO current for RX

  // Wait 250us before monitoring LOCK
  for (i=0;i<0x1000;i++);

  // Wait for lock
  for(i=LOCK_TIMEOUT; ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0)&&(i>0); i--);

  // If PLL in lock
  if ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0x01){
    // Indicate PLL in LOCK
    lock_status = LOCK_OK;
  // Else (PLL out of LOCK)
  }else{
    // If recalibration ok
    if(CalibrateCC1000()){
      // Indicate PLL in LOCK
      lock_status = LOCK_RECAL_OK;
    // Else (recalibration failed)
    }else{
      // Reset frequency syncthesizer (ref.: Errata Note 01)
      ResetFreqSynth();
      // Indicate PLL out of LOCK
      lock_status = LOCK_NOK;
    }
  }

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

/****************************************************************************/
//從RX切換到TX。
//IN:TXCURRENT,TXPLL
//OUT:lock_status
/*  This routine puts the CC1000 into TX mode (from RX). When switching to  */
/*  TX from PD, use WakeupCC1000ToTX first                                  */
/****************************************************************************/

char SetupCC1000TX(char TXCurrent, char TXPLL)
{
  int i;
  char lock_status;

  WriteToCC1000Register(CC1000_PA_POW,0x00);   // Turn off PA to avoid frequency splatter

  WriteToCC1000Register(CC1000_MAIN,0xE1);    // Switch into TX, switch to freq. reg B
  WriteToCC1000Register(CC1000_PLL,TXPLL);   // Use TX refdiv setting
  WriteToCC1000Register(CC1000_CURRENT,TXCurrent); // Program VCO current for TX

  // Wait 250us before monitoring LOCK
  for (i=0;i<0x1000;i++);
 
  // Wait for lock
  for(i=LOCK_TIMEOUT; ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0x00)&&(i>0); i--);

  // If PLL in lock
  if ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0x01){
    // Indicate PLL in LOCK
    lock_status = LOCK_OK;
  // Else (PLL out of LOCK)
  }else{
    // If recalibration ok
    if(CalibrateCC1000()){
      // Indicate PLL in LOCK
      lock_status = LOCK_RECAL_OK;
    // Else (recalibration failed)
    }else{
      // Reset frequency syncthesizer (ref.: Errata Note 01)
      ResetFreqSynth();
      // Indicate PLL out of LOCK
      lock_status = LOCK_NOK;
    }
  }

  // Increase output power
  WriteToCC1000Register(CC1000_PA_POW,PA_VALUE); // Restore PA setting

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

/****************************************************************************/
//進入省電模式
//IN:NONE
//OUT:NONE
/*  This routine puts the CC1000 into power down mode. Use WakeUpCC1000ToRX */
/*  followed by SetupCC1000RX or WakeupCC1000ToTX followed by SetupCC1000TX */
/*  to wake up from power down                                              */
/****************************************************************************/

void SetupCC1000PD(void)
{
  WriteToCC1000Register(CC1000_MAIN,0x3F);    // Put CC1000 into power-down
  WriteToCC1000Register(CC1000_PA_POW,0x00);  // Turn off PA to minimise current draw
}

/****************************************************************************/
//從省電模式喚醒到接收模式
//IN:RXCurrent;RXPLL
//OUT:NONE
/*  This routine wakes the CC1000 up from PD mode to RX mode, call          */
/*  SetupCC1000RX after this routine is finished.                           */
/****************************************************************************/

void WakeUpCC1000ToRX(char RXCurrent, char RXPLL)
{
  int i;
  
  
  WriteToCC1000Register(CC1000_MAIN,0x3B);  // Turn on xtal oscillator core
  WriteToCC1000Register(CC1000_CURRENT,RXCurrent); // Program VCO current for RX 
  WriteToCC1000Register(CC1000_PLL,RXPLL); // Use RX refdiv setting
  
  // Insert wait routine here, must wait for xtal oscillator to stabilise, 
  // typically takes 2-5ms.
  for (i=0;i<0x7FFE;i++);
  
  WriteToCC1000Register(CC1000_MAIN,0x39);  // Turn on bias generator
  // Wait for 250us, insert wait loop here
  WriteToCC1000Register(CC1000_MAIN,0x31);  // Turn on frequency synthesiser
}

/****************************************************************************/
//從省電模式喚醒到發送模式
//IN:TXCurrent;TXPLL
//OUT:NONE
/*  This routine wakes the CC1000 up from PD mode to TX mode, call          */
/*  SetupCC1000TX after this routine is finished.                           */
/****************************************************************************/

void WakeUpCC1000ToTX(char TXCurrent,char TXPLL)
{
  int i;

  WriteToCC1000Register(CC1000_MAIN,0xFB);  // Turn on xtal oscillator core
  WriteToCC1000Register(CC1000_CURRENT,TXCurrent); // Program VCO current for TX
  WriteToCC1000Register(CC1000_PLL,TXPLL); // Use TX refdiv setting
  
  // Insert wait routine here, must wait for xtal oscillator to stabilise, 
  // typically takes 2-5ms. 
  for (i=0;i<0x7FFE;i++);
  
  WriteToCC1000Register(CC1000_MAIN,0xF9);  // Turn on bias generator
  // Wait for 250us, insert wait loop here
  WriteToCC1000Register(CC1000_PA_POW,PA_VALUE); // Turn on PA
  WriteToCC1000Register(CC1000_MAIN,0xF1);  // Turn on frequency synthesiser
}

/****************************************************************************/
/*  This routine locks the averaging filter of the CC1000                   */
/****************************************************************************/
/*
void AverageManualLockCC1000(void)
{
  WriteToCC1000Register(CC1000_MODEM1,0x19);
}

/****************************************************************************/
/*  This routine unlocks the averaging filter of the CC1000                 */
/****************************************************************************/
/*
void AverageFreeRunCC1000(void)
{
  WriteToCC1000Register(CC1000_MODEM1,0x09);
}

/****************************************************************************/
/*  This routine sets up the averaging filter of the CC1000 for automatic   */
/*  lock. This can be used in polled receivers.                             */
/****************************************************************************/
/*
void AverageAutoLockCC1000(void)
{
  WriteToCC1000Register(CC1000_MODEM1,0x01);
}

/****************************************************************************/
/*  This routine reads the current calibration values from the CC1000       */
/****************************************************************************/
/*
void ReadCurrentCalibration(char *val1, char *val2)
{
  *val1=ReadFromCC1000Register(CC1000_TEST0);
  *val2=ReadFromCC1000Register(CC1000_TEST2);
}

/****************************************************************************/
/*  This routine overrides the current calibration of the CC1000            */
/****************************************************************************/
/*
void OverrideCurrentCalibration(char val1, char val2)
{
  WriteToCC1000Register(CC1000_TEST5,(val1&0x0F)|0x10);
  WriteToCC1000Register(CC1000_TEST6,(val2&0x1F)|0x20);
}

/****************************************************************************/
/*  This routine stops override of the CC1000 calibration values            */
/****************************************************************************/
/*
void StopOverridingCalibration(void)
{
  WriteToCC1000Register(CC1000_TEST5,0x00);
  WriteToCC1000Register(CC1000_TEST6,0x00);
}

/****************************************************************************/
/*  This routine resets the CC1000 frequency synthesizer                    */
/****************************************************************************/

void ResetFreqSynth(void)
{
  char modem1_value;
  modem1_value = ReadFromCC1000Register(CC1000_MODEM1)&~0x01;
  WriteToCC1000Register(CC1000_MODEM1,modem1_value);
  WriteToCC1000Register(CC1000_MODEM1,modem1_value|0x01);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产三级欧美三级日产三级99 | 成人免费看片app下载| 91啦中文在线观看| 2022国产精品视频| 亚洲福利视频一区二区| 成人一区二区视频| 日韩欧美国产一区二区三区| 亚洲特级片在线| 国产激情一区二区三区桃花岛亚洲| 色噜噜夜夜夜综合网| 国产欧美日韩在线看| 蜜臀久久久99精品久久久久久| 色综合久久综合网| 国产精品色眯眯| 国产精品系列在线播放| 精品成人一区二区三区| 日韩电影在线免费看| 欧美日韩黄色一区二区| 依依成人综合视频| 91精品福利视频| 亚洲欧美日韩中文字幕一区二区三区 | 国产午夜亚洲精品午夜鲁丝片| 青娱乐精品视频| 欧美精品 国产精品| 亚洲在线中文字幕| 欧美午夜电影在线播放| 一区二区三区视频在线观看| 在线观看免费成人| 亚洲最新视频在线观看| 欧美三电影在线| 午夜欧美在线一二页| 欧美日韩一区二区三区高清| 亚欧色一区w666天堂| 欧美日韩黄视频| 麻豆传媒一区二区三区| 精品99一区二区三区| 国产福利一区在线| 日韩理论片中文av| 欧美在线一区二区| 日韩av中文字幕一区二区三区| 欧美日韩电影在线| 日本不卡一区二区三区 | 欧美三级午夜理伦三级中视频| 综合网在线视频| 91免费国产在线观看| 亚洲一区二区视频在线| 欧美精品在线一区二区三区| 看电影不卡的网站| 久久亚洲综合av| 成人av资源站| 亚洲h在线观看| 欧美白人最猛性xxxxx69交| 韩国精品主播一区二区在线观看| 久久久久97国产精华液好用吗| 成人va在线观看| 亚洲午夜精品一区二区三区他趣| 在线播放91灌醉迷j高跟美女 | 午夜精品福利视频网站| 欧美电影免费提供在线观看| 国模一区二区三区白浆| 中文字幕一区日韩精品欧美| 欧美日韩一区二区三区四区五区| 九九精品一区二区| 亚洲欧洲韩国日本视频| 欧美精品99久久久**| 高清不卡一区二区在线| 亚洲成在人线在线播放| 久久蜜桃一区二区| 一本久久精品一区二区| 国产中文字幕一区| 又紧又大又爽精品一区二区| 精品国偷自产国产一区| 在线亚洲一区二区| 国产精品1024久久| 青青国产91久久久久久| 亚洲另类中文字| 久久久久99精品一区| 欧美精品xxxxbbbb| 色婷婷一区二区三区四区| 韩国成人福利片在线播放| 亚洲一区二区在线免费看| 国产视频一区不卡| 日韩一卡二卡三卡国产欧美| 91老师片黄在线观看| 风间由美一区二区三区在线观看 | 99国产精品久久久| 精品一区二区三区影院在线午夜 | 一区二区三区国产豹纹内裤在线| 欧美精品一区二区三区在线播放 | 色婷婷综合视频在线观看| 黑人精品欧美一区二区蜜桃| 亚洲韩国精品一区| 中文字幕一区二区三区av| 精品福利av导航| 538prom精品视频线放| 91麻豆精品在线观看| 国产精品资源在线观看| 男男成人高潮片免费网站| 亚洲制服欧美中文字幕中文字幕| 国产精品久久99| 国产色婷婷亚洲99精品小说| 欧美v日韩v国产v| 91精品国产综合久久福利| 在线观看网站黄不卡| 97久久超碰精品国产| 成人av电影免费观看| 成人黄色网址在线观看| 成人免费看片app下载| 国产成人精品综合在线观看| 国产精品77777竹菊影视小说| 美日韩一区二区| 久久99九九99精品| 韩国毛片一区二区三区| 国产乱人伦偷精品视频免下载| 久久国产精品99精品国产| 免费久久精品视频| 激情综合色丁香一区二区| 蜜桃av一区二区三区电影| 美女高潮久久久| 激情丁香综合五月| 高清成人免费视频| 成人91在线观看| 91视频一区二区| 日本久久电影网| 欧美日韩精品福利| 欧美刺激午夜性久久久久久久| 欧美成人精品高清在线播放| www国产亚洲精品久久麻豆| 国产视频视频一区| 椎名由奈av一区二区三区| 一区二区激情小说| 日韩在线观看一区二区| 久久国产精品露脸对白| 成人动漫视频在线| 在线免费观看视频一区| 91麻豆精品国产自产在线观看一区| 欧美一区国产二区| 国产午夜精品理论片a级大结局| 国产精品美女久久久久aⅴ| 一区二区三区高清不卡| 秋霞成人午夜伦在线观看| 国产成人欧美日韩在线电影| 91欧美激情一区二区三区成人| 欧美日韩一级二级| 久久久.com| 亚洲成人免费观看| 国产一区二区0| 在线观看一区日韩| 久久久久久久久久美女| 亚洲精品高清在线| 国产一区二区91| 91蝌蚪porny| 精品久久久久av影院| 亚洲欧美激情小说另类| 久久99精品一区二区三区| 91麻豆6部合集magnet| 久久先锋影音av鲁色资源网| 亚洲精品精品亚洲| 国产激情视频一区二区三区欧美| 在线观看www91| 国产人伦精品一区二区| 丝袜亚洲精品中文字幕一区| 成a人片亚洲日本久久| 欧美一区二区三区思思人| 亚洲欧洲国产日本综合| 久久国产精品色| 精品视频1区2区| 1024亚洲合集| 国产精品一区二区三区四区| 在线播放国产精品二区一二区四区| 国产精品久久久久久久午夜片| 九九精品视频在线看| 777a∨成人精品桃花网| 亚洲精品免费看| 成人av一区二区三区| 337p日本欧洲亚洲大胆精品| 午夜电影一区二区三区| 91蜜桃免费观看视频| 国产三区在线成人av| 青青草国产精品亚洲专区无| 欧美午夜精品免费| 一区二区国产盗摄色噜噜| 91在线小视频| 综合久久给合久久狠狠狠97色| 国产精品一区二区三区四区 | 欧美电影在哪看比较好| 亚洲欧美在线另类| 粉嫩av一区二区三区| 26uuu欧美| 国产老女人精品毛片久久| 日韩欧美专区在线| 日本亚洲天堂网| 欧美精品一卡两卡| 香蕉加勒比综合久久| 欧美日韩国产精品自在自线| 一区二区激情小说| 欧美日韩1234| 日韩av一区二区在线影视| 91精品国产综合久久久久| 日本一区中文字幕|