金牌会员
- 积分
- 1755
- 金钱
- 1755
- 注册时间
- 2015-2-7
- 在线时间
- 369 小时
|
发表于 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接口一章)
[mw_shl_code=applescript,true]/*发送和接收队列信息个数*/
#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);
}
}
[/mw_shl_code] |
-
|