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
}