发送部分
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
#define uint unsigned int
//*****************************NRF24L01寄存器指令****************************
#define READ_REG 0x00 //读寄存器指令
#define WRITE_REG 0x20 //写寄存器指令
#define RD_RX_PLOAD 0x61 //读取接收数据指令
#define WR_TX_PLOAD 0xA0 //写待发数据指令
#define FLUSH_TX 0xE1 //清除发送FIFO寄存器
#define FLUSH_RX 0xE2 //清除接收FIFO寄存器
#define REUSE_TX_PL 0xE3 //定义重复装载数据指令
#define NOP 0xFF //保留
//*****************************NRF24L01寄存器地址****************************
#define CONFIG 0x00 //配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01 //自动应答功能设置
#define EN_RXADDR 0x02 //可用信道设置
#define SETUP_AW 0x03 //收发地址宽度设置
#define SETUP_RETR 0x04 //自动重发功能设置
#define RF_CH 0x05 //工作频率设置
#define RF_SETUP 0x06 //发射速率,功耗功能设置
#define STATUS 0x07 //状态寄存器
#define OBSERVE_TX 0x08 //发送监测功能
#define CD 0x09 //地址检测
#define RX_ADDR_P0 0x0A //频道0接收数据地址
#define RX_ADDR_P1 0x0B //频道1接收数据地址
#define RX_ADDR_P2 0x0C //频道2接收数据地址
#define RX_ADDR_P3 0x0D //频道3接收数据地址
#define RX_ADDR_P4 0x0E //频道4接收数据地址
#define RX_ADDR_P5 0x0F //频道5接收数据地址
#define TX_ADDR 0x10 //发送地址寄存器
#define RX_PW_P0 0x11 //接收频道0接收数据长度
#define RX_PW_P1 0x12 //接收频道1接收数据长度
#define RX_PW_P2 0x13 //接收频道2接收数据长度
#define RX_PW_P3 0x14 //接收频道3接收数据长度
#define RX_PW_P4 0x15 //接收频道4接收数据长度
#define RX_PW_P5 0x16 //接收频道5接收数据长度
#define FIFO_STATUS 0x17 //FIFO栈入栈出状态寄存器设置
//***********************NRF24L01/NRF24L01+ IO端口定义***********************
sbit MISO = P2^4;
sbit MOSI = P2^2;
sbit SCK = P2^5;
sbit CSN = P2^1;
sbit CE = P2^0;
sbit IRQ = P2^3;
//*************************NRF24L01收发数据长度设置************************
#define tr_con 2 //设置每次发送接收数据字节数(1-32)
//***************************收发数据缓冲区********************************
uchar txbuf[tr_con];
uchar rxbuf[tr_con];
//**************************NRF24L01接收地址设置***************************
//数据通道0有40bit可配置地址
//数据通道1-5地址为:32bit共用地址+8bit各自地址(最低字节)
//数据通道1-5各自地址必须不同
uchar code r_add0[]={0x05,0x06,0x07,0x08,0x09}; //实际地址:09-08-07-06-05
uchar code r_add1[]={0x15,0x06,0x07,0x08,0x09}; //实际地址:19-18-17-16-15
uchar code r_add2[]={0x25}; //实际地址:19-18-17-16-25
uchar code r_add3[]={0x35}; //实际地址:19-18-17-16-35
uchar code r_add4[]={0x45}; //实际地址:19-18-17-16-45
uchar code r_add5[]={0x55}; //实际地址:19-18-17-16-55
//**************************串口
通信相关变量*******************************
uchar flag2;
uchar i=0;
//*************************子函数申明**************************************
uchar ADC0832(uint channel);
void delay1ms(unsigned int j);
void delay_us(uchar n);
void init_nrf24l01(void);
void set_nrf24l01_rx_mode(void);
uchar nrf24l01_rdat(uchar *r_buffer);
void nrf24l01_tdat(uchar *t_buffer);
void senddata_uart(uchar dc);
uchar spi_rw(uchar ddt);
uchar spi_read_reg(uchar reg);
void spi_write_reg(uchar reg,uchar value);
void spi_read_buf(uchar reg,uchar *pbuf,uchar con);
void spi_write_buf(uchar reg,uchar *pbuf,uchar con);
//*********************************主函数************************************
void main(void)
{
P2=0xff;
delay1ms(60);
init_nrf24l01(); //初始化NRF24L01/NRF24L01+
delay1ms(600);
delay1ms(100);
while(1)
{
//当收到串口数据后发送
txbuf[0]=0x0f;
txbuf[1]=0xf0;
nrf24l01_tdat(txbuf); //发送数据
delay1ms(600);
}
}
//***************************************************************************
//nrf24l01初始化
//***************************************************************************
void init_nrf24l01(void)
{
CSN=1; //Spi disable
SCK=0; //Spi clock line init low
CE=0; //StandBy I模式
spi_write_buf(WRITE_REG+RX_ADDR_P0,r_add0,sizeof(r_add0)); //设置数据通道0接收地址
spi_write_reg(WRITE_REG+RX_PW_P0,tr_con); //设置接收数据通道0宽度(1-32byte)
spi_write_reg(WRITE_REG+EN_AA,0x00); //通道0,1,2,3,4,5自动ACK应答不允许
spi_write_reg(WRITE_REG+EN_RXADDR,0x01); //允许接收通道0,1,2,3,4,5地址
spi_write_reg(WRITE_REG+SETUP_AW,0x03); //5字节宽地址
spi_write_reg(WRITE_REG+SETUP_RETR,0x00); //禁止自动重发
spi_write_reg(WRITE_REG+RF_CH,0); //设置信道工作为2.4GHZ,收发必须一致
spi_write_reg(WRITE_REG+RF_SETUP,0x07); //设置发射速率为1MHZ,发射功率为最大值0dB
//spi_write_reg(,0x01); //允许接收通道0,1,2,3,4,5地址
spi_write_buf(WRITE_REG+RX_ADDR_P0,r_add0,5);//写通道0接收地址
spi_write_buf(WRITE_REG+TX_ADDR,r_add1,5);//写通道0接收地址
spi_write_reg(WRITE_REG+RX_PW_P0,0x01); //禁止自动重发
}
//***************************************************************************
//读取tx_buf数据通过nrf24l01发送
//***************************************************************************
void nrf24l01_tdat(uchar *t_buffer)
{
uchar sta;
uchar t_end=0;
CE=0; //StandBy I模式
// spi_write_buf(WRITE_REG+TX_ADDR,r_add0,sizeof(r_add0)); //设置本机发送地址
spi_write_buf(WR_TX_PLOAD,t_buffer,tr_con); //装载数据
// spi_write_reg(WRITE_REG+CONFIG,0x0e); //IRQ收发完成中断响应,16位CRC,主发送
spi_write_reg(WRITE_REG+STATUS,0xff); //写1清除中断标志
CE=1; //置高CE,激发数据发送
delay_us(10); //保持10us秒以上
do
{
sta=spi_read_reg(STATUS); //读取状态寄存其来判断数据接收状况
if((sta&0x20)!=0) //发送完毕中断
{
spi_write_reg(WRITE_REG+STATUS,0xff); //写1清除中断标志
CSN=0;
spi_rw(FLUSH_TX); //清空FIFO
CSN=1;
t_end=1;
}
}while(t_end==0); //等待发送完毕
}
//*************************延时 n*1ms********************
void delay1ms(unsigned int j)
{
unsigned int i;
for (;j>0;j--)
{
for (i=0;i<124;i++)
{;}
}
}
//***************************************************************************
//短延时函数
//***************************************************************************
void delay_us(uchar n)
{
for (;n>0;n--)
_nop_();
}
uchar spi_rw(uchar ddt)
{
uchar c;
for(c=8;c!=0;c--) //output 8bit
{
MOSI=(ddt&0x80); //output'ddt', MSB to MOSI
ddt=(ddt<<1); //shift next bit into MSB
SCK=1; //Set SCK high
ddt|=MISO; //capture current MISO bit
SCK=0; //then set SCK low again
}
return(ddt); //return read ddt
}
//***************************************************************************
//写NRF24L01寄存器函数
//***************************************************************************
void spi_write_reg(uchar reg,uchar value)
{
CSN=0; //CSN low, ini
tialize SPI communication
spi_rw(reg); //select register
spi_rw(value); //and write value to it
CSN=1; //CSN high, terminate SPI communication
}
//***************************************************************************
//连续写数据,reg:寄存器地址,pbuf:待写入数据地址,con:写入数据的个数
//***************************************************************************
void spi_write_buf(uchar reg,uchar *pbuf,uchar con)
{
uchar c;
CSN=0; //CSN low, initialize SPI communication
spi_rw(reg); //select register
for(c=0;c<con;c++)
{
spi_rw(*pbuf++); //and write value to it
}
CSN=1; //CSN high, terminate SPI communication
}
//***************************************************************************
//读NRF24L01寄存器函数
//***************************************************************************
uchar spi_read_reg(uchar reg)
{
uchar reg_val;
CSN=0; //CSN low, initialize SPI communication
spi_rw(reg); //Select register to read from
reg_val=spi_rw(0); //then read registervalue
CSN=1; //CSN high, terminate SPI communication
return(reg_val); //return register value
}
//***************************************************************************
//连续读数据,reg:寄存器地址,pbuf:待读出数据地址,con:读出数据的个数
//***************************************************************************
void spi_read_buf(uchar reg,uchar *pbuf,uchar con)
{
uchar c;
CSN=0; //CSN low, initialize SPI communication
spi_rw(reg); //Select register to read from
for(c=0;c<con;c++)
{
pbuf[c]=spi_rw(0); //发送哑数据,读取spi总线值
}
CSN=1; //CSN high, terminate SPI communication
}
接受部分
#include <reg51.h>#include <intrins.h>typedef unsigned char uchar;
//*****************************NRF24L01寄存器指令****************************#define READ_REG 0x00 //读寄存器指令#define WRITE_REG 0x20 //写寄存器指令#define RD_RX_PLOAD 0x61 //读取接收数据指令#define WR_TX_PLOAD 0xA0 //写待发数据指令#define FLUSH_TX 0xE1 //清除发送FIFO寄存器#define FLUSH_RX 0xE2 //清除接收FIFO寄存器#define REUSE_TX_PL 0xE3 //定义重复装载数据指令#define NOP 0xFF //保留//*****************************NRF24L01寄存器地址****************************#define CONFIG 0x00 //配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 //自动应答功能设置#define EN_RXADDR 0x02 //可用信道设置#define SETUP_AW 0x03 //收发地址宽度设置#define SETUP_RETR 0x04 //自动重发功能设置#define RF_CH 0x05 //工作频率设置#define RF_SETUP 0x06 //发射速率,功耗功能设置#define STATUS 0x07 //状态寄存器#define OBSERVE_TX 0x08 //发送监测功能#define CD 0x09 //地址检测#define RX_ADDR_P0 0x0A //频道0接收数据地址#define RX_ADDR_P1 0x0B //频道1接收数据地址#define RX_ADDR_P2 0x0C //频道2接收数据地址#define RX_ADDR_P3 0x0D //频道3接收数据地址#define RX_ADDR_P4 0x0E //频道4接收数据地址#define RX_ADDR_P5 0x0F //频道5接收数据地址#define TX_ADDR 0x10 //发送地址寄存器#define RX_PW_P0 0x11 //接收频道0接收数据长度#define RX_PW_P1 0x12 //接收频道1接收数据长度#define RX_PW_P2 0x13 //接收频道2接收数据长度#define RX_PW_P3 0x14 //接收频道3接收数据长度#define RX_PW_P4 0x15 //接收频道4接收数据长度#define RX_PW_P5 0x16 //接收频道5接收数据长度#define FIFO_STATUS 0x17 //FIFO栈入栈出状态寄存器设置//***********************NRF24L01/NRF24L01+ IO端口定义***********************sbit MISO = P0^2;sbit MOSI = P0^4;sbit SCK = P0^1;sbit CSN = P0^5;sbit CE = P0^0;sbit IRQ = P0^3;//*************************NRF24L01收发数据长度设置************************#define tr_con 2 //设置每次发送接收数据字节数(1-32)//***************************收发数据缓冲区********************************uchar txbuf[tr_con];uchar rxbuf[tr_con];
//**************************NRF24L01接收地址设置***************************//数据通道0有40bit可配置地址//数据通道1-5地址为:32bit共用地址+8bit各自地址(最低字节)//数据通道1-5各自地址必须不同uchar code r_add0[]={0x05,0x06,0x07,0x08,0x09}; //实际地址:09-08-07-06-05uchar code r_add1[]={0x15,0x06,0x07,0x08,0x09}; //实际地址:19-18-17-16-15uchar code r_add2[]={0x25}; //实际地址:19-18-17-16-25uchar code r_add3[]={0x35}; //实际地址:19-18-17-16-35uchar code r_add4[]={0x45}; //实际地址:19-18-17-16-45uchar code r_add5[]={0x55}; //实际地址:19-18-17-16-55//**************************串口通信相关变量*******************************uchar flag2;uchar i=0;//*************************子函数申明**************************************void delay1ms(unsigned int j);void delay_us(uchar n);void init_nrf24l01(void);void set_nrf24l01_rx_mode(void);uchar nrf24l01_rdat(uchar *r_buffer);void nrf24l01_tdat(uchar *t_buffer);void senddata_uart(uchar dc);uchar spi_rw(uchar ddt);uchar spi_read_reg(uchar reg);void spi_write_reg(uchar reg,uchar value);void spi_read_buf(uchar reg,uchar *pbuf,uchar con);void spi_write_buf(uchar reg,uchar *pbuf,uchar con);//*********************************主函数************************************void main(void){ P0=0xff; delay1ms(60); init_nrf24l01(); //初始化NRF24L01/NRF24L01+
delay1ms(600); delay1ms(100); P1=0; while(1) {
//=========================接收数据===================================== set_nrf24l01_rx_mode(); P0=0xff; if(nrf24l01_rdat(rxbuf)) /*******************用接收到的数据rxbuf[1]调整速度***************/ { P2=rxbuf[0];
} else P1=0x0f; }}
//***************************************************************************//nrf24l01初始化//***************************************************************************void init_nrf24l01(void){ CSN=1; //Spi disable SCK=0; //Spi clock line init low CE=0; //StandBy I模式
spi_write_buf(WRITE_REG+RX_ADDR_P0,r_add0,sizeof(r_add0)); //设置数据通道0接收地址 spi_write_reg(WRITE_REG+RX_PW_P0,tr_con); //设置接收数据通道0宽度(1-32byte)
spi_write_reg(WRITE_REG+EN_AA,0x00); //通道0,1,2,3,4,5自动ACK应答不允许 spi_write_reg(WRITE_REG+EN_RXADDR,0x01); //允许接收通道0,1,2,3,4,5地址 spi_write_reg(WRITE_REG+SETUP_AW,0x03); //5字节宽地址 spi_write_reg(WRITE_REG+SETUP_RETR,0x00); //禁止自动重发 spi_write_reg(WRITE_REG+RF_CH,0); //设置信道工作为2.4GHZ,收发必须一致 spi_write_reg(WRITE_REG+RF_SETUP,0x07); //设置发射速率为1MHZ,发射功率为最大值0dB //spi_write_reg(,0x01); //允许接收通道0,1,2,3,4,5地址 spi_write_buf(WRITE_REG+RX_ADDR_P0,r_add0,5);//写通道0接收地址 spi_write_buf(WRITE_REG+TX_ADDR,r_add1,5);//写通道0接收地址 spi_write_reg(WRITE_REG+RX_PW_P0,0x01); //禁止自动重发}
//***************************************************************************//设置nrf24l01为接收模式//***************************************************************************void set_nrf24l01_rx_mode(void){ CE=0; //StandBy I模式 spi_write_reg(WRITE_REG+CONFIG,0xff); //没有任何中断响应,16位CRC,f主接收e主发送 CE=1; delay_us(130); //保持10us秒以上}
//***************************************************************************//读取nrf24l01接收数据放入r_buffer缓冲区//***************************************************************************uchar nrf24l01_rdat(uchar *r_buffer){ uchar revale=0; uchar sta=0; uchar rx_p;
sta=spi_read_reg(STATUS); //读取状态寄存其来判断数据接收状况 if((sta&0x40)!=0) //判断是否接收到数据 { rx_p=sta&0x0e; //获取通道号 CE=0; //StandBy I模式 spi_read_buf(RD_RX_PLOAD,r_buffer,tr_con);//读取RX_FIFO revale=1; //读取数据完成标志 spi_write_reg(WRITE_REG+STATUS,0xff); //写1清除中断标志 CSN=0; spi_rw(FLUSH_RX); //清空FIFO CSN=1; } return revale;}
//*************************延时 n*1ms********************void delay1ms(unsigned int j){ unsigned int i; for (;j>0;j--) { for (i=0;i<124;i++) {;} }}
//***************************************************************************//短延时函数//***************************************************************************void delay_us(uchar n){ for (;n>0;n--) _nop_();}
uchar spi_rw(uchar ddt){ uchar c; for(c=8;c!=0;c--) //output 8bit { MOSI=(ddt&0x80); //output'ddt', MSB to MOSI ddt=(ddt<<1); //shift next bit into MSB SCK=1; //Set SCK high ddt|=MISO; //capture current MISO bit SCK=0; //then set SCK low again } return(ddt); //return read ddt}
//***************************************************************************//写NRF24L01寄存器函数//***************************************************************************void spi_write_reg(uchar reg,uchar value){ CSN=0; //CSN low, initialize SPI communication spi_rw(reg); //select register spi_rw(value); //and write value to it CSN=1; //CSN high, terminate SPI communication}
//***************************************************************************//连续写数据,reg:寄存器地址,pbuf:待写入数据地址,con:写入数据的个数//***************************************************************************void spi_write_buf(uchar reg,uchar *pbuf,uchar con){ uchar c; CSN=0; //CSN low, initialize SPI communication spi_rw(reg); //select register for(c=0;c<con;c++) { spi_rw(*pbuf++); //and write value to it } CSN=1; //CSN high, terminate SPI communication}
//***************************************************************************//读NRF24L01寄存器函数//***************************************************************************uchar spi_read_reg(uchar reg){ uchar reg_val; CSN=0; //CSN low, initialize SPI communication spi_rw(reg); //Select register to read from reg_val=spi_rw(0); //then read registervalue CSN=1; //CSN high, terminate SPI communication return(reg_val); //return register value}
//***************************************************************************//连续读数据,reg:寄存器地址,pbuf:待读出数据地址,con:读出数据的个数//***************************************************************************void spi_read_buf(uchar reg,uchar *pbuf,uchar con){ uchar c; CSN=0; //CSN low, initialize SPI communication spi_rw(reg); //Select register to read from for(c=0;c<con;c++) { pbuf[c]=spi_rw(0); //发送哑数据,读取spi总线值 } CSN=1; //CSN high, terminate SPI communication}
一周热门 更多>