cc2500_1101.C 22 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850
/*******************************************************************************
* Copyright (C), 2000-2014,  Sunsky Electronic Technology Co., Ltd.
* 文件名: CCxx00_New.C
* 作  者: 梁新平
* 版  本:
* 日  期: 2014-5-26     
* 说  明:          
*                  
*                  
* 修订历史:        
*                  
*    1. 时间: 2014-5-26
*       修订者: 梁新平
*       修订内容: 创建
*    2.
* 其它:           
*******************************************************************************/

#include "cc2500_1101.h"
#include "platform.h"
#include "function.h"
#include "base_core_user.h"



#if defined(CC1101) || defined(CC2500)

//注意CC2500的CRC效验问题--CRCL=00时会指示CrcErr

//PKTCTRL1=04,即WOR_AUTOSYNC=0,CRC_AUTOFLUSH=0,APPEND_STATUS=1,ADR_CHK=0
//PKTCTRL0=05,即WHITE_DATA=0,PKT_FORMAT=0 used fifo,CRC_EN=1,LENTH=variable

//MCSM1=复位值0x30,即RXOFF_MODE和TXOFF_MODE均为IDLE,
//但CCA_Mode=3 RSSI低而且没有在接收时才能从RX到TX状态,这是测试中1/10概率没有切换到TX状态的原因?改为0

//MDMCFG2从3改为0x13是由FSK转为GFSK模式,相对更好:
//测试出现 按6.6版本76.8K设置时,近距离效果都不行,把FSK改为GFSK就好了
//MCSM0=0x18,即FS_AUTOCAL=Mode1 IDLE->TX,RX时校正

//2010.2.24屏蔽了接收时候直接bRcvOk=1
//2010.2.24可OEM定制无线同步码

//2010.4.8
//CC_PackStatus()读取CCA
//MCSM1=复位值0x30 不再修改为0,使能CCA done
//PKTLEN可以写少于64(原0xFF)避免FIFO溢出,虽然采用不定长包 done
//使用CCA或CS必须要先RXON在接收状态?是的 CCA还必须使能CCA才能检测,CS不需要使能CCA
//IOCFG2 设置为09可在GDO2脚看CCA信号输出 done

//2010.4.16
//测试出CCA比接收完成慢1.7ms,CS载波检测能很快结束

//2010.4.24
//测试RX死机时候,状态还是1接收的,并不是RX溢出,但RXBUF为65字节,刚好比物理BUF多1字节
//重新IDLE再RXON可以退出死机状态,把PKTLEN限定为0x20可以提前结束错误包!!能避免RX死机的情况?
//猜测是长度字节错误导致接收死机,因为GDO0脚一直为高(已经开始接收但没有结束)

//CCA考虑检测时间,要计算发送时间,最末一个CCA后也能发送完整数据包
//因为Calibartion就要720us,及1ms后才能检测到CCA,或考虑去掉自动Calibration?
//CCA的信号强度还可以设置AGCCTRL0-2
//存在能发射,但不能接收到情况??

//2010.5.12 433M增加修改了BAND2010配置高速无线通信
//2010.5.18 移植到M52时候,修正433M下的原文件,2.4G的配置并不对  --注意:CC_Init()中不同的无线中断打开不同
//5.19 加2.4G下新配置250K-Baud,MSK

//2011.3 肖雪琦移植到STC平台下
//2011.4.9 pei修正sync0,sync1前面漏u8定义导致cc_init()中引导码不对
//2011.5.1 pei不使用SPI操作进行了测试,少许修改SPI1_ReadWriteByte()
//注意:pei STC平台下,SPI操作,必须P1.6保持输出为高,MISO读入才能正确,或者通过P1M1干脆设置为输入


#define PAMAX 0xFE 
#define RSSI0  72  //Rssi Offset 
//#define PAMAX 0xFE 
#define PAMAX2  0xA9  //-4dBm
#define PAMAX3  0x6E  //-8dBm
//#define PAMAX4  0xC6  //-12dBm
#define PAMAX4  0x44  //-28dBm	配对时功率降低,最终使用了-28db的参数




//CC2500 BAND2010

