1.硬件知识
1.1 nRF24L01的引脚功能
(IO方向是相对模块而言的)
CE:Chip Enable,芯片使能,在发送和接收过程中都要将这个引脚拉高。
IRQ: 低电平触发,当状态寄存器中 TX_DS、RX_DR 或 MAX_RT 为高时触发中断,当 MCU 给中断源写 1 时,中断引脚被禁止。默认状态下所有的中断源是被禁止的。
1.2 通信条件
两个NRF24L01,收发双方需要满足4个条件:
1.发射接收频道相同(设置频道寄存器RF_CH 0-125)
2.发射接收地址相同(设置TX_ADDR和RX_ADDR_P0相同 5个8位地址 )
3.发射接收数据宽度相同(n<=32)
4.发射接收速率相同(250K 1M 2M)
1.2.1 传输协议如下
2.代码块
/*********************************************************************************************************
function:nRF24L01_TxPacket(unsigned char* rx_buf)
Description:发送 tx_buf 中数据,尽量配置一下TX_PLOAD_WIDTH,发送的长度,最高32字节,设置太高没必要后面都是0无效数据
Input:unsigned char* rx_buf 要发送的数据
Output:返回0x10 说明达到最发重发次数,返回0x20说明发送成功,返回0xFF说明发送错误
Return:
*********************************************************************************************************/
unsigned char NRF24L01_TxPacket(u8 *tx_buf)
{u8 sta; EXTI->IMR&=~(EXTI_Line8);//关闭中断NRF2401_CE_LOW; //只有在 CE=0 时才能对NRF24L01进行设置,否则易出现问题 SPI_Write_Buf(NRF24L01_WRITE_REG + RX_ADDR_P0,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH); //装载接收端地址SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); //装载数据,以及发送数据的长度//SPI_RW_Reg(NRF24L01_WRITE_REG + CONFIG, 0x0e); //IRQ收发完成中断响应,16位CRC,主发送NRF2401_CE_HIGH; //置高CE,激发数据发送Delay_us(10); //CE拉高后必须有一个10us以上的延时while(GPIO_ReadInputDataBit(NRF2401_IRQ_PORT,NRF2401_IRQ_PIN)); //发送完成IRQ会拉低,自动置高sta = SPI_Read(STATUS);SPI_RW_Reg(FLUSH_TX,0xff); //把TX_FIFO清空,就发一次SPI_RW_Reg(NRF24L01_WRITE_REG + STATUS, sta);if(sta&STATUS_MAX) //判断是否达到最大重发次数{SPI_RW_Reg(FLUSH_TX,0xff); //清除TX FIFO寄存器 EXTI->IMR|=EXTI_Line8;//打开中断return STATUS_MAX; //返回0x10}if(sta&STATUS_TX) //判断是否发送完成{EXTI->IMR|=EXTI_Line8;return STATUS_TX; //返回0x20 }EXTI->IMR|=EXTI_Line8;return 0xff; //发送失败,返回0xFF
}