前言
在调试接收端时,建议先看下下篇文章NRF24L01调试心得
环境:
芯片:STM32F103C8T6
Keil:V5.24.2.0
一、接收端初始化
void NRF24l01_rx_mode(void)
{
NRF24L01_CE(0);
NRF24l01_write_buf(NRF_WRITE_REG + TX_ADDR, (uint8_t *)TX_ADDRESS, RX_ADR_WIDTH); /* 写TX节点地址 */
NRF24l01_write_buf(NRF_WRITE_REG + RX_ADDR_P0, (uint8_t *)RX_ADDRESS, RX_ADR_WIDTH); /* 写RX节点地址 */
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 + RF_CH, 00); /* 设置RF通信频率 */
nrf24l01_write_reg(NRF_WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /* 选择通道0的有效数据宽度 */
nrf24l01_write_reg(NRF_WRITE_REG + RF_SETUP, 0x0f); /* 设置TX发射参数,0db增益,2Mbps */
nrf24l01_write_reg(NRF_WRITE_REG + CONFIG, 0x0f); /* 配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 */
NRF24L01_CE(1); /* CE为高,进入接收模式 */
}
二、接收端接收代码
1.接收代码
uint8_t NRF24l01_rx_packet(uint8_t *prxbuf)
{
uint8_t sta,sa;
uint8_t rval = 1;
sta = nrf24l01_read_reg(STATUS); /* 读取状态寄存器的值 */
nrf24l01_write_reg(NRF_WRITE_REG + STATUS, sta); /* 清除RX_OK中断标志 */
if (sta & RX_OK) /* 接收到数据 */
{
NRF24l01_read_buf(RD_RX_PLOAD, prxbuf, RX_PLOAD_WIDTH); /* 读取数据 */
nrf24l01_write_reg(FLUSH_RX, 0xff); /* 清除RX FIFO寄存器 */
Delay_us(150);
rval = 0; /* 标记接收完成 */
}
return rval; /* 返回结果 */
}
2.验证代码
while(1)
{
OLED_Clear();
if(1)
{
if (NRF24l01_rx_packet(Buf) == 0) /* 一旦接收到信息,则显示出来. */
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
OLED_ShowHexNum(1,0,Buf[0],2,OLED_6X8);
OLED_ShowHexNum(60,0,Buf[1],2,OLED_6X8);
OLED_ShowHexNum(1,20,Buf[2],2,OLED_6X8);
OLED_ShowHexNum(60,20,Buf[3],2,OLED_6X8);
OLED_ShowHexNum(1,40,Buf[4],2,OLED_6X8);
OLED_ShowHexNum(60,40,Buf[5],2,OLED_6X8);
}
else
{
OLED_ShowString(8, 18, "NGNG", OLED_6X8);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
}
OLED_ShowHexNum(60,40,Buf[5],2,OLED_6X8);
OLED_Update();
Delay_ms(500);
}
}
通发送端一样,也可以进行LED亮灭显示接收成功或失败