#include "pro_hal.h"
#include "pro_data.h"
#include "Pro_interface.h"
#include "timer.h"
#include "usart.h"
#include "bsp.h"
#include "aes.h"

void NRF_Config(const u8 *addr,const u8 channel)
{
	NRF_GPIO_Init();
	NRF_EXTIX_Init();
	TranFinish_flag=FALSE;
	Timeout=FALSE;
	NRF_CE = 0;
	NRF_PowerDown();//掉电模式
	NRF_WriteReg(EN_AA, 0x01);//使能通道0自动应答
//	NRF_WriteReg(EN_RXADDR, 0x3f);//使能所有通道的接收地址 
	NRF_WriteReg(EN_RXADDR, 0x03);//使能0,1的接收地址 
	NRF_WriteReg(SETUP_RETR, 0x71);//等待2000us,重发1次(250Kbps=2000us)
	NRF_WriteReg(SETUP_AW, 0x03);//地址宽度5
	NRF_WriteReg(RF_SETUP, 0x27);//设置TX发射参数,0db增益,250Kbps,低噪声增益开启
//	NRF_WriteReg(RF_SETUP, 0x21);//设置TX发射参数,250Kbps,-18db增益,低噪声增益开启
	NRF_WriteReg(STATUS, IRQ_ALL);//清除状态标志
	NRF_ReadReg(FLUSH_RX);//清接收FIFO
	NRF_ReadReg(FLUSH_TX);//清发送FIFO
	if((!NRF_ReadReg(FEATRUE))&&(!NRF_ReadReg(DYNPD)))
	{
		SPI_ReadWriteByte(ACTIVATE);
		SPI_ReadWriteByte(0x73);//激活R_RX_PL_WID,W_ACK_PAYLOAD,W_TX_PAYLOAD_NOACK
	}
	NRF_WriteReg(DYNPD, 0x3f);//所有通道使能动态长度
	NRF_WriteReg(FEATRUE, 0x06);//使能动态长度,使能数据应答
	NRF_WriteBuf(RX_ADDR_P0, addr, MAC_LEN);//写通道0,RX地址
	NRF_DelayUs(2000);//掉电模式->接收模式前必须经过1.5ms的待机模式
	NRF_RxMode(addr, channel);//初始化为接收模式
	NRF_DelayUs(150);//待机模式->发送/接收模式130us
}

u8 NRF_Check(void)
{
	u8 buf[5]={0X95,0X94,0X93,0X92,0X91};
	u8 i;
		 
	NRF_WriteBuf(TX_ADDR,buf,5);//写入5个字节的地址.	
	NRF_ReadBuf(TX_ADDR,buf,5); //读出写入的地址  
	for(i=0;i<5;i++)
	{
		if(buf[i]!=0X95-i)
			break;	
	}		
	if(i!=5)
		return FALSE;	//检测24L01错误	
	return TRUE;		//检测到24L01
}

u8 NRF_CheckReg(void)
{
	if(NRF_ReadReg(CONFIG)!=0x0b) 
		return FALSE;
	if(NRF_ReadReg(EN_AA)!=0x01) 
		return FALSE;
	if(NRF_ReadReg(EN_RXADDR)!=0x03) 
		return FALSE;
	if(NRF_ReadReg(SETUP_AW)!=0x03) 
		return FALSE;
	if(NRF_ReadReg(SETUP_RETR)!=0x71) 
		return FALSE;
	if(NRF_ReadReg(RF_SETUP)!=0x27) 
		return FALSE;
	if(NRF_ReadReg(STATUS)!=0x0e) 
		return FALSE;
	if(NRF_ReadReg(FIFO_STATUS)!=0x11) 
		return FALSE;
	return TRUE;
}

//void NRF_SetPipe1To4Mac(const u8 *addr)
//{
//	NRF_CE = 0;
//	NRF_WriteBuf(RX_ADDR_P1, addr, MAC_LEN);//写通道1,RX地址
//	NRF_WriteReg(RX_ADDR_P2, addr[0]-1);//写通道2,RX地址
//	NRF_WriteReg(RX_ADDR_P3, addr[0]-2);//写通道3,RX地址
//	NRF_WriteReg(RX_ADDR_P4, addr[0]-3);//写通道4,RX地址
//	NRF_WriteReg(CONFIG, 0x0B);//接收模式
//	NRF_CE = 1;
//}

