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

📄 tr.c

📁 无线模块cc2500的发射与接收程序源码
💻 C
📖 第 1 页 / 共 2 页
字号:
        NOP(2);       
		PORTD&=0B01111111;       //ZGB_SCLK=0;
		NOP(2);
 	}		
	return value;
}

//==========================================================
//	读单个寄存器的值
//==========================================================
uchar ReadReg(uchar addr) 
{
	unsigned char value;
	PORTD&=0B01111111;  //ZGB_CS = 0;
	NOP(2);
	
	 SO_data=PIND; 
	while((SO_data&0B00000100) == 0B00000100)
	   SO_data=PIND;  //ZGB_SO);
	
	addr|=READ_SINGLE;
	SPI_write(addr);
	value=SPI_read();
	NOP(2);
	PORTD|=0B10000000;  //ZGB_CS=1;
	NOP(2);
	return value;
}


//============================================================
//	写一个数到地址为<addr>的寄存器里
//===========================================================
void WriteReg(uchar addr, uchar value) 
{
	PORTD&=0B01111111;  //ZGB_CS=0;
	  SO_data=PIND; 
	while( (SO_data&0B00000100) == 0B00000100 )
	  SO_data=PIND; //ZGB_SO); 
	addr&=0x7F;
	SPI_write(addr);
	SPI_write(value);
	NOP(2);
	PORTD|=0B10000000;  //ZGB_CS=1;

}


//===========================================================
//	读RF的地址为<addr>的状态寄存器
//===========================================================
uchar ReadStatus(uchar addr) 
{
	unsigned char value;
	PORTD&=0B01111111;  //ZGB_CS = 0;
	
	SO_data=PIND; 
	while(( SO_data&0B00000100 ) == 0B00000100) //ZGB_SO);
    SO_data=PIND;
	addr|= READ_BURST;
	SPI_write(addr);
	value=SPI_read();
	NOP(2);
	PORTD|=0B10000000;  //ZGB_CS = 1;
    cRSSI = value;
	return value;
}



//============================================================
//	读多个寄存器的值
//	起始地址:addr
//	数量:count
//	保存地方:*buffer
//============================================================

void ReadBurstReg(uchar addr, uchar *buffer, uchar count) 
{
	unsigned char j,value;
	PORTD&=0B01111111;  //ZGB_CS = 0;
	
	//==============
	 SO_data=PIND; 
	while(( SO_data&0B00000100 ) == 0B00000100)  //ZGB_SO);
	SO_data=PIND;
	addr|=READ_BURST;
	SPI_write(addr);
	
	for(j=0;j<count;j++) 
	{
	  value=SPI_read();
	  buffer[j]=value;
	}
	NOP(1);
	PORTD|=0B10000000;  //ZGB_CS = 1;
}

//===========================================================
//	写多个值到寄存器里
//	起始地址:addr
//	数量:count
//	数据来源:*buffer
//
//============================================================
void WriteBurstReg(uchar addr, uchar *buffer, uchar count)
{
	unsigned char i,j,value;
	PORTD&=0B01111111;  //ZGB_CS = 0;
	
	
	//PORTB&=0B11011111;
	 SO_data=PIND; 
	while( ( SO_data&0B00000100 ) == 0B00000100 )  //ZGB_SO);
	SO_data=PIND;
  
	addr |= WRITE_BURST;
	SPI_write(addr);

	for(j=0;j<count;j++)
	{
		value=buffer[j];

	  	SPI_write(value);
	 
	  	for(i=0;i<100;i++);
	}
	NOP(1);
	PORTD|=0B10000000;  //ZGB_CS = 1;
}



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

uchar Strobe(uchar command) 
{
    uchar status;
	
	PORTD &= 0B01111111;  //ZGB_CS = 0;
   
	//==============
	SO_data=PIND; 
	while( ( SO_data&0B00000100 ) == 0B00000100) //ZGB_SO);
	   SO_data=PIND;
	status = SPI_write(command);
	
	NOP(100);
	PORTD |= 0B10000000;  //ZGB_CS = 1;
	return(status);
}


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

uchar SendPacket(uchar *txBuffer, uchar size) 
{
    stx_en = 0;
	Strobe(CC2500_SIDLE);	//退出
//	Dly1mS(1);
	Strobe(CC2500_SFTX); 	//Flush the TX FIFO buffer
//	Dly1mS(1);
	WriteBurstReg(CC2500_TXFIFO, txBuffer, size);
//	Dly1mS(1);
	Strobe(CC2500_STX);		//用STX 开启TX
	stx_en = 1;

	rxtx_time = size*100;
	while(stx_en)
	{
	    //Delay_5_us();
	    rxtx_time--;
		if(rxtx_time==0)//仅执行一次
		{
			Strobe(CC2500_SIDLE);	//发射失败,退出
            
			return 1;
        }
//===============================	 	
	}
	

    Strobe(CC2500_SIDLE);
	
	return 0;
  
}


//=========================================================
//	接收数据包(查询方式)
//	保存在:*rxBuffer
//	数据包长度:length
//=========================================================

uchar ReceivePacket(uchar *rxBuffer, uchar length) 
{
   // uchar i;
	if(ReadStatus(CC2500_RXBYTES)==0)  //接收是否下溢
	{
		return 0;
	}
  	rxtx_time=length*100;				
  	while (srx_en)		
  	{
  		Delay_5_us();
		rxtx_time--;
		if(rxtx_time==0)
		{
			Strobe(CC2500_SIDLE);//接收失败,退出
			return 0;
		}  	
  	}

    packetLength = ReadReg(CC2500_RXFIFO);//读取接收的字节数

   	if (packetLength == length) 
	{
		ReadBurstReg(CC2500_RXFIFO, rxBuffer, packetLength); 
        ReadBurstReg(CC2500_RXFIFO, status, 2);
        Strobe(CC2500_SFRX); 
        return (status[LQI] & CRC_OK);//连接质量的解调器估计
   	} 
	else 
	{
        Strobe(CC2500_SIDLE);//退出
		Strobe(CC2500_SFRX);//刷新缓冲
       	return 0;
	}
  
}
//==========================================================
void POWER_UP_RESET_CC2500() 
{
	PORTD |= 0B00000010; //ZGB_SCLK   = 1;
	NOP(100);
	PORTD &= 0B11111110;  //ZGB_SI = 0;
    NOP(100);
	PORTD |= 0B10000000;  //ZGB_CS = 1;
	NOP(100);
	PORTD &= 0B01111111;  //ZGB_CS = 0;
    NOP(10);
	PORTD |= 0B10000000;  //ZGB_CS = 1;
	NOP(200);
	PORTD &= 0B01111111;  //ZGB_CS = 0;
	
	//==============
	SO_data=PIND; 
    while( ( SO_data&0B00000100 ) == 0B00000100)   //ZGB_SO 等待变低 
	SO_data=PIND;
	Strobe(CC2500_SRES);	/*重启芯片当电源供应遵守表12 的要求时,便可保证合适的重启功率。然而,应该
	假设芯片含有未知的状态,直到在SPI 接口上传递一个SRES 滤波为止。任何情况下,
	在开始工作之后,应该传送一个SRES 滤波。*/
	
	 SO_data=PIND; 
    while( (SO_data&0B00000100 ) == 0B00000100)        //ZGB_SO);
	SO_data=PIND;//==============
	//Strobe(CC2500_SIDLE);////进入空闲模式,SIDLE 命令滤波总能用来强制通信控制装置进入空闲状态
	PORTD|=0B10000000;  //ZGB_CS = 1;
}


⌨️ 快捷键说明

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