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

📄 c1000txman.c

📁 在典型系统应用中CC1000要与微控器相连该微控器必须能够 通过三串行配置口PDATAPCLK和PALE控制CC1000改变不同模式
💻 C
字号:



#include<reg51.h>
#include<stdio.h>
#include<stdlib.h> 

#define uchar unsigned char
#define uint unsigned int



sfr P4=0xc0;

sbit PALE=P2^3; //定义P1.0

sbit PDATA=P2^4; //定义P1.0

sbit PCLK=P2^2; //定义P1.0

sbit DCLK=P3^2; //定义P1.0

sbit DIO=P2^1; //定义P1.0

sbit DENG=P4^0; //定义P1.0







#define CC1000_MAIN            0x00
#define CC1000_FREQ_2A         0x01
#define CC1000_FREQ_1A         0x02
#define CC1000_FREQ_0A         0x03
#define CC1000_FREQ_2B         0x04
#define CC1000_FREQ_1B         0x05
#define CC1000_FREQ_0B         0x06
#define CC1000_FSEP1           0x07
#define CC1000_FSEP0           0x08
#define CC1000_CURRENT         0x09
#define CC1000_FRONT_END       0x0A
#define CC1000_PA_POW          0x0B
#define CC1000_PLL             0x0C
#define CC1000_LOCK            0x0D
#define CC1000_CAL             0x0E
#define CC1000_MODEM2          0x0F
#define CC1000_MODEM1          0x10
#define CC1000_MODEM0          0x11
#define CC1000_MATCH           0x12
#define CC1000_FSCTRL          0x13
#define CC1000_FSHAPE7         0x14
#define CC1000_FSHAPE6         0x15
#define CC1000_FSHAPE5         0x16
#define CC1000_FSHAPE4         0x17
#define CC1000_FSHAPE3         0x18
#define CC1000_FSHAPE2         0x19
#define CC1000_FSHAPE1         0x1A
#define CC1000_FSDELAY         0x1B
#define CC1000_PRESCALER       0x1C
#define CC1000_TEST6           0x40
#define CC1000_TEST5           0x41
#define CC1000_TEST4           0x42
#define CC1000_TEST3           0x43
#define CC1000_TEST2           0x44
#define CC1000_TEST1           0x45
#define CC1000_TEST0           0x46



void NOP(){}



void delay1mS(uchar time)
{
 uchar i;
 uchar j;
 for(j=0;j<time;j++)
 {
  for(i=0;i<220;i++)
   NOP();
 }
}


/****************************************************************************/
/*   CC1000    写内部寄存器子程序             
/****************************************************************************/
void WriteToCC1000Register(char Register, char DATA)
{
 char i;
 PCLK=1;
 PDATA=1;
 PALE=0;
 Register=(Register<<1)+0x01;
 for(i=8;i>0;i--)
 {
  if(Register&0x80)PDATA=1;
  else PDATA=0;
  PCLK=0;
  Register<<=1;
  NOP();
  PCLK=1;                               
 }

 NOP();
 PCLK=1;
 PALE=1;
 for(i=8;i>0;i--)
 {
  if(DATA&0x80)PDATA=1;
  else PDATA=0;
  PCLK=0;
  DATA<<=1;
  NOP();
  PCLK=1;                                
 }

 NOP();
 PCLK=1;
 PDATA=1;
}




/****************************************************************************/
/*   CC1000    读内部寄存器子程序             
/****************************************************************************/
char ReadfromCC1000Register(char addr)
{
  char Result=0;
  char i;
  PCLK=1;
  PDATA=1;
  PALE=0;
  addr=addr<<1;
  for(i=8;i>0;i--)
  {
   if(addr&0x80)PDATA=1;
    else PDATA=0;
    PCLK=0;
    addr<<=1;
 
    NOP();
    PCLK=1;                                
  }
  PDATA=1;
  NOP();
  PCLK=1;
  PALE=1;
  for(i=8;i>0;i--)
  {
   PCLK=0;
   Result=(Result<<1)|PDATA;
  
   NOP(); 
   PCLK=1; 
     NOP();                      
 }
 PCLK=1;
 return(Result);
}




/****************************************************************************/
/*  This routine puts the CC1000 into RX mode . When switching to  */
/*  RX from PD, use WakeupC1000ToRX first                                   */
/****************************************************************************/

void CC1000_init()
{
 char cal_complete;
 //char time;
 WriteToCC1000Register(CC1000_PA_POW,0x00); 
 WriteToCC1000Register(CC1000_MAIN,0x3f);
 //P1=ReadfromCC1000Register(CC1000_MAIN);

 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_MAIN,0x3b);       
 //cal_complete=ReadfromCC1000Register(CC1000_MAIN);
// cal_complete=0;
// WriteToCC1000Register(CC1000_MAIN,cal_complete);
 //P1=ReadfromCC1000Register(CC1000_MAIN);

 delay1mS(5);
 
// WriteToCC1000Register(CC1000_MAIN,0x01);
// writes 24-bit frequency value used for RX to 433.302 MHz.
// Check CC1000 data sheet for equations used to find
// 0x580000.
 WriteToCC1000Register(CC1000_FREQ_2A,0x58); 
 //P0=ReadfromCC1000Register(CC1000_FREQ_2A);     
 WriteToCC1000Register(CC1000_FREQ_1A,0x00);
 WriteToCC1000Register(CC1000_FREQ_0A,0x00);
