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

📄 tr.c

📁 无线模块cc2500的发射与接收程序源码
💻 C
📖 第 1 页 / 共 2 页
字号:

#include <iom8v.h>

#include "main.h"
#include "CC2500.h"
#include "zgb.h"
//#include "uart0.h"
#include "spi.h"
#include "pcdef.h"

uchar packetLength;
uchar cRSSI;
uchar stx_en,srx_en;
int rxtx_time;
uchar SO_data;

void SetupCC2500(void);
uchar RxCCxx00(void);
void TxCC2500(void);
void RXCC2500(void);

uchar SPI_write(uchar);
uchar SPI_read();
uchar ReadReg(uchar); 
void WriteReg(uchar, uchar);
uchar ReadStatus(uchar); 
void ReadBurstReg(uchar addr, uchar *buffer, uchar count); 
void WriteBurstReg(uchar addr, uchar *buffer, uchar count);
uchar Strobe(uchar strobe) ;
uchar SendPacket(uchar *txBuffer, uchar size);
uchar ReceivePacket(uchar *rxBuffer, uchar length);
void POWER_UP_RESET_CC2500(void) ;

#define WRITE_BURST     0x40
#define READ_SINGLE     0x80
#define READ_BURST      0xC0

#define RSSI 			0
#define LQI	 			1 

//static uchar paTable_CC2500[] = {0xFF, 0xFE, 0xBB, 0xA9, 0x7F, 0x6E, 0x97, 0xC5 };	//CC2500发射功率表
static uchar paTable_CC2500[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };//CC2500发射功率表
//uchar txBuffer_CCxx00[] = {10, 0x5a};//0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9};
uchar txBuffer_CCxx00[] = {0x03,0x5a,0X05,0x00};//0x05,0x00};
uchar rxBuffer_CCxx00[3] = {0};			//接收缓冲
uchar status[2];

//250kbps MSK sensitivity
//E 指数,M底数
void WriteRfSettings_CC2500() 
{    
	WriteReg(CC2500_FSCTRL1, 0x07);	//0x0B   中频
	
	WriteReg(CC2500_FSCTRL0, 0x00);	//0x0C   加到基频上的频率偏移	
	WriteReg(CC2500_FREQ2, 0x5D);	//0x0D   (RF) 
	WriteReg(CC2500_FREQ1, 0x93);	//0x0E   
	WriteReg(CC2500_FREQ0, 0xB1);	//0x0F   

	WriteReg(CC2500_MDMCFG4, 0x2D);	//0x10   (RX KHZ)
	WriteReg(CC2500_MDMCFG3, 0x3B);	//0x11   (DATARATE)
	WriteReg(CC2500_MDMCFG2, 0x73);	//0x12   BIT7:0 = Enable (better sensitivity) 
	                                //            1 = Disable (current optimized). Only for data rates ≤ 250 kBaud
                                    //       BIT6:4 = 0x111 MSK
                                    //       BIT3   = 0 禁止曼切斯特编码/译码
									//       BIT2:0 = 0X011 开启TX时的重复同步词汇发送和RX时的32 位同步词汇侦测
									//                   (只有32 位中的30 位需要匹配):
	WriteReg(CC2500_MDMCFG1, 0x22);	//0x13   禁止前导位纠错;前导4个字节;信道空间的2个指数
	WriteReg(CC2500_MDMCFG0, 0xF8);	//0x14   (channal)信道空间(初始为1)的8位尾数26000000/2^18*(256+0xF8)*2^2*(channal)=199.951171875khz
                                    //       此信道的频率单位与基频相加后,就是运行的频率 
	WriteReg(CC2500_CHANNR, 0x00);	//0x0A   
	WriteReg(CC2500_DEVIATN, 0x01);	//0x15   背离指数为0

	WriteReg(CC2500_FREND1, 0xB6);	//0x21   前端rx配置
	WriteReg(CC2500_FREND0, 0x10);	//0x22   前端TX配置,调整当前TX LO 缓冲(输入到PA)

	WriteReg(CC2500_MCSM2, 0x07);	//0x16   至到数据包终止
	WriteReg(CC2500_MCSM1, 0x30);	//0x17   若RSSI 在门限之下,清理数据包指示,除非当前接收一个数据包
									//		 在数据包被接受后的下一个状态:空闲
									//       在数据包已发送到(TX)后的下个状态:空闲
	WriteReg(CC2500_MCSM0, 0x18);	//0x18   当从空闲到TX 或RX时,进行自动校准
									//       终止次数64次,禁止引脚通讯控制选项,XOSC_FORCE_OFF

	WriteReg(CC2500_FOCCFG, 0x1D);	//0x19   频率偏移补偿配置

	WriteReg(CC2500_BSCFG,  0x1C);	//0x1A   位同步控制

	WriteReg(CC2500_AGCCTRL2, 0xC7);//0x1B   AGC控制寄存器
	WriteReg(CC2500_AGCCTRL1, 0x00);//0x1C   AGC控制寄存器
	WriteReg(CC2500_AGCCTRL0, 0xB0);//0x1D   AGC控制寄存器
  
	WriteReg(CC2500_FSCAL3, 0xEA);	//0x23	 频率合成器校准配置和结果寄存器
	WriteReg(CC2500_FSCAL2, 0x0A);	//0x24	 FSCAL3 CHIP_CURR_CAL_EN FSCAL3
	WriteReg(CC2500_FSCAL1, 0x00);	//0x25	 
	WriteReg(CC2500_FSCAL0, 0x11);	//0x26	 

	WriteReg(CC2500_FSTEST, 0x59); 	//0X29   测试用

	WriteReg(CC2500_TEST2, 0x88);	//0x2C   测试用
	WriteReg(CC2500_TEST1, 0x31);	//0x2D   测试用
	WriteReg(CC2500_TEST0, 0x0B);	//0x2E   测试用

	WriteReg(CC2500_IOCFG2, 0x29);  //0x00  GDO2输出不反向,默认为CHIP_RDY,CHIP_RDYn 可在SO 脚被观测CHIP_RDYn 信号表明晶体正处于工作中,
//调节数字供给电压是稳定的。
	WriteReg(CC2500_IOCFG1, 0x2E);//0x01   低驱动,不反向,高阻态
	WriteReg(CC2500_IOCFG0, 0x06);  //0x02   //
	
	/*非温度检测,不反转,当同步词汇被送出/收到时声明,在数据包末端时反声明。对RX,当可选地址检测失败
或RX FIFO 溢出时,引脚被反声明。若TX FIFO 下溢,这个引脚将同样被反声明*/

	WriteReg(CC2500_PKTCTRL1, 0x04);//0x07   附加状态字RSSI LQI如:CRCOK,无地址检查。
	WriteReg(CC2500_PKTCTRL0, 0x05);//0x08   白化关闭,正常模式,使用RX/TX FIFO,CRC_EN,可变长度数据包

	WriteReg(CC2500_ADDR,    0x00);	//0x09   数据包过滤时使用的地址ADDRESS=00 FOR pc_card//????????????

	WriteReg(CC2500_PKTLEN, 0x3D); 	//0x06   固定包的长度与可变数据包的最大长度
    WriteReg(CC2500_FIFOTHR, 0x07);	//0x03   TXFIFO=33/RXFIFO=32
	
}



