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

📄 rf.c

📁 台湾义隆公司的EM198810 2.4G无线程序
💻 C
字号:

#include "Main.H"


void Delay_Xms(INT8U D_val)
{
	INT8U i,j;
	for(i = 0;i<D_val;i++)
	{
		for(j=0;j<248;j++)
		{
			NOP();
			NOP();
		}
		NOP();
	}
}

//
//*****************************************************************************************
//函数名:SpisendByte(INT8U dat)
//输入:发送的数据
//输出:无
//功能描述:SPI发送一个字节
//*****************************************************************************************
//INT8U SpiTxRxByte(INT8U dat)
//{
//        INT8U i,temp;
//        temp = 0;
//
//        CLK = 0;
//        for(i=0; i<8; i++)
//        {
//			if(dat & 0x80)
//			{
//				MOSI = 1;
//			}
//			else
//				MOSI = 0;
//			dat <<= 1;
//
//			CLK = 1;
//			NOP();
//			NOP();
//
//			temp <<= 1;
//			if(MISO)
//				temp++;
//			CLK = 0;
//			NOP();
//			NOP();
//		}
//        return temp;
//}


void SpiSendChar(INT8U txbuf)
{
	INT8U i;
	for(i = 0; i < 8; i++)
	{
		txbuf <<= 1;
		MOSI = CARRY;
		CLK = 1;
		CLK = 0;
		NOP();
		NOP();
		NOP();
		NOP();
	}
}

INT8U SpiReceiveChar(void)
{
	INT8U i,RxData;
	RxData = 0;
	for(i = 0; i < 8;i++)
	{
		RxData <<= 1;
		CLK = 1;
		NOP();
		NOP();
		NOP();
		NOP();
		RxData |= MISO;
		CLK = 0;
		NOP();
		NOP();
		NOP();
		NOP();
	}
	return RxData;
}


void POWER_ON_RESET(void)
{
	SS = 1;
	MOSI = 1;
	RESET_n = 0;
	Delay_Xms(30);
	RESET_n = 1;
	Delay_Xms(30);
	RESET_n = 0;
	Delay_Xms(30);
	RESET_n = 1;
	Delay_Xms(26);
}

//清接收缓冲区
void Reset_Rx_FIFO(void)
{
	SS = 0;
	SpiSendChar(0x52);
//	Delay_Xms(1);
	SpiSendChar(0x00);
	SpiSendChar(0x80);
	SS = 1;
}
//进入接收状态
void Enter_Rx_STATE(void)
{
	SS = 0;
	SpiSendChar(0x07);
//	Delay_Xms(1);
	SpiSendChar(0x00);
	SpiSendChar(0x90);
	SS = 1;
}

//读缓冲
// *Length 接收数据的长度
// *RxBuf  接收数据的缓冲
void Read_FIFO(INT8U *Length,INT8U *rxbuffer)
{
	INT8U i;

	SS = 0;
	SpiSendChar(0xD0);
//	Delay_Xms(1);
	*Length = SpiReceiveChar();
//	for(i = 0; i < *Length; i++)
	for(i = 0; i < 4; i++)//Test
	{
		*rxbuffer++ = SpiReceiveChar();
	}
	SS = 1;
}

//清发送缓冲
void Reset_Tx_FIFO(void)
{
	SS = 0;
	SpiSendChar(0x52);
//	Delay_Xms(1);
	SpiSendChar(0x80);
	SpiSendChar(0x00);
}

//进入发送状态
void Enter_Tx_STATE(void)
{
	SS = 0;
	
	SpiSendChar(0x07);
//	Delay_Xms(1);
	SpiSendChar(0x01);
	SpiSendChar(0x10);
	SS = 1;
}

//写发送缓冲
// Length 发送数据的长度
// TxBuf  发送缓冲
void Write_FIFO(INT8U Length,INT8U *txbuffer)
{
	INT8U i;
	SS = 0;
	SpiSendChar(0x50);
//	Delay_Xms(1);
	SpiSendChar(Length);
	for(i = 0; i < Length; i++)
	{
		SpiSendChar(*txbuffer++);
	}
	SS = 1;
}



