久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1918|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

NRF24L01在STM32開發(fā)板燒錄或復(fù)位接收不到數(shù)據(jù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:932115 發(fā)表于 2022-3-11 22:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
NRF24L01在開發(fā)板燒錄或按下復(fù)位接收不到數(shù)據(jù),只有把模塊拔掉再插上才能正常接收,不然一直沒有反應(yīng)模塊檢測也能通過,大佬們這種情況怎么辦,下面是初始化代碼
  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();//清除接收緩沖區(qū)
  9. //DYNAMIC_PACKET      1
  10. #if DYNAMIC_PACKET == 1
  11.     //DYNPD   0x1c
  12.     NRF24L01_Write_Reg( DYNPD, ( 1 << 0 ) );         //使能通道1動態(tài)數(shù)據(jù)長度
  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//不執(zhí)行
  21.    
  22.     L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN );        //固定數(shù)據(jù)長度
  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個字節(jié)
  29.                                       ( 1 << PWR_UP ) );    //開啟設(shè)備
  30.     //EN_AA 0x01       ENAA_P0  0
  31.     NRF24L01_Write_Reg( EN_AA, ( 1 << ENAA_P0 ) );                   //通道0自動應(yīng)答
  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個字節(jié)
  36.     //SETUP_RETR  0x04    ARD_4000US (0x0F<<4)   REPEAT_CNT  15
  37.     NRF24L01_Write_Reg( SETUP_RETR, ARD_4000US |
  38.                         ( REPEAT_CNT & 0x0F ) );                 //重復(fù)等待時間 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 );                      //設(shè)置TX地址
  45.     NRF24L01_Set_RxAddr( 0, &addr[0], 5 );                   //設(shè)置RX地址
  46. }
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:932115 發(fā)表于 2022-3-11 23:01 | 只看該作者
開發(fā)板使用的是STM32F407VET6
回復(fù)

使用道具 舉報

板凳
ID:276663 發(fā)表于 2022-3-12 10:08 | 只看該作者
就這些代碼你讓看啥?
回復(fù)

使用道具 舉報

