大家帮忙看一下NRF24L01切换发送接收的问题,卡了好久了,求助!!!

2019-07-21 05:35发布

初学者,学校给了模拟任务是做一个能主机从机通信的温度预警仪,这几天在一直调试 NRF24L01模块,
用的是MINI板,代码初始化部分是用原子的例程,用的初始化比较多,但是各个模块不冲突,SD卡怕影响无线通信注释掉了。
现在的问题是,1.板子平时处于接收状态,但是数据发过来接收不了,进不去if(NRF24L01_RxPacket(tmp_buf)==0);2.数据能发过去,但是发过去只会执行if(NRF24L01_TxPacket(tmp_buf)==TX_OK),不会进IF语句里,会return 0xff。以下是NRF24L01_TxPacket(tmp_buf)函数
[mw_shl_code=c,true]//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
u8 NRF24L01_TxPacket(u8 *txbuf)
{
        u8 sta;
        SPI1_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   
        NRF24L01_CE=0;
          NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节  (指令,数据,宽度(字节))
        NRF24L01_CE=1;//启动发送          
        while(NRF24L01_IRQ!=0);//等待发送完成
       
        sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值          
        NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
        if(sta&MAX_TX)//达到最大重发次数
        {
                NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
                return MAX_TX;
        }
        if(sta&TX_OK)//发送完成
        {
                return TX_OK;
        }
        return 0xff;//其他原因发送失败
}[/mw_shl_code]
各位大神帮忙看一下以下代码有什么问题,
1.有什么方法能稳定让主从机平时处于接收状态,需要发数据时候(手动发送,隔一段时间发送一次)切换成发送模式,发完回到接收状态。
2.可以的话贴一下代码演示一下,谢谢!

PS:如果代码里只有发送或接收是没问题的,一篇代码如果发送接收都在就会出问题。原子的无线通信例程也可以实现发送接收。
代码如下
[mw_shl_code=c,true]#include "stdio.h"
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "remote.h"   
#include "ds18b20.h"  
#include "timer.h"
#include "usmart.h"
#include "24l01.h"
extern int sec,second;
extern int temperature,oC;
#include "malloc.h"  
#include "MMC_SD.h"
#include "ff.h"  
#include "exfuns.h"
#include "rtc.h"
FIL fil;
FRESULT res;
UINT bww;
u8  buf[10];
u8  Tmf_buf[33];
u8 tmp_buf[33];
int oC;
  int Temperature;