// Chipcon
// Product = CC2500
// Chip version = E   (VERSION = 0x03)
// Crystal accuracy = 10 ppm
// X-tal frequency = 26 MHz
// RF output power = 0 dBm
// RX filterbandwidth = 541.666667 kHz
// Phase = 0
// Datarate = 249.938965 kBaud
// Modulation = (7) MSK
// Manchester enable = (0) Manchester disabled
// RF Frequency = 2401.999939 MHz
// Channel spacing = 333.251953 kHz
// Channel number = 0
// Optimization = Sensitivity
// Sync mode = (3) 30/32 sync word bits detected
// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX
// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled
// Forward Error Correction = (0) FEC disabled
// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.
// Packetlength = 255
// Preamble count = (2)  4 bytes
// Append status = 1
// Address check = (0) No address check
// FIFO autoflush = 0
// Device address = 0
// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet
// GDO2 signal selection = (41) CHIP_RDY



static void DelayUs( unsigned short time )
{
    unsigned short i = 0;
    while( time-- )
    {
        i = 6; //16M=2
        while( i-- ) ;
    }
}


//等待芯片ready
static void CC_Rdy(void)
{
	unsigned char i;
  for (i=0;i<10;i++){ 
    if (RF_READ ==0) 
    	return; 
    DelayUs(20);//
  }
 
}


extern SPI_HandleTypeDef hspi1;

static unsigned char SPI1_ReadWriteByte(unsigned char TxData)
{		
//	unsigned short retry=0;				 
//	while((SPI1->SR&1<<1)==0)//	等待发送空闲
////while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
//	{
//		retry++;
//		if(retry>SPI1_BREAK)return 0;
//	}			  
//	SPI1->DR=TxData;	 	  //发送
//	
//	retry=0;
//	while((SPI1->SR&1<<0)==0) //等待接收完成 
////while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)		
//	{
//		retry++;
//		if(retry>SPI1_BREAK)return 0;
//	}	  						    
//	return SPI1->DR;          //返回接收到的数据	


		HAL_StatusTypeDef rlst;
		unsigned char rx_data;
		rlst =HAL_SPI_TransmitReceive(&hspi1,&TxData,&rx_data,1, 5);

		if(rlst == HAL_OK)
			return rx_data;
		else 
			return 0;	
}



//写命令
static unsigned char CC_Cmd(unsigned char Cmd)
{
	unsigned char Status;
	
	RF_CS0;
	CC_Rdy();
	Status=SPI1_ReadWriteByte(Cmd);
	RF_CS1;	
	return Status;
}



//指定地址,写配置字
static unsigned char CC_WrReg(unsigned char Addr,unsigned char Data)
{
	unsigned char Status;

  RF_CS0;
	CC_Rdy();
	Status=SPI1_ReadWriteByte(Addr);
	SPI1_ReadWriteByte(Data);
	RF_CS1;
	return Status;
}
//指定地址,连续写配置
static unsigned char CC_WrRegs(unsigned char Addr,unsigned char *Buf,unsigned char Count)
{
	unsigned char Status,i;

  RF_CS0;
	CC_Rdy();
	Status=SPI1_ReadWriteByte(Addr|0x40);
	for (i=0;i<Count;i++)
	{ SPI1_ReadWriteByte(Buf[i]);
	}
	RF_CS1;
	return Status;
}



//读状态寄存器
static unsigned char CC_RdStatus(unsigned char Addr)
{
	unsigned char Data;   
	RF_CS0;
	CC_Rdy();
	Data=SPI1_ReadWriteByte(Addr|0xC0);//
	Data=SPI1_ReadWriteByte(0);
	RF_CS1;
	return Data;
}


//读配置
static unsigned char CC_RdReg(unsigned char Addr)
{	
	unsigned char Data;      
	RF_CS0;
	CC_Rdy();
	Data=SPI1_ReadWriteByte(Addr|0x80);
	Data=SPI1_ReadWriteByte(0);
	RF_CS1;
	return Data;
}
//连续读配置字
static unsigned char CC_RdRegs(unsigned char Addr,unsigned char *Buf,unsigned char Count)
{
	unsigned char Status,i;

  RF_CS0;
	CC_Rdy();
	Status=SPI1_ReadWriteByte(Addr|0xC0);
	for (i=0;i<Count;i++)
	{ Buf[i]=SPI1_ReadWriteByte(0);
	}
	RF_CS1;
	return Status;
}


//-------------------------------------------------------------------------

static unsigned char CC_GetStatus(void)
{
  return CC_Cmd(CCxxx0_SNOP);
}

//芯片上电复位
static void CC_RESET(void)
{

   RF_CS1;
   DelayUs(1);
   RF_CS0;
   DelayUs(1);
   RF_CS1;
   DelayUs(50);
   
   CC_Cmd(CCxxx0_SRES);
}


static void CC_PaTable(unsigned char paTable)
{
  CC_WrReg(CCxxx0_PATABLE, paTable);
}

static void CC_Chan(unsigned char Chan)
{
  CC_Idle();//为方便
  CC_WrReg(CCxxx0_CHANNR,Chan);
}

void CC_FEC(unsigned char On)
{unsigned char Reg;
  Reg=CC_RdReg(CCxxx0_MDMCFG1);
  if (On==1) 
     CC_WrReg(CCxxx0_MDMCFG1, Reg | 0x80);
  else
  	 CC_WrReg(CCxxx0_MDMCFG1, Reg & 0x7F);
}


static void CC_WHITE(unsigned char On)
{
	unsigned char Reg;
  Reg=CC_RdReg(CCxxx0_PKTCTRL0);
  if (On==1) 
     CC_WrReg(CCxxx0_PKTCTRL0, Reg | 0x40);
  else
  	 CC_WrReg(CCxxx0_PKTCTRL0, Reg & 0xBF);
}


static void CC_ClrRx(void) 
{
  CC_Idle();//!!必须在Idle状态
	CC_Cmd(CCxxx0_SFRX);
}


static void  CC_ClrTx(void) 	
{
  CC_Idle();//!!必须在Idle状态
  CC_Cmd(CCxxx0_SFTX);
}

void CC_XCal(void)
{
  unsigned char i;
  CC_Cmd(CCxxx0_SIDLE);
  CC_Cmd(CCxxx0_SCAL);
  for (i=0;i<100;i++)
   { if (CC_RdStatus(CCxxx0_MARCSTATE)==1) break;//校正完成
     DelayUs(10);
    }
}




#ifdef CC2500	
RF_SETTINGS rfSettings250K = {
    0x0A,   // FSCTRL1   Frequency synthesizer control.
    0x00,   // FSCTRL0   Frequency synthesizer control.
    0x5C,   // FREQ2     Frequency control word, high byte.
    0x62,   // FREQ1     Frequency control word, middle byte.
    0x76,   // FREQ0     Frequency control word, low byte.
    0x2D,   // MDMCFG4   Modem configuration.
    0x3B,   // MDMCFG3   Modem configuration.
    0x73,   // MDMCFG2   Modem configuration.
    0x23,   // MDMCFG1   Modem configuration.
    0xA4,   // MDMCFG0   Modem configuration.
    0x00,   // CHANNR    Channel number.
    0x00,   // DEVIATN   Modem deviation setting (when FSK modulation is enabled).
    0xB6,   // FREND1    Front end RX configuration.
    0x10,   // FREND0    Front end TX configuration.
    0x18,   // MCSM0     Main Radio Control State Machine configuration.
    0x1D,   // FOCCFG    Frequency Offset Compensation Configuration.
    0x1C,   // BSCFG     Bit synchronization Configuration.
    0xC7,   // AGCCTRL2  AGC control.
    0x00,   // AGCCTRL1  AGC control.
    0xB0,   // AGCCTRL0  AGC control.
    0xEA,   // FSCAL3    Frequency synthesizer calibration.
    0x0A,   // FSCAL2    Frequency synthesizer calibration.
    0x00,   // FSCAL1    Frequency synthesizer calibration.
    0x11,   // FSCAL0    Frequency synthesizer calibration.
    0x59,   // FSTEST    Frequency synthesizer calibration.
    0x88,   // TEST2     Various test settings.
    0x31,   // TEST1     Various test settings.
    0x0B,   // TEST0     Various test settings.
    0x07,   // FIFOTHR   RXFIFO and TXFIFO thresholds.
    0x0E, //29,   // IOCFG2    GDO2 output pin configuration.0x09=CCA输出 0x0E=CS输出
    0x06,   // IOCFG0D   GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.

		0x04,   // PKTCTRL1  Packet automation control.
    0x05,   // PKTCTRL0  Packet automation control.

		0x00,   // ADDR      Device address.
    0x25,//0x20  //FF    // PKTLEN    Packet length.超长包自动结束
};