// writes 24-bit frequency value used for TX to 433.302 MHz.
// Check CC1000 data sheet for equations used to find
// 0x580625.
 WriteToCC1000Register(CC1000_FREQ_2B,0x58);       
 WriteToCC1000Register(CC1000_FREQ_1B,0x06);
 WriteToCC1000Register(CC1000_FREQ_0B,0x25);
// sets frequency separation between 0 value and 1 value
//设定误码率
 WriteToCC1000Register(CC1000_FSEP1,0x03);
 WriteToCC1000Register(CC1000_FSEP0,0x55);
 WriteToCC1000Register(CC1000_CURRENT,0x44);
// sets some internal current levels, and enables RSSI output to pin
 WriteToCC1000Register(CC1000_FRONT_END,0x00);
 WriteToCC1000Register(CC1000_PA_POW,0xff);
// sets the PLL reference divider to divide by 6
 WriteToCC1000Register(CC1000_PLL,0x60);   
// sets External LNA control lock indicator to output on the CHP_OUT pin                  
 WriteToCC1000Register(CC1000_LOCK,0xa0);
 WriteToCC1000Register(CC1000_CAL,0x26);   
// sets threshold level for peak detector (not used in this design) 
 WriteToCC1000Register(CC1000_MODEM2,0x16);    
// 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,0x67); 
// baud rate to 4.8k, NRZ, and crystal freq. to 11.0592 MHz
 WriteToCC1000Register(CC1000_MODEM0,0x54);            
// 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);

// sets charge pump current scaling factor, which determines the bandwidth
// of the PLL.
// WriteToCC1000Register(CC1000_TEST4,0x25);
// Calibration Process
// RX Calibration
// set transceiver to RX mode



WriteToCC1000Register(CC1000_TEST4 ,0x3f);
 
WriteToCC1000Register(CC1000_MAIN,0x11);
WriteToCC1000Register(CC1000_CAL,0xa6);
WriteToCC1000Register(CC1000_CURRENT,0x44);// RX mode current


/*
 for(time=0;time<100;time++){
cal_complete =ReadfromCC1000Register(CC1000_CAL);
 P1=cal_complete;
 if(!(cal_complete & 0x08))
 P0=time;
 else break;
 }


*/



 cal_complete = 0;
 do
 {
  cal_complete =ReadfromCC1000Register(CC1000_CAL);
  /*
  P1=cal_complete;
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
  */

 }
 while(!(cal_complete & 0x08)); // spin until calibration is complete

 WriteToCC1000Register(CC1000_CAL,0x26);

// TX Calibration
 WriteToCC1000Register(CC1000_MAIN,0xE1);
 WriteToCC1000Register(CC1000_CAL,0xa6);
 
 
 WriteToCC1000Register(CC1000_CURRENT,0x81);// TX mode current
 WriteToCC1000Register(CC1000_PA_POW,0x00);
 WriteToCC1000Register(CC1000_PLL,0x60);   
// calibration



 
 cal_complete = 0;
 do
 {
  cal_complete =ReadfromCC1000Register(CC1000_CAL);
 
 }
 while(!(cal_complete & 0x08)); // spin until calibration is complete
 WriteToCC1000Register(CC1000_CAL,0x26);
 WriteToCC1000Register(CC1000_MAIN,0x3d);
 WriteToCC1000Register(CC1000_PA_POW,0xff);


   DENG=0;


}

//-----------------------------------------------------------------------------
// C1000_RX_MODE
//-----------------------------------------------------------------------------
// C1000_RX_MODE sets the transceiver to RX mode and
// then initializes the 250 microsecond counter
// that gets incremented in the ADC ISR.
void C1000_RX_MODE(void)
{
WriteToCC1000Register(CC1000_PA_POW,0x00); 
 WriteToCC1000Register(CC1000_MAIN,0x11); // set to RX mode
 WriteToCC1000Register(CC1000_CURRENT,0x44); // set RX current level
 WriteToCC1000Register(CC1000_PLL,0x60);   
 WriteToCC1000Register(CC1000_PA_POW,0xff); // no  outputpower needed 
}


//-----------------------------------------------------------------------------
// C1000_TX_MODE
//-----------------------------------------------------------------------------
// C1000_TX_MODE sets the transceiver to TX mode and
// then initializes the 250 microsecond counter
void C1000_TX_MODE(void)
{
WriteToCC1000Register(CC1000_PA_POW,0x00); 
 WriteToCC1000Register(CC1000_MAIN,0xe1); // set to TX mode
 WriteToCC1000Register(CC1000_PLL,0x60); 
 WriteToCC1000Register(CC1000_CURRENT,0x81); // set TX current level
 
 WriteToCC1000Register(CC1000_PA_POW,0xff); // no  outputpower needed 
}

void TX(char TXDATA)
{
 char i;

 for(i=8;i>0;i--)
 {
  while(DCLK==1);
  if(TXDATA&0x80)DIO=1;
  else DIO=0;
  TXDATA<<=1;
  while(DCLK==0);

 }
}



void main(){ 


   CC1000_init();
	//while(1){
	C1000_RX_MODE();
delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);
 delay1mS(250);

//}

   C1000_TX_MODE(); 
   while(1){
	
      TX(0xa5);
       delay1mS(250); 
	 }

}



⌨️ 快捷键说明

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