天线|RF射频
直播中

李萌

7年用户 177经验值
私信 关注
[问答]

Minifly遥控器NRF24L01如何通信?

原子的四轴飞行器很棒!最近买了一个玩的很开心。想用原子的遥控器控制自己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库,是否设置了地址,通道,速率就可以了呢?
希望大神能指点一二,不胜感激!!!

回帖(3)

张强

2020-6-16 16:27:20
回答:
1.NRF24L01模块也是可以和minifly遥控器通讯的。
2.nrf24l01的通讯地址通常是5个字节,使用u64类型,实际有用字节数为低5字节。
3.看你的代码配置上没有问题,但是在主函数中不是使用nrf_rxPacket(u8 *rx_buf)调用接收。应该使用下图函数来接收数据包。当接收到数据包后,你还需要发送回一个数据包给遥控器,不然遥控器等不到应答包就不会再发送数据下来了。(具体原理你看一下遥控器开发指南中NRF24L01+和PA接口一章)
[AppleScript] 纯文本查看 复制代码
/*发送和接收队列信息个数*/#define  RXQ_LEN  10atkp_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);        }        }
举报

张家旺

2020-6-16 16:47:04
感谢感谢,我尝试一下!!!
举报

刘桂珍

2020-6-16 16:56:35
你好 请问你的遥控器成功了吗 本人最近有学期项目 也有这个想法 但不知道怎么做
举报

更多回帖

发帖
×
20
完善资料,
赚取积分