static void CC_RfConfig(RF_SETTINGS *pRfSettings) 
{    // Write register settings
    CC_WrReg(CCxxx0_FSCTRL1,  pRfSettings->FSCTRL1);
    CC_WrReg(CCxxx0_FSCTRL0,  pRfSettings->FSCTRL0);
    CC_WrReg(CCxxx0_FREQ2,    pRfSettings->FREQ2);
    CC_WrReg(CCxxx0_FREQ1,    pRfSettings->FREQ1);
    CC_WrReg(CCxxx0_FREQ0,    pRfSettings->FREQ0);
    CC_WrReg(CCxxx0_MDMCFG4,  pRfSettings->MDMCFG4);
    CC_WrReg(CCxxx0_MDMCFG3,  pRfSettings->MDMCFG3);
    CC_WrReg(CCxxx0_MDMCFG2,  pRfSettings->MDMCFG2);
    CC_WrReg(CCxxx0_MDMCFG1,  pRfSettings->MDMCFG1);
    CC_WrReg(CCxxx0_MDMCFG0,  pRfSettings->MDMCFG0);
    CC_WrReg(CCxxx0_CHANNR,   pRfSettings->CHANNR);
    CC_WrReg(CCxxx0_DEVIATN,  pRfSettings->DEVIATN);
    CC_WrReg(CCxxx0_FREND1,   pRfSettings->FREND1);
    CC_WrReg(CCxxx0_FREND0,   pRfSettings->FREND0);
    CC_WrReg(CCxxx0_MCSM0 ,   pRfSettings->MCSM0 );
    CC_WrReg(CCxxx0_FOCCFG,   pRfSettings->FOCCFG);
    CC_WrReg(CCxxx0_BSCFG,    pRfSettings->BSCFG);
    CC_WrReg(CCxxx0_AGCCTRL2, pRfSettings->AGCCTRL2);
		CC_WrReg(CCxxx0_AGCCTRL1, pRfSettings->AGCCTRL1);
    CC_WrReg(CCxxx0_AGCCTRL0, pRfSettings->AGCCTRL0);
    CC_WrReg(CCxxx0_FSCAL3,   pRfSettings->FSCAL3);
    CC_WrReg(CCxxx0_FSCAL2,   pRfSettings->FSCAL2);
		CC_WrReg(CCxxx0_FSCAL1,   pRfSettings->FSCAL1);
    CC_WrReg(CCxxx0_FSCAL0,   pRfSettings->FSCAL0);
    CC_WrReg(CCxxx0_FSTEST,   pRfSettings->FSTEST);
    CC_WrReg(CCxxx0_TEST2,    pRfSettings->TEST2);
    CC_WrReg(CCxxx0_TEST1,    pRfSettings->TEST1);
    CC_WrReg(CCxxx0_TEST0,    pRfSettings->TEST0);
    CC_WrReg(CCxxx0_IOCFG2,   pRfSettings->IOCFG2);
    CC_WrReg(CCxxx0_IOCFG0,   pRfSettings->IOCFG0);    
    CC_WrReg(CCxxx0_PKTCTRL1, pRfSettings->PKTCTRL1);
    CC_WrReg(CCxxx0_PKTCTRL0, pRfSettings->PKTCTRL0);
    CC_WrReg(CCxxx0_ADDR,     pRfSettings->ADDR);
    CC_WrReg(CCxxx0_PKTLEN,   pRfSettings->PKTLEN);

   	CC_WrReg(CCxxx0_FIFOTHR,  pRfSettings->FIFOTHR);	
}
#endif 






