#ifndef __24L01_H
#define __24L01_H
//#include "ioremap.h"
//#include "delay.h"
//#include "spi.h"
#include "Common.h"
#include "Delay.h"

typedef unsigned char uchar;
//typedef unsigned char uint8;
typedef unsigned char u8;
typedef unsigned int uint;
//typedef unsigned int uint16;
typedef unsigned int u16;

//24L01操作线
#define NRF24L01_CE   		P11 	//24L01片选信号  
#define NRF24L01_CSN  		P15 	//SPI片选信号         
#define NRF24L01_IRQ  		P03  	//IRQ主机数据输?
#define NRF24L01_SCK        P10
#define NRF24L01_MOSI       P00
#define NRF24L01_MISO       P01

//设备地址设置
#define ADDR1_VALUE 0X34
#define ADDR2_VALUE 0X43
#define ADDR3_VALUE 0X10
#define ADDR4_VALUE 0X10
#define ADDR5_VALUE 0X01


//////////////////////////////////////////////////////////////////////////////////////////////////////////
//NRF24L01寄存器操作命令
#define READ_REG_NRF    0x00  //读配置寄存器,低5位为寄存器地址  
#define WRITE_REG_NRF   0x20  //写配置寄存器,低5位为寄存器地址  
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节,应用于接收模式下,读取完成后自动清除FIFO  
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节,应用于发射模式下  
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用  
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用,传输应答信号过程中用这个指令会让应答数据不能完整传输  
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.发射过程中必须禁止用这个功能  
#define NOP             0xFF  //空操作,可以用来读状态寄存器    

//SPI(NRF24L01)寄存器地址
#define CONFIG          0x00  //配置寄存器地址;  
//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 EN_AA           0x01
//bit0~5,使能自动应答功能 (自动应答必然启动CRC)对应通道0~5

#define EN_RXADDR       0x02
//bit0~5,接收数据通道允许,对应通道0~5

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

#define SETUP_RETR      0x04
//建立自动重发;
//bit3:0,自动重发计数器;0000 15次
//bit7:4,自动重发延时 0000 250*x+86us

#define RF_CH           0x05
//RF通道,bit6:0,工作通道频率

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


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

#define OBSERVE_TX      0x08  //发送检测寄存器,  
//bit7:4,数据包丢失计数器;
//bit3:0,重发计数器

#define CD              0x09  //载波检测寄存器,  
//bit0,载波检测;

#define RX_ADDR_P0      0x0A
//数据通道0接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P1      0x0B
//数据通道1接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P2      0x0C
//数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P3      0x0D
//数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P4      0x0E
//数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P5      0x0F
//数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;

#define TX_ADDR         0x10
//发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等
#define RX_PW_P0        0x11
//接收数据通道0有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P1        0x12
//接收数据通道1有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P2        0x13
//接收数据通道2有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P3        0x14
//接收数据通道3有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P4        0x15
//接收数据通道4有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P5        0x16
//接收数据通道5有效数据宽度(1~32字节),设置为0则非法

#define NRF_FIFO_STATUS 0x17
//FIFO状态寄存器;
//bit0,RX FIFO寄存器空标志;
//bit1,RX FIFO满标志;
//bit2,3,保留
//bit4,TX FIFO空标志;
//bit5,TX FIFO满标志;
//bit6,1,循环发送上一数据包.0,不循环;


#define MAX_TX      0x10  //达到最大发送次数中断  
#define TX_OK       0x20  //TX发送完成中断  
#define RX_OK       0x40  //接收到数据中断  

//////////////////////////////////////////////////////////////////////////////////////////////////////////

//24L01发送接收数据宽度定义
#define TX_ADR_WIDTH    5       //5字节的地址宽度  
#define RX_ADR_WIDTH    5       //5字节的地址宽度  

#define TX_PLOAD_WIDTH  32      //32字节的用户数据宽度  
#define RX_PLOAD_WIDTH  32      //32字节的用户数据宽度  


void Nrf24l01Init ( void ); //初始化
void Nrf24l01RxMode ( void ); //配置为接收模式
void Nrf24l01TxMode ( void ); //配置为发送模式
u8 Nrf24l01WriteBuf ( u8 reg, u8 *pBuf, u8 u8s ); //写数据区
u8 Nrf24l01ReadBuf ( u8 reg, u8 *pBuf, u8 u8s ); //读数据区
u8 Nrf24l01ReadReg ( u8 reg );      //读寄存器
u8 Nrf24l01WriteReg ( u8 reg, u8 value ); //写寄存器
u8 Nrf24l01Check ( void ); //检查24L01是否存在
u8 Nrf24l01TxPacket ( u8 *txbuf ); //发送一个包的数据
u8 Nrf24l01RxPacket ( u8 *rxbuf ); //接收一个包的数据


#endif