OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...

查看: 783|回复: 3

Minifly遥控器NRF24L01通信问题

[复制链接]

  离线 

1

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-10-13
在线时间
2 小时
发表于 2018-4-10 21:10:13 | 显示全部楼层 |阅读模式
10金钱
原子的四轴飞行器很棒!最近买了一个玩的很开心。想用原子的遥控器控制自己DIY的小车。遇到了问题。首先为了熟悉一下NRF24L01,使用MiniSTM32光盘里的NRF24L01源码,淘宝上1100米NRF24L01+PA+天线模块,使用两个STM32是可以通信的。
进一步我想用Minifly遥控器控制一个自己设计的小车。
用MiniSTM32写了NRF24L01,使用的是遥控器程序中的24L01库(为了和遥控器配对,更容易些),使用的是淘宝上1100米NRF24L01+PA+天线模块,但是无法和遥控器连接,在此想请教各位大神:
1:遥控器,NRF24L01+ 经过巴伦芯片 经过RFX2401C 经过2450BP14D0100 发送, 接收方是否还必须 经过2450BP14D0100 经过RFX2401C 经过巴伦芯片 才能接收,直接NRF24L01+模块是否可以接收呢???
2:Minifly遥控器的地址为什么那么复杂呢?看了半天没看懂,真心请教各位大神?
        u32 addressHigh = ((uint64_t)RADIO_ADDRESS >> 32);
        u32 addressLow = (RADIO_ADDRESS & 0xFFFFFFFFULL);
        uint64_t addr = (uint64_t)addressHigh<<32 | addressLow;


3:使用的是遥控器程序中的24L01库,是否设置了地址,通道,速率就可以了呢?



希望大神能指点一二,不胜感激!!!
QQ图片20180410210649.png

最佳答案

查看完整内容[请看2#楼]

回答: 1.NRF24L01模块也是可以和minifly遥控器通讯的。 2.nrf24l01的通讯地址通常是5个字节,使用u64类型,实际有用字节数为低5字节。 3.看你的代码配置上没有问题,但是在主函数中不是使用nrf_rxPacket(u8 *rx_buf)调用接收。应该使用下图函数来接收数据包。当接收到数据包后,你还需要发送回一个数据包给遥控器,不然遥控器等不到应答包就不会再发送数据下来了。(具体原理你看一下遥控器开发指南中NRF24L01+和PA接口一章) ...
回复

使用道具 举报

  离线 

10

主题

398

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
1269
金钱
1269
注册时间
2015-2-7
在线时间
271 小时
发表于 2018-4-10 21:10:14 | 显示全部楼层
本帖最后由 电子之旅 于 2018-4-11 09:56 编辑

回答:
1.NRF24L01模块也是可以和minifly遥控器通讯的。
2.nrf24l01的通讯地址通常是5个字节,使用u64类型,实际有用字节数为低5字节。
3.看你的代码配置上没有问题,但是在主函数中不是使用nrf_rxPacket(u8 *rx_buf)调用接收。应该使用下图函数来接收数据包。当接收到数据包后,你还需要发送回一个数据包给遥控器,不然遥控器等不到应答包就不会再发送数据下来了。(具体原理你看一下遥控器开发指南中NRF24L01+和PA接口一章)

[AppleScript] 纯文本查看 复制代码
/*发送和接收队列信息个数*/
#define  RXQ_LEN  10

atkp_t rxPackets[RXQ_LEN];
u8 rxq_head = 0;
u8 rxq_tail = 0;

atkp_t tx_p;
bool isRev = false;
u32 failRxcountTime = 0;
u32 failStatus;

/*nrf外部中断回调函数*/
static void nrf_interruptCallback(void)
{
        isRev = true;
        LED0(1);LED1(1);
        failRxcountTime = getSysTick();
        failStatus = failRxcountTime;
}

/*无线配置初始化(地址、通道、速率)*/
static void radioInit(void)
{
        uint64_t addr = (uint64_t)configParam.radio.addressHigh<<32 | configParam.radio.addressLow;
        
        if(nrf_check() == SUCCESS)
        {
                nrf_setIterruptCallback(nrf_interruptCallback);
                nrfInit(PRX_MODE);
        }
        else
        {
                while(1)
                {
                        LED0(0);LED1(0);
//                        delay_ms(100);
                        LED0(1);LED1(1);
//                        delay_ms(100);
                }
        }
        nrf_setAddress(addr);
        nrf_setChannel(configParam.radio.channel);
        nrf_setDataRate(configParam.radio.dataRate);
}

/*无线连接初始化*/
void radiolinkInit(void)
{
        radioInit();
        tx_p.msgID = DOWN_RADIO;
        tx_p.dataLen = 1;
        tx_p.data[0] = D_RADIO_HEARTBEAT;
        nrf_txPacket_AP((u8*)&tx_p, 32);//装载应答包,当接收成功后,nrf会自动发送这个应答包
}

/*无线发送atkpPacket*/
bool radiolinkSendPacket(const atkp_t *p)
{

}

/*无线接收atkpPacket*/
bool radiolinkReceivePacket(atkp_t *p)
{
        if(rxq_head != rxq_tail)
        {
                memcpy(p, &rxPackets[rxq_tail], sizeof(rxPackets[rxq_tail]));
                rxq_tail = (rxq_tail+1)%RXQ_LEN;
                return true;
        }
        return false;
}

/*无线连接任务*/
void radiolinkTask(void)
{
        u8 ack_len;        
        if(isRev == true)
        {
                isRev = false;
                nrf_txPacket_AP((u8*)&tx_p, 32);
                u8 status = nrf_checkEventandRxPacket((u8*)&rxPackets[rxq_head], &ack_len);
                LED0(1);LED1(0);
                if(status == RX_DR)//发送成功
                {
                        if((rxq_head+1)%RXQ_LEN != rxq_tail)
                        {
                                rxq_head = (rxq_head+1)%RXQ_LEN;
                        }
                }
        }
        if(getSysTick() >= failStatus+500)/*500ms没收到中断说明通讯失败*/
        {
               
        }
        
        if(getSysTick()>=failRxcountTime+10)/*10ms没收到中断说明通讯失败,亮红灯*/
        {
                failRxcountTime = getSysTick();
                LED0(0);LED1(1);
        }
        

}
QQ截图20180411091735.png
回复

使用道具 举报

  离线 

1

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-10-13
在线时间
2 小时
 楼主| 发表于 2018-4-12 09:25:59 | 显示全部楼层
电子之旅 发表于 2018-4-10 21:10
回答:
1.NRF24L01模块也是可以和minifly遥控器通讯的。
2.nrf24l01的通讯地址通常是5个字节,使用u64类 ...

感谢感谢,我尝试一下!!!
回复

使用道具 举报

  离线 

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-6-2
在线时间
10 小时
发表于 2018-6-7 16:07:13 | 显示全部楼层
你好 请问你的遥控器成功了吗 本人最近有学期项目 也有这个想法 但不知道怎么做
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

必看:"原子哥”力荐上一条 /1 下一条

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-8-19 19:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */