找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1239|回复: 3
打印 上一主题 下一主题
收起左侧

NRF24L01在STM32开发板烧录或复位接收不到数据

[复制链接]
跳转到指定楼层
楼主
ID:932115 发表于 2022-3-11 22:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
NRF24L01在开发板烧录或按下复位接收不到数据,只有把模块拔掉再插上才能正常接收,不然一直没有反应模块检测也能通过,大佬们这种情况怎么办,下面是初始化代码
  1. void RF24L01_Init( void )
  2. {
  3.     uint8_t addr[5] = {INIT_ADDR};

  4.     RF24L01_SET_CE_HIGH( );//CE拉高
  5.     //IRQ_ALL  ( (1<<RX_DR) | (1<<TX_DS) | (1<<MAX_RT) )
  6.     NRF24L01_Clear_IRQ_Flag( IRQ_ALL );
  7.     //0xE2 命令
  8.     NRF24L01_Flush_Rx_Fifo();//清除接收缓冲区
  9. //DYNAMIC_PACKET      1
  10. #if DYNAMIC_PACKET == 1
  11.     //DYNPD   0x1c
  12.     NRF24L01_Write_Reg( DYNPD, ( 1 << 0 ) );         //使能通道1动态数据长度
  13.     //FEATRUE  0x1d
  14.     NRF24L01_Write_Reg( FEATRUE, 0x07 );
  15.     //DYNPD  0x1c
  16.     NRF24L01_Read_Reg( DYNPD );
  17.     //FEATRUE  0x1d
  18.     NRF24L01_Read_Reg( FEATRUE );
  19.         
  20. #elif DYNAMIC_PACKET == 0//不执行
  21.    
  22.     L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN );        //固定数据长度
  23.    
  24. //DYNAMIC_PACKET      1
  25. #endif        //DYNAMIC_PACKET
  26.   // CONFIG 0x00       EN_CRC 3         PWR_UP 1
  27.     NRF24L01_Write_Reg( CONFIG, /*( 1<<MASK_RX_DR ) |*/                //接收中断
  28.                                       ( 1 << EN_CRC ) |     //使能CRC 1个字节
  29.                                       ( 1 << PWR_UP ) );    //开启设备
  30.     //EN_AA 0x01       ENAA_P0  0
  31.     NRF24L01_Write_Reg( EN_AA, ( 1 << ENAA_P0 ) );                   //通道0自动应答
  32.     //EN_RXADDR  0x02     ERX_P0   0
  33.     NRF24L01_Write_Reg( EN_RXADDR, ( 1 << ERX_P0 ) );                //通道0接收
  34.     //SETUP_AW   0x03     AW_5BYTES 0x3
  35.     NRF24L01_Write_Reg( SETUP_AW, AW_5BYTES );                             //地址宽度 5个字节
  36.     //SETUP_RETR  0x04    ARD_4000US (0x0F<<4)   REPEAT_CNT  15
  37.     NRF24L01_Write_Reg( SETUP_RETR, ARD_4000US |
  38.                         ( REPEAT_CNT & 0x0F ) );                 //重复等待时间 250us
  39.     //RF_CH  0x05
  40.     NRF24L01_Write_Reg( RF_CH, 60 );                                     //初始化通道
  41.     //RF_SETUP  0x06
  42.     NRF24L01_Write_Reg( RF_SETUP, 0x26 );
  43.     //{0x34,0x43,0x10,0x10,0x01}
  44.     NRF24L01_Set_TxAddr( &addr[0], 5 );                      //设置TX地址
  45.     NRF24L01_Set_RxAddr( 0, &addr[0], 5 );                   //设置RX地址
  46. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:932115 发表于 2022-3-11 23:01 | 只看该作者
开发板使用的是STM32F407VET6
回复

使用道具 举报

板凳
ID:276663 发表于 2022-3-12 10:08 | 只看该作者
就这些代码你让看啥?
回复

使用道具 举报

地板
ID:932115 发表于 2022-3-12 12:06 | 只看该作者
IdeaMing 发表于 2022-3-12 10:08
就这些代码你让看啥?