//==================================================
#ifdef CC1101	//M433M
RF_SETTINGS rfSettings76800 = {
    	0x08,   // FSCTRL1   Frequency synthesizer control.
    	0x00,   // FSCTRL0   Frequency synthesizer control.
    	0x10,   // FREQ2     Frequency control word, high byte.
    	0xA9,   // FREQ1     Frequency control word, middle byte.
    	0x5A,   // FREQ0     Frequency control word, low byte.
    	0xAB,   // MDMCFG4   Modem configuration.
    	0x83,   // MDMCFG3   Modem configuration.
    	0x13,   // MDMCFG2   Modem configuration.
    	0x20,   // MDMCFG1   Modem configuration.
    	0xCF,   // MDMCFG0   Modem configuration. CHANSPC_M
    	0x00,   // CHANNR    Channel number.
    	0x42,   // DEVIATN   Modem deviation setting (when FSK modulation is enabled).
    	0xB6,   // FREND1    Front end RX configuration.
    	0x10,   // FREND0    Front end RX configuration.
    	0x18,   // MCSM0     Main Radio Control State Machine configuration.
    	0x1D,   // FOCCFG    Frequency Offset Compensation Configuration.
    	0x1C,   // BSCFG     Bit synchronization Configuration.
    	0xC7,   // AGCCTRL2  AGC control.
    	0x00,   // AGCCTRL1  AGC control.
    	0xB2,   // AGCCTRL0  AGC control.
    	0xEA,   // FSCAL3    Frequency synthesizer calibration.
    	0x2A,   // FSCAL2    Frequency synthesizer calibration.
    	0x00,   // FSCAL1    Frequency synthesizer calibration.
    	0x1F,   // FSCAL0    Frequency synthesizer calibration.
    	0x59,   // FSTEST    Frequency synthesizer calibration.
    	0x81,   // TEST2     Various test settings.
    	0x35,   // TEST1     Various test settings.
    	0x09,   // TEST0     Various test settings.
    0x07,   // FIFOTHR   RXFIFO and TXFIFO thresholds. //add by Gavin 			
    	0x0E,//0x09,//0x29,   // IOCFG2    GDO2 output pin configuration. 0x09=CCA输出 0x0E=CS输出
    	0x06,   // IOCFG0D   GDO0 output pin configuration. Refer to SmartRF Studio User Manual for detailed pseudo register explanation.
    	0x04,   // PKTCTRL1  Packet automation control.
    	0x05,   // PKTCTRL0  Packet automation control.
    	0x00,   // ADDR      Device address.
    	0x25,//0x20    // PKTLEN    Packet length.
};