u8 NRF_SetRfPower(const u8 level)//(0-3)
{
	u8 state,power;
	
	if(level<4)
	{
		NRF_CE = 0;
		power=level;
		state=NRF_ReadReg(RF_SETUP);//读参数
		state&=0XF9;//清power位(B11111001)
		power&=0x03;//设置power(B00000011)
		NRF_WriteReg(RF_SETUP, state|(power<<1));//设置power位
		return state;
	}
	return FALSE;
}

u8 NRF_ReadChannel(void)
{
	return NRF_ReadReg(RF_CH);//读频道
}

void NRF_SetChannel(const u8 channel)
{
	if(channel<126)
	{
		//NRF_CE = 0;
		NRF_WriteReg(RF_CH, channel);//设置RF通信频率
	}
}

//检测当前频点的外部环境信号强度
u8 NRF_DisturbanceDetect(void)
{
	NRF_CE = 0;
	NRF_DelayUs(1);
	NRF_WriteReg(CONFIG, 0x0B);//RCRC:8,接收模式
	NRF_CE = 1;
	NRF_DelayUs(200);//待机模式->接收模式(130us)+40us
	return NRF_ReadReg(CD);
}

//发送数据
u8 NRF_SendPayload(const u8 ack,const u8 *addr,const u8 channel,const u8 *buf)
{
	u16 i=1;
	u8 k;
	
	printf("MAC:");
	for(k=0;k<MAC_LEN;k++)
	{
		printf("%02X ",addr[k]);
	}
	printf("\r\n");
	
	NRF_CE = 0;
	NRF_WriteBuf(TX_ADDR, addr, MAC_LEN);//写TX节点地址
	if(ack)
	{
		NRF_WriteBuf(RX_ADDR_P0, addr, MAC_LEN);//写通道0,RX地址
	}
	NRF_WriteReg(RF_CH, channel);//设置RF通信频率
	NRF_WriteReg(STATUS, IRQ_ALL);//清除状态标志
	NRF_ReadReg(FLUSH_RX);//清接收FIFO
	NRF_ReadReg(FLUSH_TX);//清发送FIFO
	NRF_WriteBuf(W_TX_PAYLOAD, buf, PAYLOAD_LEN);
	NRF_WriteReg(CONFIG, 0x0A);//RX_DR,TX_DS,MAX_RT中断使能,CRC:8,POWER_UP,发送模式
	NRF_CE = 1;//设置CE为高启动发射,CE高电平持续时间最小为10us
	NRF_DelayUs(10);
	while(i++)
	{
		if(TranFinish_flag)
		{
			TranFinish_flag = FALSE;
			return TRUE;
		}
		if(Timeout)
		{
			Timeout = FALSE;
			return FALSE;
		}
	}
	NRF_ReadReg(FLUSH_TX);//清发送FIFO
	NRF_WriteReg(STATUS, IRQ_ALL);//清除状态标志
	return FALSE;
}

//接收模式
void NRF_RxMode(const u8 *addr,const u8 channel)
{
	NRF_CE = 0;
	NRF_WriteBuf(RX_ADDR_P0, addr, MAC_LEN);//写RX节点地址
	NRF_WriteReg(RF_CH, channel);//设置RF通信频率
	NRF_ReadReg(FLUSH_RX);//清接收FIFO
	NRF_WriteReg(CONFIG, 0x0B);//RX_DR,TX_DS,MAX_RT中断使能,CRC:8,POWER_UP,接收模式
	NRF_CE = 1;//CE为高,进入接收模式
}

void NRF_PowerDown(void)
{
	NRF_CE = 0;
	NRF_WriteReg(CONFIG, 0x79);//RX_DR,TX_DS,MAX_RT中断屏蔽,CRC:8,POWER_DOWN,接收模式
}

//void NRF_DelayUs(u16 i)
//{
//	u16 k,j;
//	for(k=0;k<i;k++)
//	{
//		for(j=0;j<9;j++);
//	}
//}
