OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4310|回复: 6

nRF24L01无线发送竟然跟串口printf有关系,1周了,新人,求大神指导原因。

[复制链接]

0

主题

2

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-10-29
在线时间
9 小时
发表于 2019-11-16 21:44:57 | 显示全部楼层 |阅读模式
本帖最后由 chenxiu 于 2019-11-16 21:46 编辑

用原子哥的例子稍微改下,将原来的例子中的NRF24L01_TxPacket函数分开,第一部分NRF24L01_TxPacket用于发送数据,NRF24L01_TxCheck用于对中断标志来的时候查询并做相应的处理。这两段都是从原子哥程序中简单分开下。主程序在发送后就不再发送,并一直等待中断标志位,如果IRQ发送成功或者超最大数的外部中断触发(PA0作为IRQ外部中断)发生,中断中只将NRF_TX_IRQTRIG置位,通知主程序的NRF24L01_TxCheck来处理中断。结束后又开始继续发送。循环往复。u8 NRF24L01_TxPacket(u8 *txbuf)
{
        u8 sta;
         SPI1_SetSpeed(SPI_BaudRatePrescaler_16);//spi速度为10.5Mhz(24L01的最大SPI时钟为10Mhz)   
        NRF24L01_CE=0;
        NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
         NRF24L01_CE=1;//启动发送        
        nRfTxSta&=~NRF_TX_NEEDSEND;//复位发送标志,代表已经发送
        nRfTxSta|=NRF_TX_OVERCHECK;//置位等待检查发送结果
        return 0;
}

u8 NRF24L01_TxCheck(void)
{        
        u8 sta, cnt, ut;               
        sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值                  
        NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志        
        if(sta&MAX_TX)//达到最大重发次数
        {
          nRfTxSta &=~NRF_TX_OVERCHECK;//将需要待检查结果标志位复位
          nRfTxSta &=~NRF_TX_IRQTRIG;//清除中断标志位
          NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器           
          nRfTxSta |=NRF_TX_NEEDSEND;                                
           return MAX_TX;                 
        }

       if(sta&TX_OK)//发送完成
        {
          nRfTxSta &=~NRF_TX_OVERCHECK;//将需要待检查结果标志位复位
          nRfTxSta &=~NRF_TX_IRQTRIG;//清除中断标志位
          return TX_OK;        
        }

}

IRQ发送成功或者超最大数的中断用外部中断,中断中只将NRF_TX_IRQTRIG置位,通知主程序的NRF24L01_TxCheck来处理中断。
void EXTI0_IRQHandler (void)
{
        if(EXTI_GetITStatus(EXTI_Line0) != RESET)
        {
                iC++;
                if (nRfTxSta & NRF_TX_OVERCHECK)
                {nRfTxSta|=NRF_TX_IRQTRIG;//置位中断标志位
                }
        }
        EXTI_ClearITPendingBit(EXTI_Line0);
}

Main主程序前门配置部分不贴了,将主要部分贴下
while(1)
                {                                                
                        /************* nRF24L01 无线通讯*************/
                        nRfTxSta|=NRF_TX_NEEDSEND;
                        if (((nRfTxSta & NRF_TX_NEEDSEND)!=0) && ((nRfTxSta & NRF_TX_OVERCHECK)==0))//需要发送且不在等待发送结果状态,则发生数据
                        {
                                key=mode;
                                for(t=0;t<32;t++)
                                {
                                        key++;
                                        if(key>('~'))key=' ';
                                        tmp_buf[t]=key;
                                }
                                mode++;
                                if(mode>'~')mode=' ';            
                                tmp_buf[32]=0;//加入结束符                                                         
                                NRF24L01_TxPacket(tmp_buf);
                                sC++;
                                printf("NRF_Tx, nRfTxSta=%x\r\n", nRfTxSta);        //这句不能屏蔽,屏蔽了发现接收不到                        
                        }        
                        if ((nRfTxSta&NRF_TX_OVERCHECK) && (nRfTxSta&NRF_TX_IRQTRIG))
                        {                                                        
                                sta=NRF24L01_TxCheck();                                       
                        }

我的问题是上面这句话
      printf("NRF_Tx, nRfTxSta=%x\r\n", nRfTxSta);        //这句不能屏蔽,屏蔽了发现接收不到  竟然不能屏蔽,
如果注释掉这句这段程序发送就不正常,要嘛上电后不发送,要嘛发送几下就停止了。但是将这句话不注释掉的话,发送完全正常,接收端直接用探索者的例程做的,接收端的板子也是用的探索者。这到底是为什么啊?原子哥能否帮忙解答下?这个发送怎么会跟串口输出有关系呢?一周了,实在想不明白了。请各位大神指导下小弟。谢谢了!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-10-29
在线时间
9 小时
 楼主| 发表于 2019-11-17 14:00:59 | 显示全部楼层
大神们都在哪啊?谢谢指点下,自己顶帖下
回复 支持 反对

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-11-24 19:10:29 | 显示全部楼层
帮顶                    
成功没有捷径
回复 支持 反对

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2019-11-25 15:26:06 | 显示全部楼层
我也遇到同样的问题,当把printf函数改为一个延时几毫秒delay函数时,又恢复正常了,具体原因还不清楚,楼主解决了吗?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-10-29
在线时间
9 小时
 楼主| 发表于 2019-12-5 13:04:02 | 显示全部楼层
liaohaijian 发表于 2019-11-25 15:26
我也遇到同样的问题,当把printf函数改为一个延时几毫秒delay函数时,又恢复正常了,具体原因还不清楚,楼 ...

没有解决,我也试过,改成delay 也不正常的。
回复 支持 反对

使用道具 举报

135

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
641
金钱
641
注册时间
2018-6-19
在线时间
132 小时
发表于 2019-12-16 11:00:22 | 显示全部楼层

可以直接选用SI24R1呀,这颗芯片我们做了七八年了,超低功耗,价格还低,pin对pin兼容nRF24L01P我们同时提供原厂的技术支持
有兴趣可以私我
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-6-3
在线时间
13 小时
发表于 2020-1-27 11:41:06 | 显示全部楼层
是不是CE上拉10ms,发送才成功
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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