//*------------------------------------------
//* 函数名称 : cc_rf_config
//* 功能描述 : 无线模块配置
//* 入口参数 : 无
//* 出口参数 : 无
//*---------------------------------------------
static void cc_rf_config(RF_SETTINGS *rf_settings)
{
	// Write register settings
    CC_WrReg(CCxxx0_FSCTRL1,  rf_settings->FSCTRL1);
    CC_WrReg(CCxxx0_FSCTRL0,  rf_settings->FSCTRL0);
    CC_WrReg(CCxxx0_FREQ2,    rf_settings->FREQ2);
    CC_WrReg(CCxxx0_FREQ1,    rf_settings->FREQ1);
   	CC_WrReg(CCxxx0_FREQ0,    rf_settings->FREQ0);
   	CC_WrReg(CCxxx0_MDMCFG4,  rf_settings->MDMCFG4);
   	CC_WrReg(CCxxx0_MDMCFG3,  rf_settings->MDMCFG3);
   	CC_WrReg(CCxxx0_MDMCFG2,  rf_settings->MDMCFG2);
   	CC_WrReg(CCxxx0_MDMCFG1,  rf_settings->MDMCFG1);
   	CC_WrReg(CCxxx0_MDMCFG0,  rf_settings->MDMCFG0);
   	CC_WrReg(CCxxx0_CHANNR,   rf_settings->CHANNR);
   	CC_WrReg(CCxxx0_DEVIATN,  rf_settings->DEVIATN);
   	CC_WrReg(CCxxx0_FREND1,   rf_settings->FREND1);
   	CC_WrReg(CCxxx0_FREND0,   rf_settings->FREND0);
   	CC_WrReg(CCxxx0_MCSM0 ,   rf_settings->MCSM0 );
   	CC_WrReg(CCxxx0_FOCCFG,   rf_settings->FOCCFG);
   	CC_WrReg(CCxxx0_BSCFG,    rf_settings->BSCFG);
   	CC_WrReg(CCxxx0_AGCCTRL2, rf_settings->AGCCTRL2);
		CC_WrReg(CCxxx0_AGCCTRL1, rf_settings->AGCCTRL1);
   	CC_WrReg(CCxxx0_AGCCTRL0, rf_settings->AGCCTRL0);
   	CC_WrReg(CCxxx0_FSCAL3,   rf_settings->FSCAL3);
   	CC_WrReg(CCxxx0_FSCAL2,   rf_settings->FSCAL2);
		CC_WrReg(CCxxx0_FSCAL1,   rf_settings->FSCAL1);
   	CC_WrReg(CCxxx0_FSCAL0,   rf_settings->FSCAL0);
   	CC_WrReg(CCxxx0_FSTEST,   rf_settings->FSTEST);
   	CC_WrReg(CCxxx0_TEST2,    rf_settings->TEST2);
   	CC_WrReg(CCxxx0_TEST1,    rf_settings->TEST1);
   	CC_WrReg(CCxxx0_TEST0,    rf_settings->TEST0);
   	CC_WrReg(CCxxx0_IOCFG2,   rf_settings->IOCFG2);
   	CC_WrReg(CCxxx0_IOCFG0,   rf_settings->IOCFG0);    
   	CC_WrReg(CCxxx0_PKTCTRL1, rf_settings->PKTCTRL1);
   	CC_WrReg(CCxxx0_PKTCTRL0, rf_settings->PKTCTRL0);
   	CC_WrReg(CCxxx0_ADDR,     rf_settings->ADDR);
   	CC_WrReg(CCxxx0_PKTLEN,   rf_settings->PKTLEN);
//#ifdef BAND2010
   	CC_WrReg(CCxxx0_FIFOTHR,  rf_settings->FIFOTHR);
//#endif	
}

#endif //#ifdef CC1101




//====================================================================

//u8 CC_Test(void)
//{ 
//   return CC_RdStatus(CCxxx0_VERSION);//0x03
//}

//u8 CC_RssiCh(u8 rssi)
//{//输出值是正值,但都是负的dBm,例如返回值是55是-55dBm
//  if (rssi>=128)
//  { return (128+RSSI0-(rssi>>1));
//  }else
//  { return (RSSI0-(rssi>>1));
//  }
//}

/*

*/
unsigned char cc2500_get_rssi(void)
{	
	unsigned char rssi =CC_RdStatus(CCxxx0_RSSI);

  if (rssi>=128)
   return (128+RSSI0-(rssi>>1));
  else
   return (RSSI0-(rssi>>1));  	
}


//u8 CC_PackStatus(void)
//{
//  return CC_RdStatus(CCxxx0_PKTSTATUS);
//  //bit0-bit7 GDO0,GDO1,GDO2,SYNC,  CCA,PQT,CS,CRCOK
//  //如果MCSM1.CCA=0没有使用CCA的话,CCA指示位总为1,
//  //如果使用CCA,CCA和CS位就相反
//}

void rf_set_PA_Mode(unsigned char mode)
{
   	switch (mode)
   	{
     	case 2:
	 	   	CC_PaTable(PAMAX2);
		   	break;
	 	case 3:
	 	   	CC_PaTable(PAMAX3);
		   	break;
	 	case 4:
	 	   	CC_PaTable(PAMAX4);
		   	break;
	 	default:
	 	   	CC_PaTable(PAMAX);
		   	break;	   	   
   }
}





void rf_SendPacket(unsigned char *txBuffer, unsigned char size) 	
{
	LNA_EN0;
	PA_EN1;
	
	CC_ClrTx();//v1.1保证TxBYTES无以前字节
  CC_WrReg(CCxxx0_TXFIFO, size);//len
	CC_WrRegs(CCxxx0_TXFIFO, txBuffer, size);
	CC_Cmd(CCxxx0_STX);
	
	//AdcBatt();
}



