本帖最后由 cry1109 于 2020-1-19 10:46 编辑
函数的封装比较全面,初始化配置、收/发模式的切换、数据的收发等等,使用起来就像串口一样简单。下面是部分代码:
/*-----------------------------------------------------------------------------
* 函 数 名 : Nrf_SendData()
* 函数功能 : 开启NRF发送一次数据
* 输 入 : txbuff:指向待发送的数据
length: 发送数据长度
* 输 出 : TX_OK :发送成功
0xff :发送失败
-----------------------------------------------------------------------------*/
uint8_t Nrf_SendData(uint8_t *txbuff,uint8_t length)
{
uint8_t status;
Nrf_CE(0);
Nrf_WriteBuff(WR_TX_PLOAD,txbuff,length);
Nrf_CE(1);
while(GPIO_ReadInputDataBit(NRF_IRQ_PORT, NRF_IRQ_PIN)!=0);//等待发送完成
status=Nrf_ReadReg(STATUS);
Nrf_WriteReg(NRF_WRITE_REG+STATUS,status); //清除TX_DS或MAX_RT中断标志
if(status&MAX_TX)//达到最大重发次数
{
Nrf_WriteReg(FLUSH_TX,0xff);//清除TX FIFO寄存器
return MAX_TX;
}
if(status&TX_OK)//发送完成
{
Nrf.TxOK = 1;
Nrf.LED = 1;
return TX_OK;
}
else
{
Nrf.TxOK = 0;
return TX_FAIL;//发送失败
}
}
/*-----------------------------------------------------------------------------
* 函 数 名 : Nrf_ReceiveData()
* 函数功能 : 读取NRF接收的数据
* 输 入 : rxbuff:缓存读取的数据
length: 读取的数据长度
* 输 出 : 1:接收到数据 0:无接收数据
-----------------------------------------------------------------------------*/
uint8_t Nrf_ReceiveData(uint8_t *rxbuff,uint8_t length)
{
uint8_t status;
status=Nrf_ReadReg(STATUS);
Nrf_WriteReg(NRF_WRITE_REG+STATUS,status); //清除TX_DS或MAX_RT中断标志
if(status&RX_OK)
{
Nrf_ReadBuff(RD_RX_PLOAD,rxbuff,length); //读取数据
Nrf_WriteReg(FLUSH_RX,0xff); //清除RX FIFO寄存器
Nrf.RxOK = 1;
Nrf.LED = 1;
return 1;
}
else
{
Nrf.RxOK = 0;
return 0; //没收到任何数据
}
}
马上就要过年啦,祝大家新年快乐,工作顺利!
|