OpenEdv-开源电子网

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

关于NRF传送数据过程中存在的问题

[复制链接]

16

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2019-7-9
在线时间
52 小时
发表于 2019-7-31 15:51:21 | 显示全部楼层 |阅读模式
5金钱
1.png 为什么我的NRF只能传送数据这么几次,不能一直循环传送,程序中的最大自动重发次数是具体有何作用呢,我的这种情况是否与之有关系呢?

Talk is cheap, show me the code.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-8-1 02:05:37 | 显示全部楼层
建议直接用我们例程试试?
回复

使用道具 举报

16

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2019-7-9
在线时间
52 小时
 楼主| 发表于 2019-8-1 08:56:01 | 显示全部楼层
正点原子 发表于 2019-8-1 02:05
建议直接用我们例程试试?

例程可以的,现在的问题是,我要在串口打印两组数据,一组是本身芯片测得的ADC转换的数值(用DMA传输的),另一组是NRF模块传过来的数据,这两组数据单独打印时(把另外一组数据的程序注释掉),都可以,但是一起时,就会出错,卡死。
Talk is cheap, show me the code.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-8-2 02:28:17 | 显示全部楼层
XDY 发表于 2019-8-1 08:56
例程可以的,现在的问题是,我要在串口打印两组数据,一组是本身芯片测得的ADC转换的数值(用DMA传输的) ...

怎么个代码?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2019-7-9
在线时间
52 小时
 楼主| 发表于 2019-8-2 08:52:42 | 显示全部楼层

#define SEND_BUF_SIZE 2        //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.

u32 SendBuff[SEND_BUF_SIZE];        //发送数据缓冲区

#define RX_BUF_SIZE 2        //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.
u8 RX_BUF[RX_BUF_SIZE];        //发送数据缓冲区
int main(void)
{         
        u16 adcx;
        //int count=0;
        float Volt_TX=0.0;
        float Cur_TX=0.0;
        float Volt_Value=0.0;
        float Cur_Value=0.0;
        float Volt_RX=0.0;
        float Volt_RX_Value=0.0;
        float Cur_RX=0.0;
        delay_init();                     //延时函数初始化          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(9600);                 //串口初始化为115200
        TIM1_GPIO_Config();
        TIM1_PWM_Init(899,0);//72/9=8MHz,8000Khz/100=80Khz  72000khz/900
        Adc_Init();                 
        MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)SendBuff,SEND_BUF_SIZE);//DMA1通道1,外设为串口1,存储器为SendBuff,长度SEND_BUF_SIZE.
        NRF24L01_Init();//初始化NRF24L01
        PID_init();
        while(NRF24L01_Check())        //检查NRF24L01是否在位.       
        {
                printf("NRF24L01 Error\r\n");
                delay_ms(200);
        }                                                                  
        printf("NRF24L01 OK\r\n");
        while(1)
        {
                ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能       
                while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
    ADC_DMACmd(ADC1, ENABLE);
                MYDMA_Enable(DMA1_Channel1);//开始一次DMA传输!          
                        while(1)
                        {
                                if(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=RESET)        //判断通道4传输完成
                                {
                                        DMA_ClearFlag(DMA1_FLAG_TC1);//清除通道4传输完成标志
                                        break;
                                }
                        }       
                adcx=(u16)(SendBuff[0]&0x00ffff);
                Volt_TX=(float)adcx*(112.2/4096);
                Volt_Value=(float)adcx*(112.2/4096);
                adcx=Volt_TX;
                printf("Volt_TX:%d",adcx);
                Volt_TX-=adcx;
                Volt_TX*=1000;
                adcx=Volt_TX;
                printf(".%d\n",adcx);
               
                adcx=(u16)(SendBuff[1]&0x00ffff);
                Cur_TX=(float)adcx*(112.2/4096);
                Cur_Value=(float)adcx*(112.2/4096);
                adcx=Cur_TX;       
                printf("Cur_TX:%d",adcx);
                Cur_TX-=adcx;
                Cur_TX*=1000;
                adcx=Cur_TX;
                printf(".%d\n",adcx);
               
                NRF24L01_RX_Mode();
               
                if (NRF24L01_RxPacket(RX_BUF)==0)
{        
                adcx=(u16)(RX_BUF[0]&0x00ffff);
                Volt_RX=(float)adcx*(112.2/4096);
                Volt_RX_Value=(float)adcx*(112.2/4096);
                adcx=Volt_RX;
                printf("Volt_RX:%d",adcx);
                Volt_RX-=adcx;
                Volt_RX*=1000;
                adcx=Volt_RX;
                printf(".%d\n",adcx);
               
                adcx=(u16)(RX_BUF[1]&0x00ffff);
                Cur_RX=(float)adcx*(112.2/4096);
                adcx=Cur_RX;
                printf("Cur_RX:%d",adcx);
                Cur_RX-=adcx;
                Cur_RX*=1000;
                adcx=Cur_RX;
                printf(".%d\n",adcx);
       
       
//          float CCR1_Val=PID_realize(200,Volt_RX_Value);  
//                CCR1_Val*=75;//换算成占空比所需数值(这里的想法是)
//                int CCR1=CCR1_Val;
//    TIM_SetCompare1(TIM1,CCR1);         
}       
        else  
{
                printf("Volt_RX:Nothing");
          printf("Cur_RX:Nothing");
}
                                
                // count++;
                         delay_ms(1000);
                                       
               
        }
}
Talk is cheap, show me the code.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-8-3 02:19:38 | 显示全部楼层
XDY 发表于 2019-8-2 08:52
#define SEND_BUF_SIZE 2        //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.

u32 SendBuff[SEN ...

仿真找下问题吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 19:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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