//static void cc_freq(unsigned char freq, unsigned char rfpwr)
//{
////	    //换片选...
////#ifndef CHAN80
////	#ifdef CC1101		
////		CC_Chan(freq-1); //add by Gavin 
////	#else	
////  	 CC_Chan(freq*6);
////	#endif 
////#else
////	  if (freq<41){ 
////			CC_Chan(freq*6);// 1-40是双数频点 2402-2480
////  	}
////		else{ 
////			freq=3+(freq-41)*6; // 41-80是奇数频点 2401-2479
////			CC_Chan(freq);
////  	}
////#endif
//}

void rf_setfreq(unsigned char freq)
{
#ifdef CC2500
	  if (freq<41){ 
			CC_Chan(freq*6);// 1-40是双数频点 2402-2480
  	}
		else{ 
			freq=3+(freq-41)*6; // 41-80是奇数频点 2401-2479
			CC_Chan(freq);
  	}
#elif defined(CC1101)		
		CC_Chan(freq-1); //add by Gavin
#endif
	
  	//cc_set_pa(rfpwr);//基站功率		
  	CC_XCal();
}




#define 	MAX_LEN		40

//从无线模块读取数据包
static unsigned char cc_rd_packet(unsigned char *buf)
{
	
	volatile unsigned char crc_ok=0;
     
	// Read length byte
	buf[0]= CC_RdReg(CCxxx0_RXFIFO);//第一字节是Len
  if( (buf[0]==0)||(buf[0]>MAX_LEN) ) 
		goto RXERR;

	 
  // Read data from RX FIFO and store in rxBuffer
  CC_RdRegs(CCxxx0_RXFIFO, buf+1, buf[0]); 
   
  // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
  //rssi= 
	CC_RdReg(CCxxx0_RXFIFO);
  //lqi=CC_RdReg(CCxxx0_RXFIFO);
  //if (lqi>0x80)
	if(CC_RdReg(CCxxx0_RXFIFO)>0x80)	
	{ 
	 	crc_ok=1;	// MSB of LQI is the CRC_OK bit	   	
	}
	else 
		crc_ok=0;
	
//  lqi=lqi&0x7F;			 
	//len=
	//CC_RdStatus(CCxxx0_RXBYTES) & 0x7f;//mask by Gavin
//	if (len==0) 
//	 	return ;
	
RXERR:	 //应该为0,不为0就不对,要清除RxFiFo
	CC_ClrRx();

	return crc_ok;
}




//--------------------------------------------------------
//无线模块中断服务程序
void rf_Irq(void)	
{
	volatile unsigned char i;
	unsigned char tmp[64];
	
	PA_EN0;
  LNA_EN1;	
	
	//先处理模块错误情况
	i=CC_RdStatus(0x35)&0x7f;//CCxxx0_MARCSTATE
	if (i==17)
	{CC_ClrRx();goto TRXRET;}//Rx_OverFlow错误
	
	if (i==22) 
	{CC_ClrTx();goto TRXRET;}//Tx_UnderFlow错误
	
	
	//根据是否接收到数据,判断是发送完成中断还是接收中断
	i=CC_RdStatus(0x3B)&0x7f;//CCxxx0_RXBYTES	
	if(i==0){ //发送中断
		//bs_kp.tx_kp_flag=1;
	}		
	else{
		if( cc_rd_packet(tmp) )
			base_core.rf_data_fifo_in(tmp); //keypad_rf_data_save(tmp);		
	}

	
TRXRET:		
  	CC_RxOn();	 //rx 
}



/*
设置同步码
*/
void rf_set_syncode(unsigned short sync)
{
//    uint8_t addr[5] = {INIT_ADDR};	//#define INIT_ADDR           0x19,0x98,0xA4,0x25,0x01
//    addr[2] = sync>>8;
//    addr[3] = sync; 		//修改无线地址码,缺省A425
//    NRF24L01_Set_TxAddr( addr, 4 );         //设置TX地址
//    NRF24L01_Set_RxAddr( 0,addr, 4 );      //设置RX地址 通道0

  CC_WrReg(CCxxx0_SYNC1,sync);
  CC_WrReg(CCxxx0_SYNC0,sync>>8);	
}