大佬这是其他代码
  1. #include "stm32f4xx.h"
  2. #include "nrf24l01.h"
  3. #include "sys.h"
  4. #include <stdio.h>

  5. const char *g_ErrorString = "RF24L01 is not find !...";

  6. /**
  7.   * @brief :NRF24L01读寄存器
  8.   * @param :
  9.            @Addr:寄存器地址
  10.   * @note  :地址在设备中有效
  11.   * @retval:读取的数据
  12.   */
  13. uint8_t NRF24L01_Read_Reg( uint8_t RegAddr )
  14. {
  15.     uint8_t btmp;
  16.        
  17.     RF24L01_SET_CS_LOW( );                        //片选
  18.        
  19.     drv_spi_read_write_byte( NRF_READ_REG | RegAddr );        //读命令 地址
  20.     btmp = drv_spi_read_write_byte( 0xFF );                                //读数据
  21.        
  22.     RF24L01_SET_CS_HIGH( );                        //取消片选
  23.        
  24.     return btmp;
  25. }

  26. /**
  27.   * @brief :NRF24L01读指定长度的数据
  28.   * @param :
  29.   *                        @reg:地址
  30.   *                        @pBuf:数据存放地址
  31.   *                        @len:数据长度
  32.   * @note  :数据长度不超过255,地址在设备中有效
  33.   * @retval:读取状态
  34.   */
  35. void NRF24L01_Read_Buf( uint8_t RegAddr, uint8_t *pBuf, uint8_t len )
  36. {
  37.     uint8_t btmp;
  38.        
  39.     RF24L01_SET_CS_LOW( );                        //片选
  40.        
  41.     drv_spi_read_write_byte( NRF_READ_REG | RegAddr );        //读命令 地址
  42.     for( btmp = 0; btmp < len; btmp ++ )
  43.     {
  44.         *( pBuf + btmp ) = drv_spi_read_write_byte( 0xFF );        //读数据
  45.     }
  46.     RF24L01_SET_CS_HIGH( );                //取消片选
  47. }

  48. /**
  49.   * @brief :NRF24L01写寄存器
  50.   * @param :无
  51.   * @note  :地址在设备中有效
  52.   * @retval:读写状态
  53.   */
  54. void NRF24L01_Write_Reg( uint8_t RegAddr, uint8_t Value )
  55. {
  56.     RF24L01_SET_CS_LOW( );                //片选
  57.        
  58.     drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr );        //写命令 地址
  59.     drv_spi_read_write_byte( Value );                        //写数据
  60.        
  61.     RF24L01_SET_CS_HIGH( );                //取消片选
  62. }

  63. /**
  64.   * @brief :NRF24L01写指定长度的数据
  65.   * @param :
  66.   *                        @reg:地址
  67.   *                        @pBuf:写入的数据地址
  68.   *                        @len:数据长度
  69.   * @note  :数据长度不超过255,地址在设备中有效
  70.   * @retval:写状态
  71.   */
  72. void NRF24L01_Write_Buf( uint8_t RegAddr, uint8_t *pBuf, uint8_t len )
  73. {
  74.     uint8_t i;
  75.        
  76.     RF24L01_SET_CS_LOW( );                //片选
  77.        
  78.     drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr );        //写命令 地址
  79.     for( i = 0; i < len; i ++ )
  80.     {
  81.         drv_spi_read_write_byte( *( pBuf + i ) );                //写数据
  82.     }
  83.        
  84.     RF24L01_SET_CS_HIGH( );                //取消片选
  85. }

  86. /**
  87.   * @brief :清空TX缓冲区
  88.   * @param :无
  89.   * @note  :无
  90.   * @retval:无
  91.   */
  92. void NRF24L01_Flush_Tx_Fifo ( void )
  93. {
  94.     RF24L01_SET_CS_LOW( );                //片选
  95.        
  96.     drv_spi_read_write_byte( FLUSH_TX );        //清TX FIFO命令
  97.        
  98.     RF24L01_SET_CS_HIGH( );                //取消片选
  99. }

  100. /**
  101.   * @brief :清空RX缓冲区
  102.   * @param :无
  103.   * @note  :无
  104.   * @retval:无
  105.   */
  106. void NRF24L01_Flush_Rx_Fifo( void )
  107. {
  108.     RF24L01_SET_CS_LOW( );                //片选
  109.        
  110.     drv_spi_read_write_byte( FLUSH_RX );        //清RX FIFO命令
  111.        
  112.     RF24L01_SET_CS_HIGH( );                //取消片选
  113. }

  114. /**
  115.   * @brief :重新使用上一包数据
  116.   * @param :无
  117.   * @note  :无
  118.   * @retval:无
  119.   */
  120. void NRF24L01_Reuse_Tx_Payload( void )
  121. {
  122.     RF24L01_SET_CS_LOW( );                //片选
  123.        
  124.     drv_spi_read_write_byte( REUSE_TX_PL );                //重新使用上一包命令
  125.        
  126.     RF24L01_SET_CS_HIGH( );                //取消片选
  127. }

  128. /**
  129.   * @brief :NRF24L01空操作
  130.   * @param :无
  131.   * @note  :无
  132.   * @retval:无
  133.   */
  134. void NRF24L01_Nop( void )
  135. {
  136.     RF24L01_SET_CS_LOW( );                //片选
  137.        
  138.     drv_spi_read_write_byte( NOP );                //空操作命令
  139.        
  140.     RF24L01_SET_CS_HIGH( );                //取消片选
  141. }

  142. /**
  143.   * @brief :NRF24L01读状态寄存器
  144.   * @param :无
  145.   * @note  :无
  146.   * @retval:RF24L01状态
  147.   */
  148. uint8_t NRF24L01_Read_Status_Register( void )
  149. {
  150.     uint8_t Status;
  151.        
  152.     RF24L01_SET_CS_LOW( );                //片选
  153.        
  154.     Status = drv_spi_read_write_byte( NRF_READ_REG + STATUS );        //读状态寄存器
  155.        
  156.     RF24L01_SET_CS_HIGH( );                //取消片选
  157.        
  158.     return Status;
  159. }

  160. /**
  161.   * @brief :NRF24L01清中断
  162.   * @param :
  163.            @IRQ_Source:中断源
  164.   * @note  :无
  165.   * @retval:清除后状态寄存器的值
  166.   */
  167. uint8_t NRF24L01_Clear_IRQ_Flag( uint8_t IRQ_Source )
  168. {
  169.     uint8_t btmp = 0;

  170.     IRQ_Source &= ( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT );        //中断标志处理
  171.     btmp = NRF24L01_Read_Status_Register( );                        //读状态寄存器
  172.                
  173.     RF24L01_SET_CS_LOW( );                        //片选
  174.     drv_spi_read_write_byte( NRF_WRITE_REG + STATUS );        //写状态寄存器命令
  175.     drv_spi_read_write_byte( IRQ_Source | btmp );                //清相应中断标志
  176.     RF24L01_SET_CS_HIGH( );                        //取消片选
  177.        
  178.     return ( NRF24L01_Read_Status_Register( ));                        //返回状态寄存器状态
  179. }

  180. /**
  181.   * @brief :读RF24L01中断状态
  182.   * @param :无
  183.   * @note  :无
  184.   * @retval:中断状态
  185.   */
  186. uint8_t RF24L01_Read_IRQ_Status( void )
  187. {
  188.     return ( NRF24L01_Read_Status_Register( ) & (( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT )));        //返回中断状态
  189. }

  190. /**
  191.   * @brief :读FIFO中数据宽度
  192.   * @param :无
  193.   * @note  :无
  194.   * @retval:数据宽度
  195.   */
  196. uint8_t NRF24L01_Read_Top_Fifo_Width( void )
  197. {
  198.     uint8_t btmp;
  199.        
  200.     RF24L01_SET_CS_LOW( );                //片选
  201.        
  202.     drv_spi_read_write_byte( R_RX_PL_WID );        //读FIFO中数据宽度命令
  203.     btmp = drv_spi_read_write_byte( 0xFF );        //读数据
  204.        
  205.     RF24L01_SET_CS_HIGH( );                //取消片选
  206.        
  207.     return btmp;
  208. }

  209. /**
  210.   * @brief :读接收到的数据
  211.   * @param :无
  212.   * @note  :无
  213.   * @retval:
  214.            @pRxBuf:数据存放地址首地址
  215.   */
  216. uint8_t NRF24L01_Read_Rx_Payload( uint8_t *pRxBuf )
  217. {
  218.     uint8_t Width, PipeNum;
  219.        
  220.     PipeNum = ( NRF24L01_Read_Reg( STATUS ) >> 1 ) & 0x07;        //读接收状态
  221.     Width = NRF24L01_Read_Top_Fifo_Width( );                //读接收数据个数

  222.     RF24L01_SET_CS_LOW( );                //片选
  223.     drv_spi_read_write_byte( RD_RX_PLOAD );                        //读有效数据命令
  224.        
  225.     for( PipeNum = 0; PipeNum < Width; PipeNum ++ )
  226.     {
  227.         *( pRxBuf + PipeNum ) = drv_spi_read_write_byte( 0xFF );                //读数据
  228.     }
  229.     RF24L01_SET_CS_HIGH( );                //取消片选
  230.     NRF24L01_Flush_Rx_Fifo( );        //清空RX FIFO
  231.        
  232.     return Width;
  233. }

  234. /**
  235.   * @brief :发送数据(带应答)
  236.   * @param :
  237.   *                        @pTxBuf:发送数据地址
  238.   *                        @len:长度
  239.   * @note  :一次不超过32个字节
  240.   * @retval:无
  241.   */
  242. void NRF24L01_Write_Tx_Payload_Ack( uint8_t *pTxBuf, uint8_t len )
  243. {
  244.     uint8_t btmp;
  245.     uint8_t length = ( len > 32 ) ? 32 : len;                //数据长达大约32 则只发送32个

  246.     NRF24L01_Flush_Tx_Fifo( );                //清TX FIFO
  247.        
  248.     RF24L01_SET_CS_LOW( );                        //片选
  249.     drv_spi_read_write_byte( WR_TX_PLOAD );        //发送命令
  250.        
  251.     for( btmp = 0; btmp < length; btmp ++ )
  252.     {
  253.         drv_spi_read_write_byte( *( pTxBuf + btmp ) );        //发送数据
  254.     }
  255.     RF24L01_SET_CS_HIGH( );                        //取消片选
  256. }

  257. /**
  258.   * @brief :发送数据(不带应答)
  259.   * @param :
  260.   *                        @pTxBuf:发送数据地址
  261.   *                        @len:长度
  262.   * @note  :一次不超过32个字节
  263.   * @retval:无
  264.   */
  265. void NRF24L01_Write_Tx_Payload_NoAck( uint8_t *pTxBuf, uint8_t len )
  266. {
  267.     if( len > 32 || len == 0 )
  268.     {
  269.         return ;                //数据长度大于32 或者等于0 不执行
  270.     }
  271.        
  272.     RF24L01_SET_CS_LOW( );        //片选
  273.     drv_spi_read_write_byte( WR_TX_PLOAD_NACK );        //发送命令
  274.     while( len-- )
  275.     {
  276.         drv_spi_read_write_byte( *pTxBuf );                        //发送数据
  277.                 pTxBuf++;
  278.     }
  279.     RF24L01_SET_CS_HIGH( );                //取消片选
  280. }

  281. /**
  282.   * @brief :在接收模式下向TX FIFO写数据(带ACK)
  283.   * @param :
  284.   *                        @pData:数据地址
  285.   *                        @len:长度
  286.   * @note  :一次不超过32个字节
  287.   * @retval:无
  288.   */
  289. void NRF24L01_Write_Tx_Payload_InAck( uint8_t *pData, uint8_t len )
  290. {
  291.     uint8_t btmp;
  292.        
  293.         len = ( len > 32 ) ? 32 : len;                //数据长度大于32个则只写32个字节

  294.     RF24L01_SET_CS_LOW( );                        //片选
  295.     drv_spi_read_write_byte( W_ACK_PLOAD );                //命令
  296.     for( btmp = 0; btmp < len; btmp ++ )
  297.     {
  298.         drv_spi_read_write_byte( *( pData + btmp ) );        //写数据
  299.     }
  300.     RF24L01_SET_CS_HIGH( );                        //取消片选
  301. }

  302. /**
  303.   * @brief :设置发送地址
  304.   * @param :
  305.   *                        @pAddr:地址存放地址
  306.   *                        @len:长度
  307.   * @note  :无
  308.   * @retval:无
  309.   */
  310. void NRF24L01_Set_TxAddr( uint8_t *pAddr, uint8_t len )
  311. {
  312.         len = ( len > 5 ) ? 5 : len;                                        //地址不能大于5个字节
  313.     NRF24L01_Write_Buf( TX_ADDR, pAddr, len );        //写地址
  314. }

  315. /**
  316.   * @brief :设置接收通道地址
  317.   * @param :
  318.   *                        @PipeNum:通道
  319.   *                        @pAddr:地址存肥着地址
  320.   *                        @Len:长度
  321.   * @note  :通道不大于5 地址长度不大于5个字节
  322.   * @retval:无
  323.   */
  324. void NRF24L01_Set_RxAddr( uint8_t PipeNum, uint8_t *pAddr, uint8_t Len )
  325. {
  326.     Len = ( Len > 5 ) ? 5 : Len;
  327.     PipeNum = ( PipeNum > 5 ) ? 5 : PipeNum;                //通道不大于5 地址长度不大于5个字节

  328.     NRF24L01_Write_Buf( RX_ADDR_P0 + PipeNum, pAddr, Len );        //写入地址
  329. }

  330. /**
  331.   * @brief :设置通信速度
  332.   * @param :
  333.   *                        @Speed:速度
  334.   * @note  :无
  335.   * @retval:无
  336.   */
  337. void NRF24L01_Set_Speed( nRf24l01SpeedType Speed )
  338. {
  339.         uint8_t btmp = 0;
  340.        
  341.         btmp = NRF24L01_Read_Reg( RF_SETUP );
  342.         btmp &= ~( ( 1<<5 ) | ( 1<<3 ) );
  343.        
  344.         if( Speed == SPEED_250K )                //250K
  345.         {
  346.                 btmp |= ( 1<<5 );
  347.         }
  348.         else if( Speed == SPEED_1M )   //1M
  349.         {
  350.                    btmp &= ~( ( 1<<5 ) | ( 1<<3 ) );
  351.         }
  352.         else if( Speed == SPEED_2M )   //2M
  353.         {
  354.                 btmp |= ( 1<<3 );
  355.         }

  356.         NRF24L01_Write_Reg( RF_SETUP, btmp );
  357. }

  358. /**
  359.   * @brief :设置功率
  360.   * @param :
  361.   *                        @Speed:速度
  362.   * @note  :无
  363.   * @retval:无
  364.   */
  365. void NRF24L01_Set_Power( nRf24l01PowerType Power )
  366. {
  367.     uint8_t btmp;
  368.        
  369.         btmp = NRF24L01_Read_Reg( RF_SETUP ) & ~0x07;
  370.     switch( Power )
  371.     {
  372.         case POWER_F18DBM:
  373.             btmp |= PWR_18DB;
  374.             break;
  375.         case POWER_F12DBM:
  376.             btmp |= PWR_12DB;
  377.             break;
  378.         case POWER_F6DBM:
  379.             btmp |= PWR_6DB;
  380.             break;
  381.         case POWER_0DBM:
  382.             btmp |= PWR_0DB;
  383.             break;
  384.         default:
  385.             break;
  386.     }
  387.     NRF24L01_Write_Reg( RF_SETUP, btmp );
  388. }

  389. /**
  390.   * @brief :设置频率
  391.   * @param :
  392.   *                        @FreqPoint:频率设置参数
  393.   * @note  :值不大于127
  394.   * @retval:无
  395.   */
  396. void RF24LL01_Write_Hopping_Point( uint8_t FreqPoint )
  397. {
  398.     NRF24L01_Write_Reg(  RF_CH, FreqPoint & 0x7F );
  399. }

  400. /**
  401.   * @brief :NRF24L01单次检测
  402.   * @param printf_sw 串口是否打印连接失败  1:是  0:否
  403.   * @note  :循环
  404.   * @retval:0:连接成功    1:连接失败
  405.   */
  406. uint8_t NRF24L01_check( uint8_t printf_sw )
  407. {
  408.         uint8_t i;
  409.         uint8_t buf[5]={ 0XA5, 0XA5, 0XA5, 0XA5, 0XA5 };
  410.         uint8_t read_buf[ 5 ] = { 0 };
  411.   NRF24L01_Write_Buf( TX_ADDR, buf, 5 );                        //写入5个字节的地址
  412.   NRF24L01_Read_Buf( TX_ADDR, read_buf, 5 );                //读出写入的地址  
  413.   for( i = 0; i < 5; i++ )
  414.   {
  415.     if( buf[ i ] != read_buf[ i ] )
  416.     {
  417.       break;
  418.     }       
  419.   }
  420.   if( 5 == i )
  421.   {
  422.     return 0;
  423.   }
  424.   else
  425.   {
  426.     if(printf_sw)
  427.     {
  428.       // printf("RF24L01 is not find !...");
  429.       printf(g_ErrorString);
  430.     }
  431.       //===============================
  432.     // delay_ms(1500);//连接失败延迟1.5s
  433.     //OLED_ShowString(0,3,(uint8_t *)g_ErrorString,8);
  434.     // printf("end\r\n");
  435.     return 1;
  436.   }
  437. }

  438. // /**
  439. //   * @brief :NRF24L01循环检测
  440. //   * @param :无
  441. //   * @note  :无限循环版
  442. //   * @retval:无
  443. //   */
  444. // uint8_t NRF24L01_while_check( void )
  445. // {
  446. //         uint8_t i;
  447. //         uint8_t buf[5]={ 0XA5, 0XA5, 0XA5, 0XA5, 0XA5 };
  448. //         uint8_t read_buf[ 5 ] = { 0 };
  449.          
  450. //         while( 1 )
  451. //         {
  452. //                 NRF24L01_Write_Buf( TX_ADDR, buf, 5 );                        //写入5个字节的地址
  453. //                 NRF24L01_Read_Buf( TX_ADDR, read_buf, 5 );                //读出写入的地址  
  454. //                 for( i = 0; i < 5; i++ )
  455. //                 {
  456. //                         if( buf[ i ] != read_buf[ i ] )
  457. //                         {
  458. //                                 break;
  459. //                         }       
  460. //                 }
  461.                
  462. //                 if( 5 == i )
  463. //                 {
  464. //                         break;
  465. //                 }
  466. //                 else
  467. //                 {
  468. //       printf(g_ErrorString);//===============================
  469. // //                        OLED_ShowString(0,3,(uint8_t *)g_ErrorString,8);
  470. //                 }
  471. //                 delay_ms(1500);
  472. //         }
  473. // }

  474. /**
  475.   * @brief :设置模式
  476.   * @param :
  477.   *                        @Mode:模式发送模式或接收模式
  478.   * @note  :无
  479.   * @retval:无
  480.   */
  481. void RF24L01_Set_Mode( nRf24l01ModeType Mode )
  482. {
  483.     uint8_t controlreg = 0;
  484.         controlreg = NRF24L01_Read_Reg( CONFIG );
  485.        
  486.     if( Mode == MODE_TX )      
  487.         {
  488.                 controlreg &= ~( 1<< PRIM_RX );
  489.         }
  490.     else
  491.         {
  492.                 if( Mode == MODE_RX )  
  493.                 {
  494.                         controlreg |= ( 1<< PRIM_RX );
  495.                 }
  496.         }

  497.     NRF24L01_Write_Reg( CONFIG, controlreg );
  498. }

  499. /**
  500.   * @brief :NRF24L01发送一次数据
  501.   * @param :
  502.   *                        @txbuf:待发送数据首地址
  503.   *                        @Length:发送数据长度
  504.   * @note  :无
  505.   * @retval:
  506.   *                        MAX_TX:达到最大重发次数
  507.   *                        TX_OK:发送完成
  508.   *                        0xFF:其他原因
  509.   */
  510. uint8_t NRF24L01_TxPacket( uint8_t *txbuf, uint8_t Length )
  511. {
  512.         uint8_t l_Status = 0;
  513.         uint16_t l_MsTimes = 0;
  514.        
  515.         RF24L01_SET_CS_LOW( );                //片选
  516.         drv_spi_read_write_byte( FLUSH_TX );
  517.         RF24L01_SET_CS_HIGH( );
  518.        
  519.         RF24L01_SET_CE_LOW( );               
  520.         NRF24L01_Write_Buf( WR_TX_PLOAD, txbuf, Length );        //写数据到TX BUF 32字节  TX_PLOAD_WIDTH
  521.         RF24L01_SET_CE_HIGH( );                        //启动发送
  522.         while( 0 != RF24L01_GET_IRQ_STATUS( ))
  523.         {
  524.                 delay_ms( 1 );
  525.                 if( 500 == l_MsTimes++ )                                                //500ms还没有发送成功,重新初始化设备
  526.                 {
  527.                         NRF24L01_Gpio_Init( );
  528.                         RF24L01_Init( );
  529.                         RF24L01_Set_Mode( MODE_TX );
  530.                         break;
  531.                 }
  532.         }
  533.         l_Status = NRF24L01_Read_Reg(STATUS);                                                //读状态寄存器
  534.         NRF24L01_Write_Reg( STATUS, l_Status );                                                //清除TX_DS或MAX_RT中断标志
  535.        
  536.         if( l_Status & MAX_TX )        //达到最大重发次数
  537.         {
  538.                 NRF24L01_Write_Reg( FLUSH_TX,0xff );        //清除TX FIFO寄存器
  539.                 return MAX_TX;
  540.         }
  541.         if( l_Status & TX_OK )        //发送完成
  542.         {
  543.                 return TX_OK;
  544.         }
  545.        
  546.         return 0xFF;        //其他原因发送失败
  547. }

  548. /**
  549.   * @brief :NRF24L01接收数据
  550.   * @param :
  551.   *                        @rxbuf:接收数据存放地址
  552.   * @note  :无
  553.   * @retval:接收的数据个数
  554.   */
  555. uint8_t NRF24L01_RxPacket( uint8_t *rxbuf )
  556. {
  557.         uint8_t l_Status = 0, l_RxLength = 0;
  558.        
  559.         RF24L01_SET_CS_LOW( );                //片选
  560.         drv_spi_read_write_byte( FLUSH_RX );
  561.         RF24L01_SET_CS_HIGH( );
  562.        
  563.   //无用
  564.         // while( 0 != RF24L01_GET_IRQ_STATUS( ))
  565.         // {
  566.         //         delay_ms( 100 );
  567.                
  568.         //         if( 30 == l_100MsTimes++ )                //3s没接收过数据,重新初始化模块
  569.         //         {
  570.         //                 NRF24L01_Gpio_Init( );
  571.         //                 RF24L01_Init( );
  572.         //                 RF24L01_Set_Mode( MODE_RX );
  573.   //     printf("init\r\n");
  574.         //                 break;
  575.         //         }
  576.         // }
  577.        
  578.         l_Status = NRF24L01_Read_Reg( STATUS );                //读状态寄存器
  579.         NRF24L01_Write_Reg( STATUS,l_Status );                //清中断标志
  580.         if( l_Status & RX_OK)        //接收到数据
  581.         {
  582.                 l_RxLength = NRF24L01_Read_Reg( R_RX_PL_WID );                //读取接收到的数据个数
  583.                 NRF24L01_Read_Buf( RD_RX_PLOAD,rxbuf,l_RxLength );        //接收到数据
  584.                 NRF24L01_Write_Reg( FLUSH_RX,0xff );                                //清除RX FIFO
  585.                 return l_RxLength;
  586.         }       
  587.        
  588.         return 0;                                //没有收到数据       
  589. }

  590. /**
  591.   * @brief :RF24L01引脚初始化
  592.   * @param :无
  593.   * @note  :无
  594.   * @retval:无
  595.   */

  596. void NRF24L01_Gpio_Init( void )
  597. {
  598.         GPIO_InitTypeDef        RF24L01_GpioInitStructer;
  599.   EXTI_InitTypeDef EXTI_InitStructure;
  600.   NVIC_InitTypeDef NVIC_InitStructure;
  601.        
  602.         RCC_APB2PeriphClockCmd( RF24L01_CE_GPIO_CLK | RF24L01_IRQ_GPIO_CLK, ENABLE );        //?? CE IRQ????  CS SCK MISO MOSI?SPI?????
  603.   //使能(打开)系统配置时钟
  604.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  605.        
  606.         //??CE?? ????
  607.         RF24L01_GpioInitStructer.GPIO_Mode = GPIO_Mode_OUT;
  608.         RF24L01_GpioInitStructer.GPIO_Speed = GPIO_Speed_100MHz;
  609.         RF24L01_GpioInitStructer.GPIO_Pin = RF24L01_CE_GPIO_PIN;
  610.         GPIO_Init( RF24L01_CE_GPIO_PORT, &RF24L01_GpioInitStructer );
  611.         //??
  612.         GPIO_SetBits( RF24L01_CE_GPIO_PORT, RF24L01_CE_GPIO_PIN);
  613.        
  614.         //??IRQ?? ????
  615.         RF24L01_GpioInitStructer.GPIO_Mode = GPIO_Mode_IN;
  616.         RF24L01_GpioInitStructer.GPIO_Speed = GPIO_Speed_100MHz;
  617.         RF24L01_GpioInitStructer.GPIO_Pin = RF24L01_IRQ_GPIO_PIN;
  618.         GPIO_Init( RF24L01_IRQ_GPIO_PORT, &RF24L01_GpioInitStructer );
  619.   //将Pb8和EXTI8连接在一起
  620.   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource8);
  621.   EXTI_InitStructure.EXTI_Line = EXTI_Line8;//外部中断4
  622.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断
  623.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 识别按键按下
  624.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打开(使能)
  625.   EXTI_Init(&EXTI_InitStructure);
  626.   //优先级配置
  627.   NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //外部中断4的请求通道
  628.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级0x02
  629.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                //响应优先级0x02
  630.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //使能(打开)该通道
  631.   NVIC_Init(&NVIC_InitStructure);
  632.         //??
  633.         GPIO_SetBits( RF24L01_IRQ_GPIO_PORT, RF24L01_IRQ_GPIO_PIN);
  634.        
  635.         RF24L01_SET_CE_LOW( );                //??24L01
  636.         RF24L01_SET_CS_HIGH( );                //??SPI??
  637. }

  638. /**
  639.   * @brief :RF24L01模块初始化
  640.   * @param :无
  641.   * @note  :无
  642.   * @retval:无
  643.   */
  644. void RF24L01_Init( void )
  645. {
  646.     uint8_t addr[5] = {INIT_ADDR};

  647.     RF24L01_SET_CE_HIGH( );
  648.     NRF24L01_Clear_IRQ_Flag( IRQ_ALL );
  649.     NRF24L01_Flush_Rx_Fifo();//清除接收缓冲区(复位时避免程序跑偏接收不到数据)
  650.     NRF24L01_Flush_Tx_Fifo();
  651. #if DYNAMIC_PACKET == 1

  652.     NRF24L01_Write_Reg( DYNPD, ( 1 << 0 ) );         //使能通道1动态数据长度
  653.     NRF24L01_Write_Reg( FEATRUE, 0x07 );
  654.     NRF24L01_Read_Reg( DYNPD );
  655.     NRF24L01_Read_Reg( FEATRUE );
  656.        
  657. #elif DYNAMIC_PACKET == 0
  658.    
  659.     L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN );        //固定数据长度
  660.        
  661. #endif        //DYNAMIC_PACKET

  662.     NRF24L01_Write_Reg( CONFIG, /*( 1<<MASK_RX_DR ) |*/                //接收中断
  663.                                       ( 1 << EN_CRC ) |     //使能CRC 1个字节
  664.                                       ( 1 << PWR_UP ) );    //开启设备
  665.     NRF24L01_Write_Reg( EN_AA, ( 1 << ENAA_P0 ) );                   //通道0自动应答
  666.     NRF24L01_Write_Reg( EN_RXADDR, ( 1 << ERX_P0 ) );                //通道0接收
  667.     NRF24L01_Write_Reg( SETUP_AW, AW_5BYTES );                             //地址宽度 5个字节
  668.     NRF24L01_Write_Reg( SETUP_RETR, ARD_4000US |
  669.                         ( REPEAT_CNT & 0x0F ) );                 //重复等待时间 250us
  670.     // NRF24L01_Write_Reg(STATUS,0X70);
  671.     NRF24L01_Write_Reg( RF_CH, 60 );                                     //初始化通道
  672.     NRF24L01_Write_Reg( RF_SETUP, 0x26 );
  673.     NRF24L01_Set_TxAddr( &addr[0], 5 );                      //设置TX地址
  674.     NRF24L01_Set_RxAddr( 0, &addr[0], 5 );                   //设置RX地址
  675. }
复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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