地板
ID:932115 發(fā)表于 2022-3-12 12:06 | 只看該作者
IdeaMing 發(fā)表于 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  :地址在設(shè)備中有效
  11.   * @retval:讀取的數(shù)據(jù)
  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 );                                //讀數(shù)據(jù)
  21.        
  22.     RF24L01_SET_CS_HIGH( );                        //取消片選
  23.        
  24.     return btmp;
  25. }

  26. /**
  27.   * @brief :NRF24L01讀指定長度的數(shù)據(jù)
  28.   * @param :
  29.   *                        @reg:地址
  30.   *                        @pBuf:數(shù)據(jù)存放地址
  31.   *                        @len:數(shù)據(jù)長度
  32.   * @note  :數(shù)據(jù)長度不超過255,地址在設(shè)備中有效
  33.   * @retval:讀取狀態(tài)
  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 );        //讀數(shù)據(jù)
  45.     }
  46.     RF24L01_SET_CS_HIGH( );                //取消片選
  47. }

  48. /**
  49.   * @brief :NRF24L01寫寄存器
  50.   * @param :無
  51.   * @note  :地址在設(shè)備中有效
  52.   * @retval:讀寫狀態(tài)
  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 );                        //寫數(shù)據(jù)
  60.        
  61.     RF24L01_SET_CS_HIGH( );                //取消片選
  62. }

  63. /**
  64.   * @brief :NRF24L01寫指定長度的數(shù)據(jù)
  65.   * @param :
  66.   *                        @reg:地址
  67.   *                        @pBuf:寫入的數(shù)據(jù)地址
  68.   *                        @len:數(shù)據(jù)長度
  69.   * @note  :數(shù)據(jù)長度不超過255,地址在設(shè)備中有效
  70.   * @retval:寫狀態(tài)
  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 ) );                //寫數(shù)據(jù)
  82.     }
  83.        
  84.     RF24L01_SET_CS_HIGH( );                //取消片選
  85. }

  86. /**
  87.   * @brief :清空TX緩沖區(qū)
  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緩沖區(qū)
  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 :重新使用上一包數(shù)據(jù)
  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讀狀態(tài)寄存器
  144.   * @param :無
  145.   * @note  :無
  146.   * @retval:RF24L01狀態(tài)
  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 );        //讀狀態(tài)寄存器
  155.        
  156.     RF24L01_SET_CS_HIGH( );                //取消片選
  157.        
  158.     return Status;
  159. }

  160. /**
  161.   * @brief :NRF24L01清中斷
  162.   * @param :
  163.            @IRQ_Source:中斷源
  164.   * @note  :無
  165.   * @retval:清除后狀態(tài)寄存器的值
  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 );        //中斷標(biāo)志處理
  171.     btmp = NRF24L01_Read_Status_Register( );                        //讀狀態(tài)寄存器
  172.                
  173.     RF24L01_SET_CS_LOW( );                        //片選
  174.     drv_spi_read_write_byte( NRF_WRITE_REG + STATUS );        //寫狀態(tài)寄存器命令
  175.     drv_spi_read_write_byte( IRQ_Source | btmp );                //清相應(yīng)中斷標(biāo)志
  176.     RF24L01_SET_CS_HIGH( );                        //取消片選
  177.        
  178.     return ( NRF24L01_Read_Status_Register( ));                        //返回狀態(tài)寄存器狀態(tài)
  179. }

  180. /**
  181.   * @brief :讀RF24L01中斷狀態(tài)
  182.   * @param :無
  183.   * @note  :無
  184.   * @retval:中斷狀態(tài)
  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 )));        //返回中斷狀態(tài)
  189. }

  190. /**
  191.   * @brief :讀FIFO中數(shù)據(jù)寬度
  192.   * @param :無
  193.   * @note  :無
  194.   * @retval:數(shù)據(jù)寬度
  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中數(shù)據(jù)寬度命令
  203.     btmp = drv_spi_read_write_byte( 0xFF );        //讀數(shù)據(jù)
  204.        
  205.     RF24L01_SET_CS_HIGH( );                //取消片選
  206.        
  207.     return btmp;
  208. }

  209. /**
  210.   * @brief :讀接收到的數(shù)據(jù)
  211.   * @param :無
  212.   * @note  :無
  213.   * @retval:
  214.            @pRxBuf:數(shù)據(jù)存放地址首地址
  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;        //讀接收狀態(tài)
  221.     Width = NRF24L01_Read_Top_Fifo_Width( );                //讀接收數(shù)據(jù)個數(shù)

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

  234. /**
  235.   * @brief :發(fā)送數(shù)據(jù)(帶應(yīng)答)
  236.   * @param :
  237.   *                        @pTxBuf:發(fā)送數(shù)據(jù)地址
  238.   *                        @len:長度
  239.   * @note  :一次不超過32個字節(jié)
  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;                //數(shù)據(jù)長達(dá)大約32 則只發(fā)送32個

  246.     NRF24L01_Flush_Tx_Fifo( );                //清TX FIFO
  247.        
  248.     RF24L01_SET_CS_LOW( );                        //片選
  249.     drv_spi_read_write_byte( WR_TX_PLOAD );        //發(fā)送命令
  250.        
  251.     for( btmp = 0; btmp < length; btmp ++ )
  252.     {
  253.         drv_spi_read_write_byte( *( pTxBuf + btmp ) );        //發(fā)送數(shù)據(jù)
  254.     }
  255.     RF24L01_SET_CS_HIGH( );                        //取消片選
  256. }

  257. /**
  258.   * @brief :發(fā)送數(shù)據(jù)(不帶應(yīng)答)
  259.   * @param :
  260.   *                        @pTxBuf:發(fā)送數(shù)據(jù)地址
  261.   *                        @len:長度
  262.   * @note  :一次不超過32個字節(jié)
  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 ;                //數(shù)據(jù)長度大于32 或者等于0 不執(zhí)行
  270.     }
  271.        
  272.     RF24L01_SET_CS_LOW( );        //片選
  273.     drv_spi_read_write_byte( WR_TX_PLOAD_NACK );        //發(fā)送命令
  274.     while( len-- )
  275.     {
  276.         drv_spi_read_write_byte( *pTxBuf );                        //發(fā)送數(shù)據(jù)
  277.                 pTxBuf++;
  278.     }
  279.     RF24L01_SET_CS_HIGH( );                //取消片選
  280. }

  281. /**
  282.   * @brief :在接收模式下向TX FIFO寫數(shù)據(jù)(帶ACK)
  283.   * @param :
  284.   *                        @pData:數(shù)據(jù)地址
  285.   *                        @len:長度
  286.   * @note  :一次不超過32個字節(jié)
  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;                //數(shù)據(jù)長度大于32個則只寫32個字節(jié)

  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 ) );        //寫數(shù)據(jù)
  299.     }
  300.     RF24L01_SET_CS_HIGH( );                        //取消片選
  301. }

  302. /**
  303.   * @brief :設(shè)置發(fā)送地址
  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個字節(jié)
  313.     NRF24L01_Write_Buf( TX_ADDR, pAddr, len );        //寫地址
  314. }

  315. /**
  316.   * @brief :設(shè)置接收通道地址
  317.   * @param :
  318.   *                        @PipeNum:通道
  319.   *                        @pAddr:地址存肥著地址
  320.   *                        @Len:長度
  321.   * @note  :通道不大于5 地址長度不大于5個字節(jié)
  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個字節(jié)

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

  330. /**
  331.   * @brief :設(shè)置通信速度
  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 :設(shè)置功率
  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 :設(shè)置頻率
  391.   * @param :
  392.   *                        @FreqPoint:頻率設(shè)置參數(shù)
  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  :循環(huán)
  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個字節(jié)的地址
  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循環(huán)檢測
  440. //   * @param :無
  441. //   * @note  :無限循環(huán)版
  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個字節(jié)的地址
  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 :設(shè)置模式
  476.   * @param :
  477.   *                        @Mode:模式發(fā)送模式或接收模式
  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發(fā)送一次數(shù)據(jù)
  501.   * @param :
  502.   *                        @txbuf:待發(fā)送數(shù)據(jù)首地址
  503.   *                        @Length:發(fā)送數(shù)據(jù)長度
  504.   * @note  :無
  505.   * @retval:
  506.   *                        MAX_TX:達(dá)到最大重發(fā)次數(shù)
  507.   *                        TX_OK:發(fā)送完成
  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 );        //寫數(shù)據(jù)到TX BUF 32字節(jié)  TX_PLOAD_WIDTH
  521.         RF24L01_SET_CE_HIGH( );                        //啟動發(fā)送
  522.         while( 0 != RF24L01_GET_IRQ_STATUS( ))
  523.         {
  524.                 delay_ms( 1 );
  525.                 if( 500 == l_MsTimes++ )                                                //500ms還沒有發(fā)送成功,重新初始化設(shè)備
  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);                                                //讀狀態(tài)寄存器
  534.         NRF24L01_Write_Reg( STATUS, l_Status );                                                //清除TX_DS或MAX_RT中斷標(biāo)志
  535.        
  536.         if( l_Status & MAX_TX )        //達(dá)到最大重發(fā)次數(shù)
  537.         {
  538.                 NRF24L01_Write_Reg( FLUSH_TX,0xff );        //清除TX FIFO寄存器
  539.                 return MAX_TX;
  540.         }
  541.         if( l_Status & TX_OK )        //發(fā)送完成
  542.         {
  543.                 return TX_OK;
  544.         }
  545.        
  546.         return 0xFF;        //其他原因發(fā)送失敗
  547. }

  548. /**
  549.   * @brief :NRF24L01接收數(shù)據(jù)
  550.   * @param :
  551.   *                        @rxbuf:接收數(shù)據(jù)存放地址
  552.   * @note  :無
  553.   * @retval:接收的數(shù)據(jù)個數(shù)
  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沒接收過數(shù)據(jù),重新初始化模塊
  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 );                //讀狀態(tài)寄存器
  579.         NRF24L01_Write_Reg( STATUS,l_Status );                //清中斷標(biāo)志
  580.         if( l_Status & RX_OK)        //接收到數(shù)據(jù)
  581.         {
  582.                 l_RxLength = NRF24L01_Read_Reg( R_RX_PL_WID );                //讀取接收到的數(shù)據(jù)個數(shù)
  583.                 NRF24L01_Read_Buf( RD_RX_PLOAD,rxbuf,l_RxLength );        //接收到數(shù)據(jù)
  584.                 NRF24L01_Write_Reg( FLUSH_RX,0xff );                                //清除RX FIFO
  585.                 return l_RxLength;
  586.         }       
  587.        
  588.         return 0;                                //沒有收到數(shù)據(jù)       
  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.   //使能(打開)系統(tǒng)配置時鐘
  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;//設(shè)置為中斷
  623.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā) 識別按鍵按下
  624.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打開(使能)
  625.   EXTI_Init(&EXTI_InitStructure);
  626.   //優(yōu)先級配置
  627.   NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //外部中斷4的請求通道
  628.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //搶占優(yōu)先級0x02
  629.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                //響應(yīng)優(yōu)先級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();//清除接收緩沖區(qū)(復(fù)位時避免程序跑偏接收不到數(shù)據(jù))
  650.     NRF24L01_Flush_Tx_Fifo();
  651. #if DYNAMIC_PACKET == 1

  652.     NRF24L01_Write_Reg( DYNPD, ( 1 << 0 ) );         //使能通道1動態(tài)數(shù)據(jù)長度
  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 );        //固定數(shù)據(jù)長度
  660.        
  661. #endif        //DYNAMIC_PACKET

  662.     NRF24L01_Write_Reg( CONFIG, /*( 1<<MASK_RX_DR ) |*/                //接收中斷
  663.                                       ( 1 << EN_CRC ) |     //使能CRC 1個字節(jié)
  664.                                       ( 1 << PWR_UP ) );    //開啟設(shè)備
  665.     NRF24L01_Write_Reg( EN_AA, ( 1 << ENAA_P0 ) );                   //通道0自動應(yīng)答
  666.     NRF24L01_Write_Reg( EN_RXADDR, ( 1 << ERX_P0 ) );                //通道0接收
  667.     NRF24L01_Write_Reg( SETUP_AW, AW_5BYTES );                             //地址寬度 5個字節(jié)
  668.     NRF24L01_Write_Reg( SETUP_RETR, ARD_4000US |
  669.                         ( REPEAT_CNT & 0x0F ) );                 //重復(fù)等待時間 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 );                      //設(shè)置TX地址
  674.     NRF24L01_Set_RxAddr( 0, &addr[0], 5 );                   //設(shè)置RX地址
  675. }