void Write_EM198810_REG(INT8U Addr,INT16U EmData)
{
	SS = 0;
	SpiSendChar(Addr);
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	SpiSendChar(EmData>>8);
	SpiSendChar(EmData);
	SS = 1;
}

INT16U Read_EM198810_REG(INT8U Addr)
{
	INT16U RxData;
	INT8U Data_Hi,Data_Li;

	SS = 0;
	Addr |= 0x80;
	SpiSendChar(Addr);

	//Delay_Xms(1);
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();

	Data_Hi = SpiReceiveChar();

	Data_Li = SpiReceiveChar();
	Delay_Xms(13);

	RxData = 0;
	RxData = Data_Hi;
	RxData <<= 8;
	RxData |= Data_Li;
	SS = 1;
	return RxData;
}



void Initial_frame(void)
{
	INT8U frame_adr,i;
	INT16U frame_arr[]={0x9800,0xff0f,0x8028,0x8056,0x4ef6,0xf6f5,0x185c,0xd651,0x4404,0xe000,0x0000};
	for(i = 0,frame_adr = 0x30;i < 11;i++,frame_adr++)
	{
		Write_EM198810_REG(frame_adr,frame_arr[i]);
	}
}

void Initial_RF_REG(void)
{
	INT8U rf_adr,i;
	INT16U rf_reg[]={0x354f,0x1f01,0x38d8,0x00a1,0x124c,0x8008,0x2101,0x0004,0x4041,0x7e00,0x0000,0x169d,0x802f,0xb0f8,0xe000,0xa114,0x8191,0x6962,0x0002,0x0002,0xb140,0x780f,0x3f04,0x5800};
	
	for(i=0,rf_adr = 0;rf_adr < 0x1d;rf_adr++)
	{
		if((rf_adr == 1) || (rf_adr == 3) || (rf_adr == 6) || (rf_adr == 0x11) || (rf_adr == 0x1b))
			continue;
		
		Write_EM198810_REG(rf_adr,rf_reg[i]);
		i++;
	}
}

//	Write_EM198810_REG(0x00,0x354f);
//	Write_EM198810_REG(0x02,0x1f01);
//	Write_EM198810_REG(0x04,);
//	Write_EM198810_REG(0x05,);
//	Write_EM198810_REG(0x07,);
//	Write_EM198810_REG(0x08,);
//	Write_EM198810_REG(0x09,);
//	Write_EM198810_REG(0x0a,);
//	Write_EM198810_REG(0x0b,);
//	Write_EM198810_REG(0x0c,);
//	Write_EM198810_REG(0x0d,);
//	Write_EM198810_REG(0x0e,);
//	Write_EM198810_REG(0x0f,);
//	Write_EM198810_REG(0x10,);
////	Write_EM198810_REG(0x11,0x0066);
//	Write_EM198810_REG(0x12,);
//	Write_EM198810_REG(0x13,);
//	Write_EM198810_REG(0x14,);
//	Write_EM198810_REG(0x15,);
//	Write_EM198810_REG(0x16,);
//	Write_EM198810_REG(0x17,);
//	Write_EM198810_REG(0x18,);
//	Write_EM198810_REG(0x19,);
//	Write_EM198810_REG(0x1a,);
////	Write_EM198810_REG(0x1b,0x8000);
//	Write_EM198810_REG(0x1c,);


void Initial_RF(void)
{
	POWER_ON_RESET();

	Initial_frame();
	Delay_Xms(26);
	Initial_RF_REG();
	Delay_Xms(26);
	Delay_Xms(52);
}


