nano驱动nRF24L01+数据发不出去-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 498|回复: 2

[未解决] nano驱动nRF24L01+数据发不出去

[复制链接]
发表于 2022-6-11 01:54 | 显示全部楼层 |阅读模式
本帖最后由 iYoutudou 于 2022-6-11 02:33 编辑

目的:借鉴Mirf库驱动nRF模块,通过串口监视工作状态

特别说明:我将模块配置为了无需ACK的单发状态(EN_AA/EN_RXADDR/SETUP_RETR均配置为0x00)
现象问题:寄存器配置显示正确,数据也加载到FIFO中了,但就是发不出去(STATUS=0E,FIFO_STATUS=0X01)串口通信正常,模块是正常的(换到STM32驱动就可以发出去)

引脚关系: CE -> 8  // * CSN -> 7 // * SCK -> 13  * MOSI -> 11 * MISO -> 12 * IRQ  -> 2

整体思路:nRF初始化默认配置为接收状态,在接到电脑通过串口发送的命令后启动发送
setup():
    串口和定时器初始化
    Mirf.init,配置CE和CSN引脚
    Mirf.config 配置为接收模式--清空FIFO接收区
loop():
    读取当前EN_AA / EN_RXADDR / SETUP_RETR / CONFIG寄存器配置状态和STATUS、FIFO_STATUS寄存器状态
    Mirf.send   检验是否在发送状态---配置为发送模式---清空FIFO发送区---CE置高发送
    读取发送后STATUS、FIFO_STATUS寄存器配置状态
    延时循环计数

捕获.JPG

源代码如下:
1.主程序
  1. void loop() {
  2.   Serial.print( "循环第" );
  3.   Serial.print(i, HEX );
  4.   Serial.println("次");
  5. /***********1.读取EN_AA等寄存器的配置值*******************/  
  6.   Mirf.readRegister(EN_AA,&temp[0],1); //读取寄存器配置值
  7.   Serial.print( "EN_AA:" );
  8.   Serial.println( temp[0], HEX );
  9.   
  10.   Mirf.readRegister(EN_RXADDR,&temp[0],1); //读取寄存器配置值
  11.   Serial.print( "EN_RXADDR:" );
  12.   Serial.println( temp[0], HEX );

  13.   Mirf.readRegister(SETUP_RETR,&temp[0],1); //读取寄存器配置值
  14.   Serial.print( "SETUP_RETR:" );
  15.   Serial.println( temp[0], HEX );
  16.   
  17.   Mirf.readRegister(CONFIG,&temp[0],1); //读取寄存器配置值
  18.   Serial.print( "CONFIG:" );
  19.   Serial.println( temp[0], HEX );
  20. /***********2.读取STATUS等寄存器的初始值*******************/   
  21.   //Mirf.readRegister(STATUS,&temp[0],1); //读取寄存器配置值
  22.   temp[0] = Mirf.getStatus();
  23.   Serial.print( "发送前STATUS:" );
  24.   Serial.println( temp[0], HEX );
  25.   
  26.   Mirf.readRegister(FIFO_STATUS,&temp[0],1); //读取寄存器配置值
  27.   Serial.print( "发送前FIFO_STATUS:" );
  28.   Serial.println( temp[0], HEX );
  29. /**************3.发送数据*******************/
  30. Mirf.send(PC_Buf);                //发送指令,发送32字节数据
  31.   //while(Mirf.isSending()) delay(20);         //直到发送成功(TX_DS为1),退出循环 20220529卡死
  32. /***********4.读取STATUS等寄存器的初始值*******************/
  33.   Mirf.readRegister(STATUS,&temp[0],1); //读取寄存器配置值
  34.   Serial.print( "发送后STATUS:" );
  35.   Serial.println( temp[0], HEX );

  36.   Mirf.readRegister(FIFO_STATUS,&temp[0],1); //读取寄存器配置值
  37.   Serial.print( "发送后FIFO_STATUS1:" );
  38.   Serial.println( temp[0], HEX );

  39. //Mirf.writeRegister(STATUS,0xff,1);   //改造为清除状态寄存器
  40.   delay(1000*i); if(i<5)i++;        //此行为节奏控制,后续可删除
复制代码
2.Mirf.CPP[改造后]
SEND.JPG
源码.rar (7.1 KB, 下载次数: 0)
发表于 2022-6-14 20:32 | 显示全部楼层
你有没有试过无线模块的VCC和GND之间加上一个10UF或者以上的电容,好像这东西很容易被波纹影响
 楼主| 发表于 2022-6-14 20:34 | 显示全部楼层
猇Ge 发表于 2022-6-14 20:32
你有没有试过无线模块的VCC和GND之间加上一个10UF或者以上的电容,好像这东西很容易被波纹影响 ...

试过了,串口输出内容还是老样子。我现在怀疑CE端口的电压过高(4.7V),导致工作异常。但是我看nRF模块手册里写了可以兼容5V“If the input signal >3.6V, the VDDof the nRF24L01+ must be between 2.7V and 3.3V (3.0V±10%)”
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 01:14 , Processed in 0.142358 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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