void main(void)
{   
	system_init();
     Dly1mS(6); 
    SetupCC2500(); 
	Strobe(CC2500_SIDLE);
    Strobe(CC2500_SRX); 
   
 
	
//=====================================================================================
 while(1)  //for RX 
  {
   PORTB|=0B00100000;
   SendPacket(txBuffer_CCxx00, sizeof(txBuffer_CCxx00));//发送数据包 
   PORTB&=0B11011111;
   NOP(10);
  } 

}
//======================================================================================

//初始化cc2500并切换到接收状态
//
//======================================================================================



void SetupCC2500(void)
{
	POWER_UP_RESET_CC2500();//上电复位,进入空闲模式,重启  
	WriteRfSettings_CC2500();//设置各寄存器
	WriteBurstReg(CC2500_PATABLE, paTable_CC2500, sizeof(paTable_CC2500));//输出功率
    //* MCU 必须通过STX、SRX 和SIDLE 滤波控制发送和接收的起始和终止。  */
	//PORTB&=0B11011111;
}

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

//======================================================================================
//
//初始化cc2500并切换到接收状态
//
//======================================================================================
 
//------------------------------------------------------------
//  判断CC1100,CC2500是否接收到数据,如果有,在数码管显示出来

//-------------------------------------------------------------
uchar RxCCxx00(void)
{	
	uchar	length;
    //***LED OFF
	length = sizeof(rxBuffer_CCxx00);//10个
	srx_en = 0;
    if(ReadStatus(CC2500_MARCSTATE)!=0x0D)//主通信控制状态机状态  RX状态,不是接收状态下
	{
    	Strobe(CC2500_SRX);//启用RX
	}
	srx_en = 1;
   if (ReceivePacket(rxBuffer_CCxx00, length))//CRC正确的话
	{
// ======================================
	   //SEND_LED = ~SEND_LED;
		return 	1;			
	}
	else
		return 0;
}


//------------------------------------------------------------
// TX OPTION CC2500,CC2500pa,cc2550,cc2550pa发射数据
//-------------------------------------------------------------
void TxCC2500()
{
 	SendPacket(txBuffer_CCxx00, sizeof(txBuffer_CCxx00));
}


//---------------------------------------------------------------
void RXCC2500(void)
{
                                                       
	if(RxCCxx00())				//是否收到数据? 收到后处理                                     
	{ 
		;
    }                                                                                        

}       
 


//================================================================
//  SPI_write
//	software spi 
//  写进去数据的同时,读出状态字 
//=================================================================
uchar SPI_write(uchar value)
{
	uchar i,spi_status;
	for(i=0;i<8;i++) 
	{  
		PORTD&= 0B11111101;        //ZGB_SCLK = 0; //上升沿锁存
		NOP(3);
		if(value&0x80)//先进高位
			  PORTD|= 0B00000001;  //ZGB_SI=1;
		else 
			  PORTD&= 0B11111110;  // ZGB_SI=0;
		value <<=1;

		NOP(2);
        PORTD|= 0B00000010;        //ZGB_SCLK=1;  
		spi_status<<=1;//先出高位
		NOP(2);
	
	    SO_data=PIND;//==============
	    if( (SO_data&0B00000100) == 0B00000100)  //ZGB_SO
		   	spi_status|= 0x01;
	    else
		    spi_status&= ~0x01;
		
		NOP(2);
	}
	NOP(2);
	PORTD&= 0B11111101;        //ZGB_SCLK = 0; 
	NOP(2);
	return(spi_status);
}


//--------------------------------------------------------------------
uchar SPI_read()
{
	uchar i,value;
	for(i=0;i<8;i++) 
	{ 
	   
		value <<=1;
	    PORTD|= 0B00000010;        //ZGB_SCLK=1;
		NOP(2);
		
		SO_data=PIND;  //==============
		if( (SO_data&0B00000100) == 0B00000100)  //ZGB_SO) 
			value |= 0x01;
		else 
			value &= ~0x01;
		

⌨️ 快捷键说明

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