NRF24L01模块STM32通信-发送端

前言

环境:接之前的两篇

芯片:STM32F103C8T6

Keil:V5.24.2.0


一、发射初始化

经过之前的验证,证明了硬件和基本的通信没问题,接下来进入发送端调试

发送初始化代码:

复制代码
void NRF24l01_tx_mode(void)
{
    NRF24L01_CE(0);
    NRF24l01_write_buf(NRF_WRITE_REG + TX_ADDR, (uint8_t *)TX_ADDRESS, TX_ADR_WIDTH);       /* 写TX节点地址 */
    NRF24l01_write_buf(NRF_WRITE_REG + RX_ADDR_P0, (uint8_t *)RX_ADDRESS, RX_ADR_WIDTH);    /* 设置RX节点地址,主要为了使能ACK */

    nrf24l01_write_reg(NRF_WRITE_REG + CONFIG, 0x0f);                                       /* 配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断 */
    nrf24l01_write_reg(NRF_WRITE_REG + RF_CH, 00);                                          /* 设置RF通道为00 */
	nrf24l01_write_reg(NRF_WRITE_REG + EN_AA, 0x01);
    nrf24l01_write_reg(NRF_WRITE_REG + RX_PW_P0, 32);                                        /* 使能通道0的自动应答 */
    nrf24l01_write_reg(NRF_WRITE_REG + EN_RXADDR, 0x01);                                    /* 使能通道0的接收地址 */
    nrf24l01_write_reg(NRF_WRITE_REG + SETUP_RETR, 0x1A);//1a                                   /* 设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 */

	nrf24l01_write_reg(FLUSH_RX, 0xFF);

    NRF24L01_CE(1);                                                                      /* CE为高,10us后启动发送 */

}

二、数据发送

1.发送的数据

uint8_t tx_Buf[32]={0x23,0x66,0x66,0x66,0x66,0x66};

这个数据可以随便设置,但是调试时尽量使用16进制.

2.发送的代码

复制代码
uint8_t NRF24l01_tx_packet(uint8_t *ptxbuf)
{
    uint8_t sta;
    uint8_t rval = 0XFF;
    
    NRF24l01_write_buf(WR_TX_PLOAD, ptxbuf, TX_PLOAD_WIDTH);    /* 写数据到TX BUF  TX_PLOAD_WIDTH个字节 */
	
	NRF24L01_CE(0);  
	nrf24l01_write_reg(NRF_WRITE_REG + CONFIG, 0x0e);  
    NRF24L01_CE(1);                                             /* 启动发送 */

    while (MySPI_Read_IRQ() != 0);                                  /* 等待发送完成 */


    sta = nrf24l01_read_reg(NRF_READ_REG + STATUS);                            /* 读取状态寄存器的值 */

    if (sta & MAX_TX)                                           /* 达到最大重发次数 */
    {
        nrf24l01_write_reg(FLUSH_TX, 0xff);                     /* 清除TX FIFO寄存器 */
		nrf24l01_write_reg(NRF_WRITE_REG + STATUS, sta);            /* 清除TX_DS或MAX_RT中断标志 */
        rval = 1;
    }

    if (sta & TX_OK)                                            /* 发送完成 */
    {
		nrf24l01_write_reg(NRF_WRITE_REG + STATUS, sta);            /* 清除TX_DS或MAX_RT中断标志 */
        rval = 0;                                               /* 标记发送成功 */
    }

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

3.结果的验证

复制代码
					if (NRF24l01_tx_packet(tx_Buf) == 0)   /* 发送成功 */
					{
						i++;
						OLED_ShowString(i, 10, "OK", OLED_6X8);
						GPIO_ResetBits(GPIOC, GPIO_Pin_13);
					}
					else
					{
						OLED_ShowString(70, 10, "NG", OLED_6X8);
						GPIO_SetBits(GPIOC, GPIO_Pin_13);
					}

验证逻辑简单,可以设置个LED进行显示就行.


总结

相关推荐
悟空胆好小34 分钟前
分音塔科技(BABEL Technology) 的公司背景、股权构成、产品类型及技术能力的全方位解读
网络·人工智能·科技·嵌入式硬件
Meraki.Zhang1 小时前
【STM32实践篇】:最小系统组成
stm32·单片机·嵌入式硬件·最小系统
Do vis8243 小时前
STM32第二十一天定时器TIM
stm32·单片机·嵌入式硬件
丁满与彭彭4 小时前
嵌入式学习笔记--MCU阶段--day03中断
笔记·单片机·学习
森焱森4 小时前
一文理解锂电池充电、过放修复与电量测量:从原理到实战
c语言·单片机·架构
逼子格5 小时前
滤波电路Multisim电路仿真实验汇总——硬件工程师笔记
笔记·嵌入式硬件·硬件工程·硬件工程师·硬件工程师真题·multisim电路仿真·滤波电路
熬夜的猪仔6 小时前
【Freertos实战】零基础制作基于stm32的物联网温湿度检测(教程非常简易)持续更新中.........
stm32·嵌入式硬件·物联网
景彡先生8 小时前
STM32中的RTC(实时时钟)详解
stm32·嵌入式硬件·实时音视频
EutoCool16 小时前
Qt:布局管理器Layout
开发语言·c++·windows·嵌入式硬件·qt·前端框架
网易独家音乐人Mike Zhou18 小时前
【Linux应用】开发板USB共享网络,网线或USB以太网共享网络(局域网连接PC和开发板,实现PC给开发板共享网络,USB通过NDIS驱动共享)
linux·网络·单片机·mcu·物联网·嵌入式·iot