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

📄 rf905.c

📁 51事例原代码 很多很好用 51事例原代码 很多很好用
💻 C
字号:
//RF905 IO口定义

sbit	MISO   = P1^1;	//SPI输出
sbit	MOSI   = P1^2;	//SPI输入
sbit	CSN    = P1^3;	//SPI使能  低电平有效
sbit	SCK    = P1^4;	//SPI时钟
sbit	PWR_UP = P1^5;	//数字输入 1 芯片上电
sbit	TX_EN  = P1^6;	//数字输入 1 TX模式 0 RX模式
sbit	TRX_CE = P1^7;	//数字输入 1 使能芯片发射或接收

sbit	DR     = P3^2;	//数字输出 1 接收或发射数据完成
sbit	AM     = P3^3;	//数字输出 1 地址匹配
sbit	CD     = P3^4;	//数字输出 1 载波检测

sbit	RF905_indcator = P1^0;//RF905状态指示灯,若处于发射状态则点亮。

#define ON		0		//亮
#define OFF		1		//灭

//SPI指令

#define WC		0x00	//写配置寄存器
#define RC		0x10	//读配置寄存器
#define WTP		0x20	//向TX-Payload寄存器写入发送有效数据
#define RTP		0x21	//从TX-Payload寄存器读取发送有效数据
#define WTA		0x22	//向TX-Address寄存器写入发送地址
#define RTA		0x23	//从TX-Address寄存器读取发送地址
#define RRP		0x24	//从RX-Payload寄存器读取接收到的有效数据

//
#define BYTE_BIT0	0x01
#define BYTE_BIT1	0x02
#define BYTE_BIT2	0x04
#define BYTE_BIT3	0x08
#define BYTE_BIT4	0x10
#define BYTE_BIT5	0x20
#define BYTE_BIT6	0x40
#define BYTE_BIT7	0x80

bdata unsigned  char DATA_BUF;		//SPI读/写缓冲区

#define DATA_BUFF7	((DATA_BUF&BYTE_BIT7) != 0) //DATA_BUF第7位
#define DATA_BUFF0  ((DATA_BUF&BYTE_BIT0) != 0)	//DATA_BUF第0位

//unsigned char RF905_DATA_BUFF[32]={"TTx Test!"};//无线通讯模块接收发送数据缓冲区


//RF905寄存器配置
unsigned char idata RF905_REG[10]=
{
  0x4c,                             //CH_NO,配置频段在423MHZ
  0x2C,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x20,0x20,                        //接收发送有效数据长度为32字节
  0xCC,0xCC,0xCC,0xCC,              //接收地址
  0x5E,                             //CRC充许,8位CRC校验,外部时钟信号使能,输出4MHz,16M晶振
};

unsigned char code TxAddress[4]={0xCC,0xCC,0xCC,0xCC};

static void delay(unsigned char n)
{
	unsigned int i;
	while(n--)
	for(i=0;i<80;i++);
}

//SPI 读一个字节
unsigned char spi_read(void)
{
	unsigned char i;
	for (i=0;i<8;i++)
	{
		DATA_BUF=DATA_BUF<<1;
		SCK=1;
		if (MISO)	//读取最高位,保存至最末尾,通过左移位完成整个字节
		{
			DATA_BUF|=BYTE_BIT0;
		}
		else
		{
			DATA_BUF&=~BYTE_BIT0;
		}
		SCK=0;
	 }
	 return DATA_BUF;
}

//SPI 写一个字节
void spi_write(unsigned char send)
{
	unsigned char i;
	DATA_BUF=send;
	for (i=0;i<8;i++)
	{
		if (DATA_BUFF7)	//总是发送最高位
		{
			MOSI=1;
		}
		else
		{
			MOSI=0;
		}
		SCK=1;
		DATA_BUF=DATA_BUF<<1;
		SCK=0;
	}
}




//配置RF905
void set_RF905_REG(void)
{
	unsigned char i;
	CSN=0;
	spi_write(WC);
	for(i=0;i<10;i++)
	{
		spi_write(RF905_REG[i]);
	}
	CSN=1;

}

//
void set_Tx_address(void)
{ 
	unsigned char i;
	CSN=0;
	spi_write(WTA);
	for(i=0;i<4;i++)
	{
		spi_write(TxAddress[i]);
	}
	CSN=1;
}
//读RF905配置寄存器
void read_RF905_REG(unsigned int *p)
{
	unsigned char i;
	CSN=0;
	spi_write(RC);
	for(i=0;i<10;i++)
	{
		*p=spi_read();
		p++;
	}
	CSN=1;
}

void set_Tx_modle(void)
{
	TX_EN=1;
	TRX_CE=1;
	delay(1);
	TRX_CE=0;
}

void set_Rx_modle(void)
{
	TRX_CE=1;
	TX_EN=0;
}

void set_standby_modle(void)
{
	TRX_CE=0;
}


//初始化nRF905
void init_RF905(void)
{
	CSN=1;			// SPI 	禁止
	SCK=0;			// SPI 时钟信号初始化为低电平
	DR=1;			// 初始化 DR
	AM=1;			// 初始化 AM
	CD=1;			// 初始化 CD
	PWR_UP=1;			// nRF905 上电 
	TRX_CE=0;		// 设置 nRF905 为 standby 模式
	TX_EN=0;			// 设置 radio 为 Rx 模式
	delay_ms(5);
	set_RF905_REG();
	set_Tx_address();
}


void Tx_packet(void)
{
	unsigned char i;
	CSN=0;
	spi_write(WTP);
	spi_write(buf_length);
	for(i=0;i<31;i++)
	{
		spi_write(buf[i]);
	}
	CSN=1;
}

void Rx_packet(void)
{
	unsigned char i;
	CSN=0;
	spi_write(RRP);
	buf_length=spi_read();
	for(i=0;i<31;i++)
	{
		buf[i]=spi_read();
	}
	CSN=1;
}


⌨️ 快捷键说明

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