標題:
NRF24L01在STM32開發(fā)板燒錄或復位接收不到數據
[打印本頁]
作者:
今日綾波明天香
時間:
2022-3-11 22:59
標題:
NRF24L01在STM32開發(fā)板燒錄或復位接收不到數據
NRF24L01在開發(fā)板燒錄或按下復位接收不到數據,只有把模塊拔掉再插上才能正常接收,不然一直沒有反應模塊檢測也能通過,大佬們這種情況怎么辦,下面是初始化代碼
void RF24L01_Init( void )
{
uint8_t addr[5] = {INIT_ADDR};
RF24L01_SET_CE_HIGH( );//CE拉高
//IRQ_ALL ( (1<<RX_DR) | (1<<TX_DS) | (1<<MAX_RT) )
NRF24L01_Clear_IRQ_Flag( IRQ_ALL );
//0xE2 命令
NRF24L01_Flush_Rx_Fifo();//清除接收緩沖區(qū)
//DYNAMIC_PACKET 1
#if DYNAMIC_PACKET == 1
//DYNPD 0x1c
NRF24L01_Write_Reg( DYNPD, ( 1 << 0 ) ); //使能通道1動態(tài)數據長度
//FEATRUE 0x1d
NRF24L01_Write_Reg( FEATRUE, 0x07 );
//DYNPD 0x1c
NRF24L01_Read_Reg( DYNPD );
//FEATRUE 0x1d
NRF24L01_Read_Reg( FEATRUE );
#elif DYNAMIC_PACKET == 0//不執(zhí)行
L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN ); //固定數據長度
//DYNAMIC_PACKET 1
#endif //DYNAMIC_PACKET
// CONFIG 0x00 EN_CRC 3 PWR_UP 1
NRF24L01_Write_Reg( CONFIG, /*( 1<<MASK_RX_DR ) |*/ //接收中斷
( 1 << EN_CRC ) | //使能CRC 1個字節(jié)
( 1 << PWR_UP ) ); //開啟設備
//EN_AA 0x01 ENAA_P0 0
NRF24L01_Write_Reg( EN_AA, ( 1 << ENAA_P0 ) ); //通道0自動應答
//EN_RXADDR 0x02 ERX_P0 0
NRF24L01_Write_Reg( EN_RXADDR, ( 1 << ERX_P0 ) ); //通道0接收
//SETUP_AW 0x03 AW_5BYTES 0x3
NRF24L01_Write_Reg( SETUP_AW, AW_5BYTES ); //地址寬度 5個字節(jié)
//SETUP_RETR 0x04 ARD_4000US (0x0F<<4) REPEAT_CNT 15
NRF24L01_Write_Reg( SETUP_RETR, ARD_4000US |
( REPEAT_CNT & 0x0F ) ); //重復等待時間 250us
//RF_CH 0x05
NRF24L01_Write_Reg( RF_CH, 60 ); //初始化通道
//RF_SETUP 0x06
NRF24L01_Write_Reg( RF_SETUP, 0x26 );
//{0x34,0x43,0x10,0x10,0x01}
NRF24L01_Set_TxAddr( &addr[0], 5 ); //設置TX地址
NRF24L01_Set_RxAddr( 0, &addr[0], 5 ); //設置RX地址
}
復制代碼
作者:
今日綾波明天香
時間:
2022-3-11 23:01
開發(fā)板使用的是STM32F407VET6
作者:
IdeaMing
時間:
2022-3-12 10:08
就這些代碼你讓看啥?
作者:
今日綾波明天香
時間:
2022-3-12 12:06
IdeaMing 發(fā)表于 2022-3-12 10:08
就這些代碼你讓看啥?
大佬這是其他代碼
#include "stm32f4xx.h"
#include "nrf24l01.h"
#include "sys.h"
#include <stdio.h>
const char *g_ErrorString = "RF24L01 is not find !...";
/**
* @brief :NRF24L01讀寄存器
* @param :
@Addr:寄存器地址
* @note :地址在設備中有效
* @retval:讀取的數據
*/
uint8_t NRF24L01_Read_Reg( uint8_t RegAddr )
{
uint8_t btmp;
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( NRF_READ_REG | RegAddr ); //讀命令 地址
btmp = drv_spi_read_write_byte( 0xFF ); //讀數據
RF24L01_SET_CS_HIGH( ); //取消片選
return btmp;
}
/**
* @brief :NRF24L01讀指定長度的數據
* @param :
* @reg:地址
* @pBuf:數據存放地址
* @len:數據長度
* @note :數據長度不超過255,地址在設備中有效
* @retval:讀取狀態(tài)
*/
void NRF24L01_Read_Buf( uint8_t RegAddr, uint8_t *pBuf, uint8_t len )
{
uint8_t btmp;
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( NRF_READ_REG | RegAddr ); //讀命令 地址
for( btmp = 0; btmp < len; btmp ++ )
{
*( pBuf + btmp ) = drv_spi_read_write_byte( 0xFF ); //讀數據
}
RF24L01_SET_CS_HIGH( ); //取消片選
}
/**
* @brief :NRF24L01寫寄存器
* @param :無
* @note :地址在設備中有效
* @retval:讀寫狀態(tài)
*/
void NRF24L01_Write_Reg( uint8_t RegAddr, uint8_t Value )
{
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr ); //寫命令 地址
drv_spi_read_write_byte( Value ); //寫數據
RF24L01_SET_CS_HIGH( ); //取消片選
}
/**
* @brief :NRF24L01寫指定長度的數據
* @param :
* @reg:地址
* @pBuf:寫入的數據地址
* @len:數據長度
* @note :數據長度不超過255,地址在設備中有效
* @retval:寫狀態(tài)
*/
void NRF24L01_Write_Buf( uint8_t RegAddr, uint8_t *pBuf, uint8_t len )
{
uint8_t i;
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr ); //寫命令 地址
for( i = 0; i < len; i ++ )
{
drv_spi_read_write_byte( *( pBuf + i ) ); //寫數據
}
RF24L01_SET_CS_HIGH( ); //取消片選
}
/**
* @brief :清空TX緩沖區(qū)
* @param :無
* @note :無
* @retval:無
*/
void NRF24L01_Flush_Tx_Fifo ( void )
{
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( FLUSH_TX ); //清TX FIFO命令
RF24L01_SET_CS_HIGH( ); //取消片選
}
/**
* @brief :清空RX緩沖區(qū)
* @param :無
* @note :無
* @retval:無
*/
void NRF24L01_Flush_Rx_Fifo( void )
{
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( FLUSH_RX ); //清RX FIFO命令
RF24L01_SET_CS_HIGH( ); //取消片選
}
/**
* @brief :重新使用上一包數據
* @param :無
* @note :無
* @retval:無
*/
void NRF24L01_Reuse_Tx_Payload( void )
{
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( REUSE_TX_PL ); //重新使用上一包命令
RF24L01_SET_CS_HIGH( ); //取消片選
}
/**
* @brief :NRF24L01空操作
* @param :無
* @note :無
* @retval:無
*/
void NRF24L01_Nop( void )
{
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( NOP ); //空操作命令
RF24L01_SET_CS_HIGH( ); //取消片選
}
/**
* @brief :NRF24L01讀狀態(tài)寄存器
* @param :無
* @note :無
* @retval:RF24L01狀態(tài)
*/
uint8_t NRF24L01_Read_Status_Register( void )
{
uint8_t Status;
RF24L01_SET_CS_LOW( ); //片選
Status = drv_spi_read_write_byte( NRF_READ_REG + STATUS ); //讀狀態(tài)寄存器
RF24L01_SET_CS_HIGH( ); //取消片選
return Status;
}
/**
* @brief :NRF24L01清中斷
* @param :
@IRQ_Source:中斷源
* @note :無
* @retval:清除后狀態(tài)寄存器的值
*/
uint8_t NRF24L01_Clear_IRQ_Flag( uint8_t IRQ_Source )
{
uint8_t btmp = 0;
IRQ_Source &= ( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT ); //中斷標志處理
btmp = NRF24L01_Read_Status_Register( ); //讀狀態(tài)寄存器
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( NRF_WRITE_REG + STATUS ); //寫狀態(tài)寄存器命令
drv_spi_read_write_byte( IRQ_Source | btmp ); //清相應中斷標志
RF24L01_SET_CS_HIGH( ); //取消片選
return ( NRF24L01_Read_Status_Register( )); //返回狀態(tài)寄存器狀態(tài)
}
/**
* @brief :讀RF24L01中斷狀態(tài)
* @param :無
* @note :無
* @retval:中斷狀態(tài)
*/
uint8_t RF24L01_Read_IRQ_Status( void )
{
return ( NRF24L01_Read_Status_Register( ) & (( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT ))); //返回中斷狀態(tài)
}
/**
* @brief :讀FIFO中數據寬度
* @param :無
* @note :無
* @retval:數據寬度
*/
uint8_t NRF24L01_Read_Top_Fifo_Width( void )
{
uint8_t btmp;
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( R_RX_PL_WID ); //讀FIFO中數據寬度命令
btmp = drv_spi_read_write_byte( 0xFF ); //讀數據
RF24L01_SET_CS_HIGH( ); //取消片選
return btmp;
}
/**
* @brief :讀接收到的數據
* @param :無
* @note :無
* @retval:
@pRxBuf:數據存放地址首地址
*/
uint8_t NRF24L01_Read_Rx_Payload( uint8_t *pRxBuf )
{
uint8_t Width, PipeNum;
PipeNum = ( NRF24L01_Read_Reg( STATUS ) >> 1 ) & 0x07; //讀接收狀態(tài)
Width = NRF24L01_Read_Top_Fifo_Width( ); //讀接收數據個數
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( RD_RX_PLOAD ); //讀有效數據命令
for( PipeNum = 0; PipeNum < Width; PipeNum ++ )
{
*( pRxBuf + PipeNum ) = drv_spi_read_write_byte( 0xFF ); //讀數據
}
RF24L01_SET_CS_HIGH( ); //取消片選
NRF24L01_Flush_Rx_Fifo( ); //清空RX FIFO
return Width;
}
/**
* @brief :發(fā)送數據(帶應答)
* @param :
* @pTxBuf:發(fā)送數據地址
* @len:長度
* @note :一次不超過32個字節(jié)
* @retval:無
*/
void NRF24L01_Write_Tx_Payload_Ack( uint8_t *pTxBuf, uint8_t len )
{
uint8_t btmp;
uint8_t length = ( len > 32 ) ? 32 : len; //數據長達大約32 則只發(fā)送32個
NRF24L01_Flush_Tx_Fifo( ); //清TX FIFO
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( WR_TX_PLOAD ); //發(fā)送命令
for( btmp = 0; btmp < length; btmp ++ )
{
drv_spi_read_write_byte( *( pTxBuf + btmp ) ); //發(fā)送數據
}
RF24L01_SET_CS_HIGH( ); //取消片選
}
/**
* @brief :發(fā)送數據(不帶應答)
* @param :
* @pTxBuf:發(fā)送數據地址
* @len:長度
* @note :一次不超過32個字節(jié)
* @retval:無
*/
void NRF24L01_Write_Tx_Payload_NoAck( uint8_t *pTxBuf, uint8_t len )
{
if( len > 32 || len == 0 )
{
return ; //數據長度大于32 或者等于0 不執(zhí)行
}
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( WR_TX_PLOAD_NACK ); //發(fā)送命令
while( len-- )
{
drv_spi_read_write_byte( *pTxBuf ); //發(fā)送數據
pTxBuf++;
}
RF24L01_SET_CS_HIGH( ); //取消片選
}
/**
* @brief :在接收模式下向TX FIFO寫數據(帶ACK)
* @param :
* @pData:數據地址
* @len:長度
* @note :一次不超過32個字節(jié)
* @retval:無
*/
void NRF24L01_Write_Tx_Payload_InAck( uint8_t *pData, uint8_t len )
{
uint8_t btmp;
len = ( len > 32 ) ? 32 : len; //數據長度大于32個則只寫32個字節(jié)
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( W_ACK_PLOAD ); //命令
for( btmp = 0; btmp < len; btmp ++ )
{
drv_spi_read_write_byte( *( pData + btmp ) ); //寫數據
}
RF24L01_SET_CS_HIGH( ); //取消片選
}
/**
* @brief :設置發(fā)送地址
* @param :
* @pAddr:地址存放地址
* @len:長度
* @note :無
* @retval:無
*/
void NRF24L01_Set_TxAddr( uint8_t *pAddr, uint8_t len )
{
len = ( len > 5 ) ? 5 : len; //地址不能大于5個字節(jié)
NRF24L01_Write_Buf( TX_ADDR, pAddr, len ); //寫地址
}
/**
* @brief :設置接收通道地址
* @param :
* @PipeNum:通道
* @pAddr:地址存肥著地址
* @Len:長度
* @note :通道不大于5 地址長度不大于5個字節(jié)
* @retval:無
*/
void NRF24L01_Set_RxAddr( uint8_t PipeNum, uint8_t *pAddr, uint8_t Len )
{
Len = ( Len > 5 ) ? 5 : Len;
PipeNum = ( PipeNum > 5 ) ? 5 : PipeNum; //通道不大于5 地址長度不大于5個字節(jié)
NRF24L01_Write_Buf( RX_ADDR_P0 + PipeNum, pAddr, Len ); //寫入地址
}
/**
* @brief :設置通信速度
* @param :
* @Speed:速度
* @note :無
* @retval:無
*/
void NRF24L01_Set_Speed( nRf24l01SpeedType Speed )
{
uint8_t btmp = 0;
btmp = NRF24L01_Read_Reg( RF_SETUP );
btmp &= ~( ( 1<<5 ) | ( 1<<3 ) );
if( Speed == SPEED_250K ) //250K
{
btmp |= ( 1<<5 );
}
else if( Speed == SPEED_1M ) //1M
{
btmp &= ~( ( 1<<5 ) | ( 1<<3 ) );
}
else if( Speed == SPEED_2M ) //2M
{
btmp |= ( 1<<3 );
}
NRF24L01_Write_Reg( RF_SETUP, btmp );
}
/**
* @brief :設置功率
* @param :
* @Speed:速度
* @note :無
* @retval:無
*/
void NRF24L01_Set_Power( nRf24l01PowerType Power )
{
uint8_t btmp;
btmp = NRF24L01_Read_Reg( RF_SETUP ) & ~0x07;
switch( Power )
{
case POWER_F18DBM:
btmp |= PWR_18DB;
break;
case POWER_F12DBM:
btmp |= PWR_12DB;
break;
case POWER_F6DBM:
btmp |= PWR_6DB;
break;
case POWER_0DBM:
btmp |= PWR_0DB;
break;
default:
break;
}
NRF24L01_Write_Reg( RF_SETUP, btmp );
}
/**
* @brief :設置頻率
* @param :
* @FreqPoint:頻率設置參數
* @note :值不大于127
* @retval:無
*/
void RF24LL01_Write_Hopping_Point( uint8_t FreqPoint )
{
NRF24L01_Write_Reg( RF_CH, FreqPoint & 0x7F );
}
/**
* @brief :NRF24L01單次檢測
* @param printf_sw 串口是否打印連接失敗 1:是 0:否
* @note :循環(huán)
* @retval:0:連接成功 1:連接失敗
*/
uint8_t NRF24L01_check( uint8_t printf_sw )
{
uint8_t i;
uint8_t buf[5]={ 0XA5, 0XA5, 0XA5, 0XA5, 0XA5 };
uint8_t read_buf[ 5 ] = { 0 };
NRF24L01_Write_Buf( TX_ADDR, buf, 5 ); //寫入5個字節(jié)的地址
NRF24L01_Read_Buf( TX_ADDR, read_buf, 5 ); //讀出寫入的地址
for( i = 0; i < 5; i++ )
{
if( buf[ i ] != read_buf[ i ] )
{
break;
}
}
if( 5 == i )
{
return 0;
}
else
{
if(printf_sw)
{
// printf("RF24L01 is not find !...");
printf(g_ErrorString);
}
//===============================
// delay_ms(1500);//連接失敗延遲1.5s
//OLED_ShowString(0,3,(uint8_t *)g_ErrorString,8);
// printf("end\r\n");
return 1;
}
}
// /**
// * @brief :NRF24L01循環(huán)檢測
// * @param :無
// * @note :無限循環(huán)版
// * @retval:無
// */
// uint8_t NRF24L01_while_check( void )
// {
// uint8_t i;
// uint8_t buf[5]={ 0XA5, 0XA5, 0XA5, 0XA5, 0XA5 };
// uint8_t read_buf[ 5 ] = { 0 };
// while( 1 )
// {
// NRF24L01_Write_Buf( TX_ADDR, buf, 5 ); //寫入5個字節(jié)的地址
// NRF24L01_Read_Buf( TX_ADDR, read_buf, 5 ); //讀出寫入的地址
// for( i = 0; i < 5; i++ )
// {
// if( buf[ i ] != read_buf[ i ] )
// {
// break;
// }
// }
// if( 5 == i )
// {
// break;
// }
// else
// {
// printf(g_ErrorString);//===============================
// // OLED_ShowString(0,3,(uint8_t *)g_ErrorString,8);
// }
// delay_ms(1500);
// }
// }
/**
* @brief :設置模式
* @param :
* @Mode:模式發(fā)送模式或接收模式
* @note :無
* @retval:無
*/
void RF24L01_Set_Mode( nRf24l01ModeType Mode )
{
uint8_t controlreg = 0;
controlreg = NRF24L01_Read_Reg( CONFIG );
if( Mode == MODE_TX )
{
controlreg &= ~( 1<< PRIM_RX );
}
else
{
if( Mode == MODE_RX )
{
controlreg |= ( 1<< PRIM_RX );
}
}
NRF24L01_Write_Reg( CONFIG, controlreg );
}
/**
* @brief :NRF24L01發(fā)送一次數據
* @param :
* @txbuf:待發(fā)送數據首地址
* @Length:發(fā)送數據長度
* @note :無
* @retval:
* MAX_TX:達到最大重發(fā)次數
* TX_OK:發(fā)送完成
* 0xFF:其他原因
*/
uint8_t NRF24L01_TxPacket( uint8_t *txbuf, uint8_t Length )
{
uint8_t l_Status = 0;
uint16_t l_MsTimes = 0;
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( FLUSH_TX );
RF24L01_SET_CS_HIGH( );
RF24L01_SET_CE_LOW( );
NRF24L01_Write_Buf( WR_TX_PLOAD, txbuf, Length ); //寫數據到TX BUF 32字節(jié) TX_PLOAD_WIDTH
RF24L01_SET_CE_HIGH( ); //啟動發(fā)送
while( 0 != RF24L01_GET_IRQ_STATUS( ))
{
delay_ms( 1 );
if( 500 == l_MsTimes++ ) //500ms還沒有發(fā)送成功,重新初始化設備
{
NRF24L01_Gpio_Init( );
RF24L01_Init( );
RF24L01_Set_Mode( MODE_TX );
break;
}
}
l_Status = NRF24L01_Read_Reg(STATUS); //讀狀態(tài)寄存器
NRF24L01_Write_Reg( STATUS, l_Status ); //清除TX_DS或MAX_RT中斷標志
if( l_Status & MAX_TX ) //達到最大重發(fā)次數
{
NRF24L01_Write_Reg( FLUSH_TX,0xff ); //清除TX FIFO寄存器
return MAX_TX;
}
if( l_Status & TX_OK ) //發(fā)送完成
{
return TX_OK;
}
return 0xFF; //其他原因發(fā)送失敗
}
/**
* @brief :NRF24L01接收數據
* @param :
* @rxbuf:接收數據存放地址
* @note :無
* @retval:接收的數據個數
*/
uint8_t NRF24L01_RxPacket( uint8_t *rxbuf )
{
uint8_t l_Status = 0, l_RxLength = 0;
RF24L01_SET_CS_LOW( ); //片選
drv_spi_read_write_byte( FLUSH_RX );
RF24L01_SET_CS_HIGH( );
//無用
// while( 0 != RF24L01_GET_IRQ_STATUS( ))
// {
// delay_ms( 100 );
// if( 30 == l_100MsTimes++ ) //3s沒接收過數據,重新初始化模塊
// {
// NRF24L01_Gpio_Init( );
// RF24L01_Init( );
// RF24L01_Set_Mode( MODE_RX );
// printf("init\r\n");
// break;
// }
// }
l_Status = NRF24L01_Read_Reg( STATUS ); //讀狀態(tài)寄存器
NRF24L01_Write_Reg( STATUS,l_Status ); //清中斷標志
if( l_Status & RX_OK) //接收到數據
{
l_RxLength = NRF24L01_Read_Reg( R_RX_PL_WID ); //讀取接收到的數據個數
NRF24L01_Read_Buf( RD_RX_PLOAD,rxbuf,l_RxLength ); //接收到數據
NRF24L01_Write_Reg( FLUSH_RX,0xff ); //清除RX FIFO
return l_RxLength;
}
return 0; //沒有收到數據
}
/**
* @brief :RF24L01引腳初始化
* @param :無
* @note :無
* @retval:無
*/
void NRF24L01_Gpio_Init( void )
{
GPIO_InitTypeDef RF24L01_GpioInitStructer;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd( RF24L01_CE_GPIO_CLK | RF24L01_IRQ_GPIO_CLK, ENABLE ); //?? CE IRQ???? CS SCK MISO MOSI?SPI?????
//使能(打開)系統(tǒng)配置時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
//??CE?? ????
RF24L01_GpioInitStructer.GPIO_Mode = GPIO_Mode_OUT;
RF24L01_GpioInitStructer.GPIO_Speed = GPIO_Speed_100MHz;
RF24L01_GpioInitStructer.GPIO_Pin = RF24L01_CE_GPIO_PIN;
GPIO_Init( RF24L01_CE_GPIO_PORT, &RF24L01_GpioInitStructer );
//??
GPIO_SetBits( RF24L01_CE_GPIO_PORT, RF24L01_CE_GPIO_PIN);
//??IRQ?? ????
RF24L01_GpioInitStructer.GPIO_Mode = GPIO_Mode_IN;
RF24L01_GpioInitStructer.GPIO_Speed = GPIO_Speed_100MHz;
RF24L01_GpioInitStructer.GPIO_Pin = RF24L01_IRQ_GPIO_PIN;
GPIO_Init( RF24L01_IRQ_GPIO_PORT, &RF24L01_GpioInitStructer );
//將Pb8和EXTI8連接在一起
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource8);
EXTI_InitStructure.EXTI_Line = EXTI_Line8;//外部中斷4
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//設置為中斷
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā) 識別按鍵按下
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打開(使能)
EXTI_Init(&EXTI_InitStructure);
//優(yōu)先級配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //外部中斷4的請求通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級0x02
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //響應優(yōu)先級0x02
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能(打開)該通道
NVIC_Init(&NVIC_InitStructure);
//??
GPIO_SetBits( RF24L01_IRQ_GPIO_PORT, RF24L01_IRQ_GPIO_PIN);
RF24L01_SET_CE_LOW( ); //??24L01
RF24L01_SET_CS_HIGH( ); //??SPI??
}
/**
* @brief :RF24L01模塊初始化
* @param :無
* @note :無
* @retval:無
*/
void RF24L01_Init( void )
{
uint8_t addr[5] = {INIT_ADDR};
RF24L01_SET_CE_HIGH( );
NRF24L01_Clear_IRQ_Flag( IRQ_ALL );
NRF24L01_Flush_Rx_Fifo();//清除接收緩沖區(qū)(復位時避免程序跑偏接收不到數據)
NRF24L01_Flush_Tx_Fifo();
#if DYNAMIC_PACKET == 1
NRF24L01_Write_Reg( DYNPD, ( 1 << 0 ) ); //使能通道1動態(tài)數據長度
NRF24L01_Write_Reg( FEATRUE, 0x07 );
NRF24L01_Read_Reg( DYNPD );
NRF24L01_Read_Reg( FEATRUE );
#elif DYNAMIC_PACKET == 0
L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN ); //固定數據長度
#endif //DYNAMIC_PACKET
NRF24L01_Write_Reg( CONFIG, /*( 1<<MASK_RX_DR ) |*/ //接收中斷
( 1 << EN_CRC ) | //使能CRC 1個字節(jié)
( 1 << PWR_UP ) ); //開啟設備
NRF24L01_Write_Reg( EN_AA, ( 1 << ENAA_P0 ) ); //通道0自動應答
NRF24L01_Write_Reg( EN_RXADDR, ( 1 << ERX_P0 ) ); //通道0接收
NRF24L01_Write_Reg( SETUP_AW, AW_5BYTES ); //地址寬度 5個字節(jié)
NRF24L01_Write_Reg( SETUP_RETR, ARD_4000US |
( REPEAT_CNT & 0x0F ) ); //重復等待時間 250us
// NRF24L01_Write_Reg(STATUS,0X70);
NRF24L01_Write_Reg( RF_CH, 60 ); //初始化通道
NRF24L01_Write_Reg( RF_SETUP, 0x26 );
NRF24L01_Set_TxAddr( &addr[0], 5 ); //設置TX地址
NRF24L01_Set_RxAddr( 0, &addr[0], 5 ); //設置RX地址
}
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1