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进行显示就行.