回答:
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); } }
回答:
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); } }
举报