//INT8U REG_TEST(void)
//{
//	INT16U temp;
//	temp = Read_EM198810_REG(0x00);
//	if(temp != 0x354f) return 0;
//	temp = Read_EM198810_REG(0x02);
//	if(temp != 0x1f01) return 0;
//	temp = Read_EM198810_REG(0x04);
//	if(temp != 0x38d8) return 0;
//	temp = Read_EM198810_REG(0x05);
//	if(temp != 0x00a1) return 0;
//	temp = Read_EM198810_REG(0x07);
//	if(temp != 0x124c) return 0;
//	temp = Read_EM198810_REG(0x08);
//	if(temp != 0x8008) return 0;
//	temp = Read_EM198810_REG(0x09);
//	if(temp != 0x2101) return 0;
//	temp = Read_EM198810_REG(0x0a);
//	if(temp != 0x0004) return 0;
//	temp = Read_EM198810_REG(0x0b);
//	if(temp != 0x4041) return 0;
//	temp = Read_EM198810_REG(0x0c);
//	if(temp != 0x7e00) return 0;
//	temp = Read_EM198810_REG(0x0d);
//	if(temp != 0x0000) return 0;
//	temp = Read_EM198810_REG(0x0e);
//	if(temp != 0x169d) return 0;
//	temp = Read_EM198810_REG(0x0f);
//	if(temp != 0x802f) return 0;
//	temp = Read_EM198810_REG(0x10);
//	if(temp != 0xb0f8) return 0;
////	temp = Read_EM198810_REG(0x11);
////	if(temp != 0x0066) return 0;
//	temp = Read_EM198810_REG(0x12);
//	if(temp != 0xe000) return 0;
//	temp = Read_EM198810_REG(0x13);
//	if(temp != 0xa114) return 0;
//	temp = Read_EM198810_REG(0x14);
//	if(temp != 0x8191) return 0;
//	temp = Read_EM198810_REG(0x15);
//	if(temp != 0x6962) return 0;
//	temp = Read_EM198810_REG(0x16);
//	if(temp != 0x0002) return 0;
//	temp = Read_EM198810_REG(0x17);
//	if(temp != 0x0002) return 0;
//	temp = Read_EM198810_REG(0x18);
//	if(temp != 0xb140) return 0;
//	temp = Read_EM198810_REG(0x19);
//	if(temp != 0x780f) return 0;
//	temp = Read_EM198810_REG(0x1a);
//	if(temp != 0x3f04) return 0;
////	temp = Read_EM198810_REG(0x1b);
////	if(temp != 0x8000) return 0;
//	temp = Read_EM198810_REG(0x1c);
//	if(temp != 0x5800) return 0;
//
//	return 1;
//}


void TxD_RF(INT8U Len,INT8U *dat)
{
	Reset_Tx_FIFO();
	Delay_Xms(11);
	Enter_Tx_STATE();
	Delay_Xms(11);
	Write_FIFO(Len,dat);
	while(PKT_FLAG == 0);
	Delay_Xms(20);
//	Reset_Rx_FIFO();
//	Enter_Rx_STATE();
}





INT8U RxD_RF(INT8U *Len,INT8U *dat)
{
	INT8U i;
	Reset_Rx_FIFO();
	Delay_Xms(20);
	Enter_Rx_STATE();
	for(i=0;i<10;i++)
	{
		Delay_Xms(20);
	}
	
	if(PKT_FLAG)
	{
		Read_FIFO(Len,dat);
		return 1;
	}
	else
		return 0;
}


void Write_Test(void)
{
	Write_EM198810_REG(0x34,0x6201);
	Delay_Xms(2);
	Write_EM198810_REG(0x35,0x6302);
	Delay_Xms(2);
	Write_EM198810_REG(0x36,0x6403);
	Delay_Xms(2);
}

void SpiReadTest(void)
{
	INT8U Adr_R,R_Data_Hi,R_Data_Lo,i;
	
	for(i=0;i<50;i++)
	{
		SS = 0;
		Adr_R = i+29;
		Adr_R |= 0x80;
		SpiSendChar(Adr_R);
		Delay_Xms(1);
		R_Data_Hi = SpiReceiveChar();
		Delay_Xms(1);
		R_Data_Lo = SpiReceiveChar();
		SS = 1;
		Write_E2prom_Byte(i*2,R_Data_Hi);
		Write_E2prom_Byte(i*2+1,R_Data_Lo);
		Delay_Xms(1);
	}
}

⌨️ 快捷键说明

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