在论坛各位大大的指导、鼓励下、我昨天调通了nrf24l01模块,现在可以实现一对一无线通讯、代码是参考创芯的调试代码写的、接下来几天看看能不能调通多发一收。
录了一小段视屏、连接地址:
一对一的代码如下、不足之处,麻烦指正!
头文件代码:
#ifndef __NRF24L01_H__ #define __NRF24L01_H__ #include #define uint unsigned int #define uchar unsigned char //****************************************IO端口定义*************************************** //****************************************NRF24L01端口定义*0203************************************** //sbit MISO = P3^5; //sbit MOSI = P3^3; //sbit SCK = P3^6; //sbit CE = P3^7; //sbit CSN = P3^4; //sbit IRQ = P3^2; //****************************************NRF24L01端口定义*0101************************************** //sbit MISO = P3^4; //sbit MOSI = P3^2; //sbit SCK = P3^5; //sbit CE = P3^0; //sbit CSN = P3^1; //sbit IRQ = P3^3; //****************************************NRF24L01 A端口定义*************************************** sbit MISO = P1^6; sbit MOSI = P1^5; sbit SCK = P1^7; sbit CE = P3^5; sbit CSN = P3^4; sbit IRQ = P3^3; //****************************************NRF24L01 B端口定义*************************************** // sbit MISO = P3^7; // sbit MOSI = P3^6; // sbit SCK = P2^1; // sbit CE = P1^4; // sbit CSN = P2^0; // sbit IRQ = P3^2; #define RX_DR (sta & 0x40) #define TX_DS (sta & 0x20) #define MAX_RT (sta & 0x10) #define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH 5 // 5 uints RX address width #define TX_PLOAD_WIDTH 20 // 20 uints TX payload #define RX_PLOAD_WIDTH 20 // 20 uints TX payload //***************************************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 // 保留 //*************************************SPI(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 // 接收频道0接收数据长度 #define RX_PW_P2 0x13 // 接收频道0接收数据长度 #define RX_PW_P3 0x14 // 接收频道0接收数据长度 #define RX_PW_P4 0x15 // 接收频道0接收数据长度 #define RX_PW_P5 0x16 // 接收频道0接收数据长度 #define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置 void Delay(unsigned int s); void delayms(unsigned int count); void init_NRF24L01(void); uchar SPI_RW(uchar byte); uchar SPI_Read(uchar reg); uchar SPI_RW_Reg(uchar reg, uchar value); uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar num); uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar num); void SetRX_Mode(void); unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); void nRF24L01_TxPacket(unsigned char * tx_buf); uchar CheckACK(void); #endif
驱动文件代码:
#include "NRF24L01_drv.h"
uchar TX_ADDRESS[TX_ADR_WIDTH]= {0x12,0x34,0x56,0x78,0x90}; //本地地址
uchar RX_ADDRESS[RX_ADR_WIDTH]= {0x12,0x34,0x56,0x78,0x90}; //接收地址
uchar sta; //状态标志
/**********************************************
功能:
延时
输入参数:
s: 延时时间
输出参数:
无
返回值:
**********************************************/
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i
发射部分代码:
#include
#include
#include "NRF24L01_drv.h"
uchar gSendNum=0;
void main(void)
{
unsigned char TxBuf[20]={0};
init_NRF24L01();
Delay(6000);
while(1)
{
TxBuf[1] = gSendNum;
nRF24L01_TxPacket(TxBuf); // 模块发数据
delayms(1000);
gSendNum++;
}
}
接收部分代码:
#include
#include
#include "NRF24L01_drv.h"
#include"74hc595.h"
uchar gRecNum;
//************************************主函数************************************************************
void main(void)
{
unsigned char RxBuf[20]={0};
init_NRF24L01() ;
Delay(6000);
while(1)
{
SetRX_Mode(); // 模块设置为接收模式
if(nRF24L01_RxPacket(RxBuf) == 1)
{
gRecNum = RxBuf[1];
NumtoChar(gRecNum,HideDpoint,1);
}
}
}
最近都是在考试、好久没更新主题帖了、没有做到当初申请协议里面每周至少更新三次的要求、实在是不好意思、希望各位版主谅解哈哈。
前一段时间都在调nrf24无线模块、调了一周终于把一对一调通了、接着就继续调多发一收、然而这个模块只有6个通道、利用通道来分辨数据最多只能做到6发一收,而且不易调通,参考论坛上大神的思路、只利用通道0来接收、然后在有效数据开头加上8位数据来分辨,这样做多发一收就比较简单。改了一改代码、主要的代码还是在我们51diy的代码上修改过来的。
#include <stc89.h>
#include <intrins.h>
#include "NRF24L01_drv.h"
unsigned char TxBuf[20]={0};
uchar gSendNum=0;
uchar gRecNum;
sbit key1=P2^0;
sbit key2=P2^1;
void timer_init(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void time0(void) interrupt 1
{
uchar times;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
times++;
if(200 == times)
{
times = 0;
key1=1;key2=1;
TxBuf[0]=0xe1; //TxBuf[0]用于分辨数据,
if(key1&key2)
{
delayms(1000);
if(key1&key2)
TxBuf[1]=1;
else
TxBuf[1]=0;
}
else
TxBuf[1]=0;
}
}
//***********主函数*****************************
void main(void)
{ timer_init();
init_NRF24L01();
Delay(6000);
while(1)
{
nRF24L01_TxPacket(TxBuf); // 模块发数据
delayms(69009);
CheckACK();
}
}
void Outside_Int1(void) interrupt 0 //利用中断来收取、分辨数据
{
uchar i;
nRF24L01_RxPacket(RxBuf);
tempadd=RxBuf[0];
switch(tempadd)
{
case 0xed: tp=RxBuf[2]; ph=RxBuf[1];break;
case 0xe1: if(RxBuf[1]) water|=0x01; else water&=0xfe; break;
case 0xe2: if(RxBuf[1]) water|=0x02; else water&=0xfd; break;
case 0xe3: if(RxBuf[1]) water|=0x04; else water&=0xfb; break;
case 0xe4: if(RxBuf[1]) water|=0x08; else water&=0xf7; break;
case 0xe5: if(RxBuf[1]) water|=0x10; else water&=0xef; break;
case 0xe6: if(RxBuf[1]) water|=0x20; else water&=0xdf; break;
case 0xe7: if(RxBuf[1]) water|=0x40; else water&=0xbf; break;
case 0xe8: if(RxBuf[1]) water|=0x80; else water&=0x7f; break;
default :break;
后来想了一想、用这种方法来收取、分辨数据有可能会有发生错误的可能性、可以通过增加校验来减小发生错误的几率。
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |
我要赚赏金
