Skip to content

2.4G通信nrf24l01

低功耗芯片, 使用SPI进行通信

image-20240106123415250

https://gitee.com/alicedodo/nRF24L01P_internals/wikis/

引脚

image-20240106123913552

时序

image-20240106124141785

image-20240106124302771

image-20240106124420968

image-20240106124441711

命令

image-20240106124741829

工作模式

image-20240106125132236

image-20240106125359483

image-20240106134836268

寄存器

image-20240106140539647

image-20240106141035217

MASK_RX_DR: 接收中断

MASK_TX_DS: 发送中断, 发送完并且接收到回应

MASK_MAX_RT: 最大重发次数中断

image-20240106151840840

image-20240106151902910

image-20240106151931140

image-20240106152038757

image-20240106152109264

image-20240106152227088

image-20240106152336751

image-20240106152633706

实际使用

image-20240106134943496

image-20240106135330011

c
//初始化
void nrf24l01_tx_mode( void )
{	
	NRF24L01_CE ( 0 );
	
	/*  发去哪里? */	
    	nrf24l01_write_buf ( NRF_WRITE_REG + TX_ADDR, (uint8_t *)TX_ADDRESS, TX_ADR_WIDTH );
	/*  哪里接收应答信号? */
	nrf24l01_write_reg ( NRF_WRITE_REG + RX_ADDR_P0, (uint8_t *)TX_ADDRESS, TX_ADR_WIDTH ); 
	nrf24l01_write_reg ( NRF_WRITE_REG + EN_AA, 0x01);		/* 使能通道0的自动应答 */ 
	nrf24l01_write_reg ( NRF_WRITE_REG + EN_RXADDR, 0x01);	/* 使能通道0的接收地址 */ 
	/*  发送失败如何处理? */
	nrf24l01_write_reg ( NRF_WRITE_REG + SETUP_RETR, 0x1a);	/* 设置自动重发间隔时间 */ 
	/*  无线条件怎么样?*/
	nrf24l01_write_reg ( NRF_WRITE_REG + RF_CH, 0x01); 		/* 设置RF通信频率 */ 
	nrf24l01_write_reg ( NRF_WRITE_REG + RF_SETUP, 0x01); 	/* 设置TX发射参数 */
	/*  如何配置身份?*/
	nrf24l01_write_reg ( NRF_WRITE_REG + CONFIG, 0x0e);		/* 配置基本工作模式参数 */ 

    NRF24L01_CE ( 1 );			
}
c
//发送数据
uint8_t nrf24l01_tx_packet(uint8_t *ptxbuf)
{	
    	uint8_t sta, rval = 0xff;

	NRF24L01_CE ( 0 );			
    nrf24l01_write_buf ( WR_TX_PLOAD, ptxbuf, TX_PLOAD_WIDTH );	/* 写数据到TX_FIFO */
    NRF24L01_CE ( 1 );			/* 启动传输 */

	while (NRF24L01_IRQ != 0);

	sta = nrf24l01_read_reg(STATUS);					 /* 读取状态寄存器的值 */
	nrf24l01_write_reg(NRF_WRITE_REG + STATUS, sta);	 /* 清除TX_DS或MAX_RT中断标记 */

 	if ( sta & MAX_TX) { 	 /* 达到最大重发次数 */
		nrf24l01_write_reg(FLUSH_TX, 0xff);	//清除FIFO
		rval = 1;	
	}	
	if ( sta & TX_OK)		rval = 0;	/* 发送完成 */

    	return rval;		/* 返回结果*/
}

image-20240106140119182

image-20240106140204830

c
//配置接收模式
void nrf24l01_rx_mode( void )
{	
	NRF24L01_CE ( 0 );
	
	/*  接收谁的数据 */	
    nrf24l01_write_buf ( NRF_WRITE_REG + RX_ADDR_P0, (uint8_t *)RX_ADDRESS, RX_ADR_WIDTH );
    nrf24l01_write_reg ( NRF_WRITE_REG + EN_RX_ADDR, 0x01); 	/* 使能通道0的接收地址 */ 
	nrf24l01_write_reg ( NRF_WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); 	/* 选择通道0的有效数据宽度 */ 

	/*  如何发送应答信号? */
	nrf24l01_write_reg ( NRF_WRITE_REG + EN_AA, 0x01);		/* 使能通道0的自动应答 */ 

	/*  无线条件怎么样?*/
	nrf24l01_write_reg ( NRF_WRITE_REG + RF_CH, 0x01); 		/* 设置RF通信频率 */ 
	nrf24l01_write_reg ( NRF_WRITE_REG + RF_SETUP, 0x01);	/* 设置TX发射参数 */

	/*  如何配置身份?*/
	nrf24l01_write_reg ( NRF_WRITE_REG + CONFIG, 0x0f); 		/* 配置基本工作模式参数 */

    	NRF24L01_CE ( 1 );			
}
c
//接收数据
uint8_t nrf24l01_rx_packet(uint8_t *prxbuf)		 /* return 0:succeed	1:fail */
{	
    	uint8_t sta, rval = 1;

	sta = nrf24l01_read_reg(STATUS);					 /* 读取状态寄存器的值 */
	nrf24l01_write_reg(NRF_WRITE_REG + STATUS, sta);	 /* 清除RX_DS标记 */

 	if ( sta & RX_OK)	 	/* 接收到数据 */
	{ 	 		
		nrf24l01_read_buf(RD_RX_PLOAD, prxbuf, RX_PLOAD_WIDTH); 	/* 读取数据 */
		nrf24l01_write_reg(FLUSH_RX, 0xff);	 /* 清除RX_FIFO */
		rval = 0;	
	}	

    	return rval;		/* 返回结果*/
}