uint8 buffer[5]={0x00,0x00,0x00,0x00,0x00};
void main()
{
nrf2401_init();
NRF_SetRXMode();
while(1)
{
if(KEY_1==0)//有按键按下,则发送
{
x=1;
}while(!KEY_1);
if(x)
{
NRF_Write(buffer1,5);
while(NRF_CheckACK()); //发送数据后,检测是否发送完成后,检测不到发送完成TX_DS中断标志。
NRF_SetRXMode();x=0;
}
}
}
/**********************************************************************
函数功能:NRF应答信号检测(用于发射)
入口参数:无
返 回:无
备 注:无
**********************************************************************/
uint8 NRF_CheckACK()
{
sta=NRFReadReg(R_REGISTER+STATUS); //读取状态寄存器的值
if(TX_DS||MAX_RT) //发送完成中断或者发送次数过多失败中断
{
NRFWriteReg(W_REGISTER+STATUS,NRFReadReg(W_REGISTER+STATUS)|0x30); // 清除TX_DS或MAX_RT中断标志
CSN=0;
NRFSPI(FLUSH_TX);//用于清空FIFO
CSN=1;
return(0);
}
else
{ P36=~P36;
return(1);
}
}
/**********************************************************************
函数功能:NRF设置为接收模式
入口参数:无
返 回:无
备 注:无
**********************************************************************/
void NRF_SetRXMode()
{
CE_NRF2401=0;
NRFWriteReg(W_REGISTER+CONFIG,0x0f);//16位CRC校验使能、上电、接受模式 ,IRQ中断收发响应
CE_NRF2401=1;
delay(15);//保持10us秒以上
}
/**********************************************************************
函数功能:SPI初始化(最先设置NRF24L01为接受模式)
入口参数:无
返 回:无
备 注:无
**********************************************************************/
void nrf2401_init()
{
delay(12);//让系统什么都不干
CE_NRF2401=0;//确保nrf2401在待机模式1,(疑问,但是寄存器0x00的PWR_UP复位值为0,为掉电模式,原理上可以不写这条语句)
CSN=1; //SPI disable
SCK=0;
IRQ_NRF2401=1;//中断引脚拉高
NRFWriteReg(W_REGISTER+EN_AA,0X00); //关闭自动应答
NRFWriteReg(W_REGISTER+EN_RXADDR,0X00); //关闭通道接收
NRFWriteReg(W_REGISTER+RF_CH,0X00); //设置射频通道的运行频率 收发频率必须一致
NRFWriteReg(W_REGISTER+SETUP_RETR,0X00); //禁止自动重发
NRFWriteReg(W_REGISTER+RF_SETUP,0X07); //2Mbps,发射功率0dB,低噪声放大器
NRFWriteTxData(W_REGISTER+RX_ADDR_P1,RxAddr,RX_ADDR_WITDH); //写接收端地址,采用通道1作为模块的接受通道
NRFWriteReg(W_REGISTER+RX_PW_P1,RX_ADDR_WITDH); //接收通道1 数据宽度设置
CE_NRF2401=1;
delay(150);//保持10us秒以上
}
/**********************************************************************
函数功能:写数据
入口参数:无
返 回:无
备 注:无
**********************************************************************/
void NRF_Write(uint8* buffer,uint8 length)
{
//int8 i=0;
if(length>TX_DATA_WITDH)
length=TX_DATA_WITDH;
CE_NRF2401=0;
NRFWriteTxData(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+发送地址使能指令+发送地址+地址宽度
NRFWriteTxData(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同
NRFWriteTxData(W_TX_PAYLOAD,buffer,length);//写入数据
NRFWriteReg(W_REGISTER+CONFIG,0x0e); // CRC使能,16位CRC校验,上电 //发送模式
CE_NRF2401=1;
delay(5);//保持10us秒以上
} |