#ifndef __NRF24L01_H_
#define __NRF24L01_H_
#include "Common.h"
#include "Delay.h"

#define BK2423 0	//若使用BK2423使能,否则置0

//NRF24L01引脚定义
#define NRF_CE          P11
#define NRF_CSN         P15
#define NRF_SCK         P10
#define NRF_MOSI        P00
#define NRF_MISO        P01
#define NRF_IRQ         P03
#define TR_ADDR_B1		'@'
#define TR_ADDR_B2		'H'
#define TR_ADDR_B3		'J'
#define TR_ADDR_B4		'Q'
//*********************************************NRF24L01***********************************************************
#define NRF24L01_CH_NUM_MAX		(5)			//0-5通道
#define NRF24L01_ADR_LEN        (5)   		//NRF24L01收发地址宽度
#define NRF24L01_TX_PLOAD_LEN   (32)  		//uints TX payload
#define NRF24L01_RX_PLOAD_LEN   (32)  		//uints RX payload
#define	NRF24L01_MODE_RX		(1<<7)
#define	NRF24L01_BUSY			(1<<6)
#define	NRF24L01_TX_ACCESS		(1<<5)
#define	NRF24L01_CHECK			(1<<4)
#define	NRF24L01_RECIVE			(1<<3)
#define NRF24L01_AUTO_ACK		(1<<2)
#define NRF24L01_AUTO_RX		(1<<1)
extern	unsigned char RF_CH;				//RF频道
extern	unsigned char RF_C_NUM;				//RF通道
extern	unsigned char NRF24L01_FLAG;		//NRF24L01当前状态标志
extern	unsigned char TX_ADDRESS[NRF24L01_ADR_LEN];	//本地地址
extern	unsigned char RX_ADDRESS[NRF24L01_ADR_LEN];	//接收地址
extern	unsigned char DYNPD_LEN;			//用于存放动态数据包长度
//***************************************NRF24L01寄存器指令*******************************************************
#define ACTIVATE_CMD			 0x50		//写入0x73激活R_RX_PL_WID,W_ACK_PAYLOAD,W_TX_PAYLOAD_NOACK寄存器,在次写入禁用.只能在省电模式和掉电模式执行
#define W_TX_PAYLOAD_NOACK_CMD	 0xb0		//应用于发送模式，无需应答，需要将EN_DYN_ACK置1有效
#define W_ACK_PAYLOAD_CMD		 0xa8		//适用于接收方，通过PIPE PPP将数据通过ACK形式发送，最多允许三帧数据存在于FIFO
#define R_RX_PL_WID_CMD			 0x60		//读接收到的动态数据包长度（大于32清空RX_FIFO）
#define NRF24L01_READ_REG        0x00  	   	// 读寄存器指令000x xxxx (0x00~0x1F)
#define NRF24L01_WRITE_REG       0x20 	   	// 写寄存器指令001x xxxx
#define NRF24L01_RD_RX_PLOAD     0x61  	   	// 读取接收数据指令
#define NRF24L01_WR_TX_PLOAD     0xA0  	   	// 写待发数据指令
#define NRF24L01_FLUSE_TX        0xE1 	   	// 清除TX FIFO中的数据，应用与发射模式下
#define NRF24L01_FLUSE_RX        0xE2  	   	// 清除RX FIFO中的数据，应用与接收模式下
#define NRF24L01_REUSE_TX_PL     0xE3  	   	// 定义重复装载数据指令
#define NRF24L01_NOP             0xFF  	   	// 无操作，用于读取STATUS寄存器
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define NRF24L01_CONFIG          0x00     	// 配置收发状态，CRC校验模式以及收发状态响应方式
//bit0:1接收模式,0发射模式;
//bit1:1上电 2掉电;
//bit2:CRC模式; 0八位CRC 1 16位CRC
//bit3:CRC使能;1使能 0不使能(若是使能自动应答,这一位必须为高)
//bit4 可屏蔽中断 MAX_RT 1 屏蔽 0不屏蔽 发生中断IRQ为低电平(最大重发中断)
//bit5 可屏蔽中断TX_DS 1屏蔽 0不 数据发送完成并收到应答
//bit6 可屏蔽中断RX_DR 接收数据完成 1屏蔽 0不屏蔽
//bit7 默认为0

#define NRF24L01_EN_AA           0x01       // 自动应答功能设置
//bit0~5,使能自动应答功能 (自动应答必然启动CRC)对应通道0~5

#define NRF24L01_EN_RXADDR       0x02       // 可用信道设置
//bit0~5,接收数据通道允许,对应通道0~5

#define NRF24L01_SETUP_AW        0x03       // 收发地址宽度设置
//bit1,0:设置地址宽度(所有数据通道) 01,3字节; 10,4字节; 11,5字节;(默认11)

#define NRF24L01_SETUP_RETR      0x04       // 自动重发功能设置
//bit3:0,自动重发计数器;0000 15次
//bit7:4,自动重发延时 0000 250*x+86us

#define NRF24L01_RF_CH           0x05       // 工作频率设置
//bit6:0,工作通道频率

