#include
#include
typedef unsigned int uint;
typedef unsigned char uchar;
#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节
#define RX_ADDR_WITDH 5//接纳地址宽度设置为5个字节
#define TX_DATA_WITDH 8//
#define RX_DATA_WITDH 8
#define R_REGISTER0x00// 读存放器
#define W_REGISTER0x20// 写存放器
#define R_RX_PLOAD0x61// 读RX FIFO有用数据,1-32字节,当读数据完结后,数据被铲除,应用于接纳形式
#define W_TX_PLOAD0xA0// 写TX FIFO有用数据,1-32字节,写操作从字节0开端,应用于发射形式
#define FLUSH_TX0xE1// 铲除TX FIFO存放器,应用于发射形式
#define FLUSH_RX0xE2// 铲除RX FIFO存放器,应用于接纳形式
#define REUSE_TX_PL 0xE3// 从头使用上一包有用数据,当CE为高过程中,数据包被不断的从头发射
#define NOP0xFF// 空操作,能够用来读状况存放器
#define CONFIG0x00// 装备存放器
#define EN_AA0x01// “主动应对”功用存放
#define EN_RX_ADDR0x02// 接纳通道使能存放器
#define SETUP_AW0x03// 地址宽度设置存放器
#define SETUP_RETR0x04// 主动重发设置存放器
#define RF_CH0x05// 射频通道频率设置存放器
#define RF_SETUP0x06// 射频设置存放器
#define STATUS0x07// 状况存放器
#define OBSERVE_TX0x08// 发送检测存放器
#define CD0x09// 载波检测存放器
#define RX_ADDR_P00x0A// 数据通道0接纳地址存放器
#define RX_ADDR_P10x0B// 数据通道1接纳地址存放器
#define RX_ADDR_P20x0C// 数据通道2接纳地址存放器
#define RX_ADDR_P30x0D// 数据通道3接纳地址存放器
#define RX_ADDR_P40x0E// 数据通道4接纳地址存放器
#define RX_ADDR_P50x0F// 数据通道5接纳地址存放器
#define TX_ADDR0x10// 发送地址存放器
#define RX_PW_P00x11// 数据通道0有用数据宽度设置存放器
#define RX_PW_P10x12// 数据通道1有用数据宽度设置存放器
#define RX_PW_P20x13// 数据通道2有用数据宽度设置存放器
#define RX_PW_P30x14// 数据通道3有用数据宽度设置存放器
#define RX_PW_P40x15// 数据通道4有用数据宽度设置存放器
#define RX_PW_P50x16// 数据通道5有用数据宽度设置存放器
#define FIFO_STATUS 0x17// FIFO状况存放器
//*********************************************************************************
uchar sta;// 状况变量
#define RX_DR(sta & 0x40)// 接纳成功中止标志
#define TX_DS(sta & 0x20)// 发射成功中止标志
#define MAX_RT (sta & 0x10)// 重发溢出中止标志
sbit CE=P1^5;
sbit IRQ=P1^0;
sbit CSN=P1^4;
sbit MOSI=P1^2;
sbit MISO=P1^1;
sbit SCK=P1^3;
sbit LED=P0^0;
uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};
uchar RX_Buffer[RX_DATA_WITDH];
void _delay_us(uint x)
{
uint i,j;
for (j=0;jfor (i=0;i<12;i++);
}
void _delay_ms(uint x)
{
uint i,j;
for (j=0;jfor (i=0;i<120;i++);
}
//nRF24L01初始化
void nRF24L01_Init(void)
{
CE=0;//待机形式Ⅰ
CSN=1;
SCK=0;
IRQ=1;
}
//SPI时序函数
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0;i<8;i++)//一字节8位循环8次写入
{
if(byte&0x80)//假如数据最高位是1
MOSI=1;//向NRF24L01写1
else //不然写0
MOSI=0;
byte<<=1;//低一位移到最高位
SCK=1;//SCK拉高,写入一位数据,一起读取一位数据
if(MISO)
byte|=0x01;
SCK=0;//SCK拉低
}
return byte;//回来读取一字节
}
//SPI写存放器一字节函数
//reg:存放器地址
//value:一字节(值)
uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status;//回来状况
CSN=0;//SPI片选
status=SPI_RW(reg);//写入存放器地址,一起读取状况
SPI_RW(value);//写入一字节
CSN=1;//
return status;//回来状况
}
//SPI读一字节
uchar SPI_R_byte(uchar reg)
{
uchar reg_value;
CSN=0;//SPI片选
SPI_RW(reg);//写入地址
reg_value=SPI_RW(0);//读取存放器的值
CSN=1;
return reg_value;//回来读取的值
}
//SPI读取RXFIFO存放器数据
//reg:存放器地址
//Dat_Buffer:用来存读取的数据
//DLen:数据长度
uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar status,i;
CSN=0;//SPI片选
status=SPI_RW(reg);//写入存放器地址,一起状况
for(i=0;i{
Dat_Buffer[i]=SPI_RW(0);//存储数据
}
CSN=1;
return status;
}
//SPI向TXFIFO存放器写入数据
//reg:写入存放器地址
//TX_Dat_Buffer:存放需求发送的数据
//Dlen:数据长度
uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar status,i;
CSN=0;//SPI片选,发动时序
status=SPI_RW(reg);
for(i=0;i{
SPI_RW(TX_Dat_Buffer[i]);//发送数据
}
CSN=1;
return status;
}
//设置发送形式
void nRF24L01_Set_TX_Mode(uchar *TX_Data)
{
CE=0;//待机(写存放器之前一定要进入待机形式或掉电形式)
SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);//写存放器指令+接纳节点地址+地址宽度
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);//为了接纳设备应对信号,接纳通道0地址与发送地址相同
SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);//写有用数据地址+有用数据+有用数据宽度
SPI_W_Reg(W_REGISTER+EN_AA,0x01);//接纳通道0主动应对
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);//使能接纳通道0
SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);//主动重发延时250US+86US,重发10次
SPI_W_Reg(W_REGISTER+RF_CH,0);//2.4GHZ
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//1Mbps速率,发射功率:0DBM,低噪声放大器增益
SPI_W_Reg(W_REGISTER+CONFIG,0x0e);//发送形式,上电,16位CRC校验,CRC使能
CE=1;//发动发射
_delay_ms(5);//CE高电平持续时间最少10US以上
}
//检测应对信号
uchar Check_Ack(void)
{
sta=SPI_R_byte(R_REGISTER+STATUS);//读取存放状况
if(TX_DS||MAX_RT)//假如TX_DS或MAX_RT为1,则铲除中止和铲除TX_FIFO存放器的值
{
SPI_W_Reg(W_REGISTER+STATUS,0xff);
CSN=0;
SPI_RW(FLUSH_TX);//假如没有这一句只能发一次数据,我们要注意
CSN=1;
return 0;
}
else
return 1;
}
void main(void)
{
uchar i;
P0=0xff;//初始化IO口
P1=0xff;
P2=0xff;
P3=0xff;
_delay_us(100);
nRF24L01_Init();//NRF24L01初始化
while(1)
{
for(i=0;i{
nRF24L01_Set_TX_Mode(&TX_Buffer[i]);//发送数据
while(Check_Ack());//等候发送完结
LED=~LED;
}
}
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/257777.html