1、这东西实测大概也就20米,可能功率放大点会更远点,可是估计差不了多少。
#include <MC9S12XS128.h>
#include "nRF_define.h"
#include "nRF_api.h"
#define uchar unsigned char
#define uint unsigned int
byte const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01}; //本地地址
byte SPI_Read(byte reg);
byte SPI_RW_Reg(byte reg, byte value);
byte SPI_Read_Buf(byte reg, byte *pBuf, byte uchars);
byte SPI_Write_Buf(byte reg, byte *pBuf, byte uchars);
//================ 延时 ======================//
void Delay(uchar t)
{
uchar i;
for(i=0;i<t;i++);
//t = 1 约延时0.5us
//t = 110 约延时10us
//t = 160 约延时15us
}
//================================================== SPI基本函数 =========================================================//
/***************************************************************************************************
函数:byte SPI_RW(byte ch)
功能:NRF24L01的SPI写时序
***************************************************************************************************/
byte SPI_RW(byte ch)
{
byte bit_ctr;
for(bit_ctr = 0; bit_ctr < 8; bit_ctr++) // output 8-bit
{
if(ch & 0x80) // output 'byte', MSB to NRFMOSI
NRFMOSI = 1;
else
NRFMOSI = 0;
ch = (ch << 1); // shift next bit into MSB..
NRFSCK = 1; // Set NRFSCK high..
ch |= NRFMISO; // capture current NRFMISO bit
NRFSCK = 0; // ..then set NRFSCK low again
}
return(ch); // return read byte
}
/****************************************************************************************************
*函数:byte SPI_Read(byte reg)
*功能:NRF24L01的SPI时序
****************************************************************************************************/
byte SPI_Read(byte reg)
{
byte reg_val;
NRFCSN = 0; // NRFCSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
NRFCSN = 1; // NRFCSN high, terminate SPI communication
return(reg_val); // return register value
}
/***************************************************************************************************
*功能:NRF24L01读写寄存器函数
***************************************************************************************************/
byte SPI_RW_Reg(byte reg, byte value)
{
byte status;
NRFCSN = 0; // NRFCSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
NRFCSN = 1; // NRFCSN high again
return(status); // return nRF24L01 status byte
}
/****************************************************************************************************
*函数:byte SPI_Read_Buf(byte reg, byte *pBuf, byte len)
*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,len:读出数据的个数
****************************************************************************************************/
byte SPI_Read_Buf(byte reg, byte *pBuf, byte len)
{
byte status, cnt;
NRFCSN = 0; // Set NRFCSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status byte
for(cnt = 0; cnt < len; cnt++)
pBuf[cnt] = SPI_RW(0);
NRFCSN = 1;
return(status); // return nRF24L01 status byte
}
/*********************************************************************************************************
*函数:byte SPI_Write_Buf(byte reg, byte *pBuf, byte len)
*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,len:写入数据的个数
*********************************************************************************************************/
byte SPI_Write_Buf(byte reg, byte *pBuf, byte len)
{
byte status, cnt;
NRFCSN = 0; //SPI使能
status = SPI_RW(reg);
Delay_us(160);
for(cnt = 0; cnt < len; cnt++)
SPI_RW(*pBuf++);
NRFCSN = 1; //关闭SPI
return(status);
}
//======================================================================================================================//
void nRF_ClrFIFO(uchar x)
{
NRFCSN = 0;
SPI_RW(x);
NRFCSN = 1;
}
/****************************************************************************************************
*函数:void SetRX_Mode(void)
*功能:数据接收配置
****************************************************************************************************/
void SetRX_Mode(void)
{
NRFCE = 0;
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F); // CRC使能,16位CRC校验,上电,接收模式
NRFCE = 1; // 拉高CE启动接收设备
}
/**********************************************************************************
*函数: nRF_RxPacket()
*说明: 从nRF的接收缓冲中取出RX_PLOAD_WIDTH个数据放在以rxbuf开始的连续地址中
**********************************************************************************/
uchar nRF_RxPacket (uchar *rxbuf)
{
uchar revale = 0;
uchar status;
status = SPI_Read(STATUS); //读取状态寄存器来判断数据接收状况
if(RX_DR) //判断是否接收到数据
{
SPI_Read_Buf(RD_RX_PLOAD, rxbuf, RX_PLOAD_WIDTH); //read receive payload from RX_FIFO buffer
revale = 1;
}
SPI_RW_Reg(WRITE_REG + STATUS,status);
return revale;
}
/****************************************************************************************************
*函数:void SetTX_Mode(void)
*功能:数据发送配置
****************************************************************************************************/
void SetTX_Mode(void)
{
NRFCE = 0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 AUTO ACK
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 PIPE0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0A); // 自动重发延时等待250us+86us,自动重发10次
SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率2Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E); // CRC使能,16位CRC校验,上电
NRFCE = 1;
}
/************************************************************************************
*函数: nRF_TxPacket()
*说明:发送以txbuf开始的连续TX_PLOAD_WIDTH个字节的数据
************************************************************************************/
void nRF_TxPacket (uchar *txbuf)
{
SPI_Write_Buf(WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH); // Writes data to TX payload
while(NRFIRQ);
SPI_RW_Reg(WRITE_REG + STATUS, 0xFF);
}
void main(void)
{
PLL_Init();
IO_Init();
//SetTX_Mode(); //设置发送模式
SetRX_Mode(); //设置接收模式
EnableInterrupts;
for(;;)
{
//nRF_TxPacket(TxBuf); //发送调用
if(nRF_RxPacket(RxBuf) == TRUE) //接收调用
{
LCD_CLS();
LCD_Print(0,2,RxBuf);
}
}
}