//************************
void  rf_initial(void)
{
	CC_RESET();	
#ifdef CC1101	//add by Gavin 
	cc_rf_config(&rfSettings76800);
#else	
	CC_RfConfig(&rfSettings250K);
#endif 		
  rf_set_syncode(0x25A4);//actual test OK!
	
	CC_PaTable(PAMAX);
  CC_WrReg(CCxxx0_MCSM1,0x00 );//0x0f取消CCA,收发总回到RX 不能,否则不能自动校正频率
  CC_WrReg(CCxxx0_MCSM0,0x38 );//MCSM).FS_AUTOCAL 0x18总Calibatre,0x28 IDLE时候,0x38 4次IDLE校正一次
  CC_WHITE(1);

#ifdef CC1101	
	CC_FEC(1); //add by Gavin 
#endif 
	
  CC_RxOn();
  //PA控制
  LNA_EN1;
 	PA_EN0;
}




//----------------------------------------- FCC CE ------------------------------------------------------------------
#ifdef FCCCE
void FCC_Init()
{
	TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);//关闭2.5ms中断
	NVIC_DisableIRQ(EXTI3_IRQn);//关闭无线中断
}	

//认证需要的特殊测试模式
//1 连续发射模式(带调制)
//2 连续收信模式(带调制)
//3 无调制 连续发信模式
//4 无调制 连续收信模式
void FCC_Test(unsigned char mode)
{
	//FccMode=mode;
  switch (mode)
   {
   	case 1://连续MSK输出
	 	  CLI();//关中断
   		CC_Cmd(CCxxx0_SIDLE);
   		//cc_write_reg(0x08,0x02 );//CCxxx0_PKTCTRL0 持续发射测试功率
		  CC_WrReg(0x08,0x22 );	//使用随机数据发送,保证有数据出去
		  //写回标准MSK
		  CC_WrReg(0x12,0x73 );//CCxxx0_MDMCFG2
		  CC_WrReg(0x22,0x10 );//CCxxx0_FREND0

		  //cc_write_reg(0x11,0x7A );	//MDMCFG3 baud调高可以过500KHz

   		LNA_EN0;
	    PA_EN1;
	    CC_Cmd(CCxxx0_STX);
		
		  SEI();		//开中断
		  break;
	
	case 2://连续MSK接收
	    CLI();		//关中断
		  CC_Cmd(CCxxx0_SIDLE);
		  CC_WrReg(0x08,0x02 );//CCxxx0_PKTCTRL0 持续发射测试功率
		  //写回标准MSK
		  CC_WrReg(0x12,0x73 );//CCxxx0_MDMCFG2
   		CC_WrReg(0x22,0x10 );//CCxxx0_FREND0
	 	  
	    PA_EN0;
	    LNA_EN1;
	    CC_Cmd(CCxxx0_SRX);
	
		  SEI();		//开中断
	    break;	  
	
	case 3://连续载波输出,无调制
		  CLI();		//关中断
   		CC_Cmd(CCxxx0_SIDLE);
   		//以下2行用于KCC测试,只出载波,未调制的---注意:SPAN设1M,VBW1M,但RBW设10K才能看到分开的2个波峰
   		CC_WrReg(0x12,0x33 );//CCxxx0_MDMCFG2
   		CC_WrReg(0x22,0x00 );//CCxxx0_FREND0
		  CC_WrReg(0x08,0x02 );//CCxxx0_PKTCTRL0 持续发射测试功率
	
   		LNA_EN0;
	    PA_EN1;
	    CC_Cmd(CCxxx0_STX);

		  SEI();		//开中断
		  break;
	
	case 4://连续载波模式接收,无调制	
	    CLI();		//关中断
   		CC_Cmd(CCxxx0_SIDLE);
   		//以下2行用于KCC测试,只出载波,未调制的---注意:SPAN设1M,VBW1M,但RBW设10K才能看到分开的2个波峰
   		CC_WrReg(0x12,0x33 );//CCxxx0_MDMCFG2
   		CC_WrReg(0x22,0x00 );//CCxxx0_FREND0
		  CC_WrReg(0x08,0x02 );//CCxxx0_PKTCTRL0 持续发射测试功率
   		
	    PA_EN0;
	    LNA_EN1;
	    CC_Cmd(CCxxx0_SRX);
		  
		  SEI();		//开中断  
	 	  break;	  	  
   }
}
#endif

#endif //CCxxxx