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

📄 send.h

📁 使用CC2500实现无线的收发功能
💻 H
字号:

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

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() ;

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


#define RSSI 			0
#define LQI	 			1 


static uchar paTable_CC2500[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };//CC2500发射功率表

uchar txBuffer_CCxx00[]={0x01,0x00};//,0x00,0x00};
uchar rxBuffer_CCxx00[1]= {0};			//接收缓冲
uchar status[2];

 
//250kbps MSK sensitivity
//E 指数,M底数

void WriteRfSettings_CC2500() 
{
    WriteReg(CC2500_FSCTRL1, 0x10);	//0x0B   中频  //0x07???????????0x0a???????????????
	WriteReg(CC2500_FSCTRL0, 0x00);	//0x0C   加到基频上的频率偏移	


	WriteReg(CC2500_FREQ2, 0x5D);	//0x0D   (RF) 
	WriteReg(CC2500_FREQ1, 0x93);	//0x0E   
	WriteReg(CC2500_FREQ0, 0xB1);	//0x0F   

	WriteReg(CC2500_MDMCFG4, 0x0E);	//0x10   (RX KHZ)//0x2d????????????????????
	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, 0x42);	//0x13   禁止前导位纠错;前导4个字节;信道空间的2个指数//0X22?????????????
	WriteReg(CC2500_MDMCFG0, 0xF8);	//0x14   (channal)信道空间(初始为1)的8位尾数26000000/2^18*(256+0xF8)*2^2*(channal)=199.951171875khz
                                    //       此信道的频率单位与基频相加后,就是运行的频率 
	WriteReg(CC2500_CHANNR, 0x00);	//0x0A   //0X02????????????????? 
	WriteReg(CC2500_DEVIATN, 0x00);	//0x15   背离指数为0//0X01?????????

	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, 0x40);//0x1C   AGC控制寄存器  //0X00?????????????????
	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, 0x19);	//0x26	 //0X11????????????????????????????

	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
}


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

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



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





//============================================================
//	写一个数到地址为<addr>的寄存器里
//===========================================================
void WriteReg(uchar addr, uchar value) 
{
	ZGB_CS=0;
	while(ZGB_SO);   
	addr&=0x7F;
	SPI_write(addr);
	SPI_write(value);
	ZGB_CS=1;
}





//===========================================================
//	写多个值到寄存器里
//	起始地址:addr
//	数量:count
//	数据来源:*buffer
//
//============================================================
void WriteBurstReg(uchar addr, uchar *buffer, uchar count)
{
	unsigned char j,value;//i;
	ZGB_CS = 0;
	while(ZGB_SO);
	addr |= WRITE_BURST;
	SPI_write(addr);
	for(j=0;j<count;j++)
	{
		value=buffer[j];

	  	SPI_write(value);
	 
	  	//for(i=0;i<10;i++);///100??????????????????????????????????
	}
	ZGB_CS = 1;
}



//===========================================================
//	写一个命令到RF里
//===========================================================

uchar Strobe(uchar command) 
{
    uchar status;
	ZGB_CS = 0;
	while(ZGB_SO);
	status = SPI_write(command);
	ZGB_CS = 1;
	return(status);
}


//=========================================================
//	发送数据包(查询方式)
//	数据来源:*txBuffer
//	数据包长度:size
//=========================================================

uchar SendPacket(uchar *txBuffer, uchar size) 
{
    stx_en = 0;
	//Strobe(CC2500_SIDLE);	//退出

	//Strobe(CC2500_SFTX); 	//Flush the TX FIFO buffer

	WriteBurstReg(CC2500_TXFIFO, txBuffer, size);

	Strobe(CC2500_STX);		//用STX 开启TX
	NOP(450);
/*	
	stx_en = 1;
   
	rxtx_time = size*100;//100???????????????????????
	while(stx_en)
	{
	    rxtx_time--;
		if(rxtx_time==0)//仅执行一次
		{
			Strobe(CC2500_SIDLE);	//发射失败,退出
			return 1;
		}	
	}
*/	
    Strobe(CC2500_SIDLE);
	return 0;
}



//=========================================================  
void POWER_UP_RESET_CC2500() 
{
	ZGB_SCLK   = 1;
	NOP(100);
	ZGB_SI = 0;
    NOP(100);
	ZGB_CS = 1;
	NOP(100);
	ZGB_CS = 0;
    NOP(10);
	ZGB_CS = 1;
	NOP(200);
	ZGB_CS = 0;
    while(ZGB_SO);// 等待变低 
	Strobe(CC2500_SRES);	/*重启芯片当电源供应遵守表12 的要求时,便可保证合适的重启功率。然而,应该
	假设芯片含有未知的状态,直到在SPI 接口上传递一个SRES 滤波为止。任何情况下,
	在开始工作之后,应该传送一个SRES 滤波。*/
    while(ZGB_SO);
	//Strobe(CC2500_SIDLE);////进入空闲模式,SIDLE 命令滤波总能用来强制通信控制装置进入空闲状态
	ZGB_CS = 1;
}


⌨️ 快捷键说明

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