#define NRF24L01_RF_SETUP        0x06       // 发射速率、功耗功能设置
//bit4: pll lock允许,仅用于测试模式,应当为1
//bit3: 传输速率(0:1Mbps,1:2Mbps);
//bit2:1,发射功率 11 0dbm;
//bit0:低噪声放大器增益

#define NRF24L01_STATUS          0x07       // 状态寄存器
//bit0:TX FIFO满标志;
//bit3:1,接收数据通道号(最大:6);接收到数据的通道号码
//bit4,达到最多次重发 max_rt中断
//bit5:数据发送完成中断;写1清除中断
//bit6:接收数据中断; 写1清除中断

#define NRF24L01_OBSERVE_TX      0x08       // 发送监测功能
//bit7:4,数据包丢失计数器;
//bit3:0,重发计数器

#define NRF24L01_CD              0x09       // 地址检测        
//bit0,载波检测;

#define NRF24L01_RX_ADDR_P0      0x0A       // 频道0接收数据地址
//最大长度5个字节,低字节在前
#define NRF24L01_RX_ADDR_P1      0x0B       // 频道1接收数据地址
//最大长度5个字节,低字节在前
#define NRF24L01_RX_ADDR_P2      0x0C       // 频道2接收数据地址
//最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define NRF24L01_RX_ADDR_P3      0x0D       // 频道3接收数据地址
//最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define NRF24L01_RX_ADDR_P4      0x0E       // 频道4接收数据地址
//最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define NRF24L01_RX_ADDR_P5      0x0F       // 频道5接收数据地址
//最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define NRF24L01_TX_ADDR         0x10       // 发送地址寄存器
//发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等
#define NRF24L01_RX_PW_P0        0x11       // 接收频道0接收数据长度
//有效数据宽度(1~32字节),设置为0则非法
#define NRF24L01_RX_PW_P1        0x12       // 接收频道1接收数据长度
//有效数据宽度(1~32字节),设置为0则非法
#define NRF24L01_RX_PW_P2        0x13       // 接收频道2接收数据长度
//有效数据宽度(1~32字节),设置为0则非法
#define NRF24L01_RX_PW_P3        0x14       // 接收频道3接收数据长度
//有效数据宽度(1~32字节),设置为0则非法
#define NRF24L01_RX_PW_P4        0x15       // 接收频道4接收数据长度
//有效数据宽度(1~32字节),设置为0则非法
#define NRF24L01_RX_PW_P5        0x16       // 接收频道5接收数据长度
//有效数据宽度(1~32字节),设置为0则非法
#define NRF24L01_FIFO_STATUS     0x17       // FIFO栈入栈出状态寄存器设置
//FIFO状态寄存器;
//bit0,RX FIFO寄存器空标志;
//bit1,RX FIFO满标志;
//bit2,3,保留
//bit4,TX FIFO空标志;
//bit5,TX FIFO满标志;
//bit6,1,循环发送上一数据包.0,不循环;
#define NRF24L01_DYNPD			 0x1C		//启用动态数据长度
//bit5:0, 5~0通道动态使能
#define NRF24L01_FEATURE		 0x1D		//特征寄存器
//bit0,启用动态长度;
//bit1,使能数据ACK;
//bit2,使能发送NOACK
//*****************************************************************************************************************
//NRF24L01状态寄存器值
#define NRF24L01_STATUS_TX_FULL   0x01 		//TX FIFO 寄存器满标志。 1 为 满，0为 不满
#define NRF24L01_STATUS_MAX_RT    0x10 		//达到最大重发状态
#define NRF24L01_STATUS_TX_DS     0x20 		//发送完成中断标志位
#define NRF24L01_STATUS_RX_DR     0x40 		//接收到数据中断标志位
#define	NRF24L01_STATUS_RX_FULL   0x02		//RX FIFO寄存器满标志 1 为 满，0为 不满


unsigned char SPI_WriteRead ( unsigned char byte );	//向从机发送一个字节数据并返回接收数据
unsigned char NRF24L01_Write_Reg ( unsigned char reg, unsigned char value );	//写NRF24L01寄存器，返回状态值
unsigned char NRF24L01_Read_Reg ( unsigned char reg );		//读NRF24L01寄存器，返回寄存器值
void NRF24L01_Read_Buf ( unsigned char reg, unsigned char *pBuf, unsigned char bytes );	//读取缓冲区数据
unsigned char NRF24L01_Write_Buf ( unsigned char reg, unsigned char *pBuf, unsigned char bytes );	//向缓冲区写入数据
void NRF24L01_Init ( void );	//NRF24L01初始化函数
void NRF24L01_TxMode ( void );	//NRF24L01进入发送模式
void NRF24L01_RxMode ( void );	//NRF24L01进入接收模式
void NRF24L01_SendFrame ( unsigned char *temp, unsigned char len );	//NRF24L01发送数据
void NRF24L01_RecvFrame ( unsigned char *temp );										//NRF24L01接收数据
void NRF24L01_Change_Working_Frequency ( unsigned char ch );//更改工作频率0~7f
void NRF24L01_Change_Data_Channel ( unsigned char ch );//更改通道0~5
void NRF24L01_Handler ( void )	;	//NRF24L01中断处理
#endif