復(fù)制代碼
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: av日日操| 中文字幕一区二区三区四区 | 五月综合激情在线 | 成年视频在线观看 | 中文字幕精品一区久久久久 | 亚洲精品一区二 | 国产日韩一区二区 | 在线成人免费av | 亚洲精品综合 | a爱视频| 亚洲精品一区二区三区蜜桃久 | 精品国产乱码久久久久久88av | 久久久国产精品一区 | 日日夜夜影院 | 国产一级一级 | 久久久精品一区二区三区 | 久久新视频 | 亚洲精品国产成人 | 在线免费观看黄网 | 亚洲天堂二区 | www日本在线 | 国产一级电影在线 | 久久久久久久久久久一区二区 | 亚洲视频中文字幕 | 久久综合激情 | 一区二区中文字幕 | 中文字幕二区 | 久久成人国产精品 | 国精日本亚洲欧州国产中文久久 | 先锋资源网站 | 色资源在线 | 在线观看久草 | 中文字幕一区二区三区日韩精品 | 视频二区在线观看 | 91中文字幕在线 | 337p日本欧洲亚洲大胆鲁鲁 | 国产精品视频一二三区 | 99九色 | 亚洲精品久久久久中文字幕欢迎你 | 精品国产一区二区三区性色av | 黄免费观看 |