GPIO_InitTypeDef GPIO_InitStructure;
void Temperature_LCD_USART();//温度数据显示(LCD,USART)
int main(void)
{
        u8 key,mode;
        int flag;
        u8 t=0;       
        u8 *str=0;          
        delay_init();                     //延时函数初始?
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2          
        uart_init(9600);                 //串口初始化为9600
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();
        RTC_Init();
        Remote_Init();                        //红外接收初始化       
        //usmart_dev.init(72);       
//        mem_init();                        //初始化内存池       
        TIM3_Int_Init(9999,7199);//10Khz的计数频率,计数到5000为500ms  
        //exfuns_init();                                                        //为fatfs相关变量申请内存                                 
  //f_mount(fs[0],"0:",1);                                         //挂载SD卡
        //f_mount(fs[1],"1:",1);                                         //挂载FLASH.       
        NRF24L01_Init();            //初始化NRF24L01         
        LCD_LED = 0;//LCD熄屏       
        POINT_COLOR=BLUE;//设置字体为红 {MOD}
        temperature=DS18B20_Get_Temp();        //获取温度
        LCD_ShowNum(100+330,775,temperature/10,2,24);        //显示正数部分
        LCD_ShowChar(100+330+24,775,'.',24,0);       
        LCD_ShowNum(100+330+34,775,temperature%10,1,24);        //显示小数部分
        LCD_ShowString(60,742,200,16,16,"    -  -     ");          
        LCD_ShowString(60,775,200,16,16,"  :  :  ");
         while(1)
         {
                key=Remote_Scan();
                                                 if(mode == 0)
                {
                                NRF24L01_RX_Mode();
                                        if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
                        {
                                LCD_ShowString(60,250,200,16,16,"NRF24L01 RX_Mode");       
                                LCD_ShowString(60,270,200,16,16,"Received DATA:");
                                if(tmp_buf[0] == 0xaa)
                                LCD_ShowString(16,320,200,16,16,"0xaa");
                                tmp_buf[0] = 0;
                                tmp_buf[1] = 1;
                                tmp_buf[32]=0;//加入字符串结束符
                        }
                }
                                if(t!=calendar.sec)//时间显示
                {
                        POINT_COLOR = BLACK;//设置字体为红 {MOD}
                        t=calendar.sec;
                        LCD_ShowNum(60,742,calendar.w_year,4,16);                                                                          
                        LCD_ShowNum(100,742,calendar.w_month,2,16);                                                                          
                        LCD_ShowNum(124,742,calendar.w_date,2,16);         

                        LCD_ShowNum(60,775,calendar.hour,2,16);                                                                          
                        LCD_ShowNum(84,775,calendar.min,2,16);                                                                          
                        LCD_ShowNum(108,775,calendar.sec,2,16);
                       
                }       
                if(sec == 60 && LCD_LED == 1)//熄灭LCD
                {
                        LCD_LED = 0;//LCD熄屏
                        sec = 0;
                }
                         NRF24L01_RX_Mode();
                                        if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
                        {
                                tmp_buf[32]=0;//加入字符串结束符
                                LCD_ShowString(0,190,239,32,16,tmp_buf);   
                        }
                if(second >=10)//10秒更新一次温度,发送心跳
                {
                                LCD_ShowString(60,350,200,16,16,"NRF24L01 TX_Mode");       
                                                NRF24L01_TX_Mode();
                                                tmp_buf[1]  = 0xaa;
                                                tmp_buf[2]  = 0x02;
                                                tmp_buf[3]  = 0x01;
                                                tmp_buf[4] = Temperature/10;
                                                tmp_buf[5] = Temperature%10;
                                                tmp_buf[6] = 0x55;
                                                        if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
                                {
                                                LCD_ShowString(60,370,239,32,16,"Sended DATA:");       
                                                LCD_ShowNum(0,390,Temperature/10,2,16);        //显示正数部分
                                                LCD_ShowChar(16,390,'.',16,0);       
                                                LCD_ShowNum(24,390,Temperature%10,1,16);        //显示小数部分
                                                tmp_buf[32]=0;//加入结束符       
                                                second = 0;       
                                                NRF24L01_Init();            //初始化NRF24L01
                                }else
                                {                                                                                          
                                                LCD_ShowString(60,370,239,32,16,"Send Failed ");
                                                LCD_Fill(0,370,340,218,WHITE);//清空上面的显示               
                                };
                               
                }
       
                if(key)
                {
                        switch(key)
                {               
//                                case 0:str="ERROR";break;                          
//                                case 162:str="POWER";break;            
//                                case 98:str="UP";break;            
                                        case 2:str="PLAY";break;                 
//                                case 226:str="ALIENTEK";break;                  
//                                case 194:str="RIGHT";break;          
//                                case 34:str="LEFT";break;                  
//                                case 224:str="VOL-";break;                  
//                                case 168:str="DOWN";break;                  
//                                case 144:str="VOL+";break;                    
//                                case 104:str="1";break;                  
//                                        case 152:str="TX";break;          
//                                case 176:str="3";break;            
//                                case 48:str="4";break;                    
//                                case 24:str="5";break;                    
//                                case 122:str="6";break;                  
//                                case 16:str="7";break;                                                                  
//                                case 56:str="8";break;         
//                                case 90:str="9";break;
//                                case 66:str="0";break;
//                                case 82:str="DELETE";break;       
                                        default:str = "ERROR";
                        }
                                if(str == "PLAY")
                                {
                                LCD_LED=1;//开启背光
                                sec = 0;                                       
                                LCD_ShowString(60,50,200,24,24,"Mini STM32");       
                                LCD_ShowString(60,80,200,24,24,"IL-24");
                                LCD_ShowString(60,110,200,24,24,"2018/12/24");
                                LCD_ShowString(60,140,200,24,24,"KEYVAL:");       
                                LCD_ShowString(60,170,200,24,24,"SYMBOL:");       
                                LED1 =!LED1;delay_ms(50);LED1 =!LED1;
                                LCD_ShowNum(144,140,key,3,24);                //显示键值         
                                }
                                LCD_Fill(144,70,144+12*12,170+24,WHITE);        //清楚之前的显示
                                LCD_ShowString(144,70,200,24,24,str);        //显示SYMBOL
                }                         
}

         }
[/mw_shl_code]



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
零一三南宫南
1楼-- · 2019-07-21 08:31
C语言。。。
瓦斯科
2楼-- · 2019-07-21 11:42
这个模块,是半双工的吧。

那么你切换状态有没规定好协议,比如主机平时接收,突然转为发送状态。

而你从机这时候是什么状态?
a3748622
3楼-- · 2019-07-21 16:21
从机是在接收状态,测功能为了防止出错,从机始终在保持在接收状态

一周热门 更多>