#include<STC12C5A60S2.h>
sbit CE=P1^0;
sbit CSN=P1^1;
sbit SCK=P1^2;
sbit MOSI=P1^3;
sbit MISO=P1^4;
sbit IRQ=P1^5;
sbit LED=P3^7;
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 32
#define RX_PLOAD_WIDTH 32
unsigned char bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0xff, 0xee, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xee, 0xff};//发送数据
unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据
unsigned char code LEDchar[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
unsigned char LEDnum[]={0xff,0xff,0xff,0xff};
unsigned char test1[] = {0x18, 0xba, 0x65, 0xdc};
/*--NRF24L01寄存器指令----------------------------------------------*/
#define READ_REG 0x00//读寄存器指令
#define WRITE_REG 0x20//写寄存器指令
#define RD_RX_PLOAD 0x61//读取接收数据指令
#define WR_TX_PLOAD 0xa0//写待发数据指令
#define FLUSH_TX 0xe1//冲洗发送FIFO指令
#define FLUSH_RX 0xe2//冲洗接受FIFO指令
#define REUSE_TX_PL 0xe3//定义重复装载数据指令
#define NOP 0xff//保留
/*--SPI 寄存器地址--------------------------------------------------*/
#define CONFIG 0x00//配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01//自动应答功能设置
#define EN_RXADDR 0x02//可用信道设置
#define SETUP_AW 0x03//收发地址宽度设置
#define SETUP_RETR 0x04//自动重发功能设置
#define RF_CH 0x05//工作频率设置
#define RF_SETUP 0x06//发射速率、功耗功能设置
#define STATUS 0x07//状态寄存器
#define OBSERVE_TX 0x08//发送监测功能
#define CD 0x09//地址检测
#define RX_ADDR_P0 0x0a//频道0接收数据地址
#define RX_ADDR_P1 0x0b//频道1接收数据地址
#define RX_ADDR_P2 0x0c//频道2接收数据地址
#define RX_ADDR_P3 0x0d//频道3接收数据地址
#define RX_ADDR_P4 0x0e//频道4接收数据地址
#define RX_ADDR_P5 0x0f//频道5接收数据地址
#define TX_ADDR 0x10//发送地址寄存器
#define RX_PW_P0 0x11//接收频道0接收数据长度
#define RX_PW_P1 0x12//接收频道1接收数据长度
#define RX_PW_P2 0x13//接收频道2接收数据长度
#define RX_PW_P3 0x14//接收频道3接收数据长度
#define RX_PW_P4 0x15//接收频道4接收数据长度
#define RX_PW_P5 0x16//接收频道5接收数据长度
#define FIFO_STATUS 0x17//FIFO栈入栈出状态寄存器设置
void Delay_us(unsigned char time)
{
while(time)
{
time --;
}
}
unsigned char SPI_RW(unsigned char byte)
{
unsigned Bit_Count;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (byte & 0x80);
byte = (byte << 1);
SCK = 1;
byte |= MISO;
SCK = 0;
}
return(byte);
}
unsigned char SPI_RW_Reg(unsigned char address, unsigned char command)
{
unsigned char status;
CSN = 0;
SPI_RW(address);
status = SPI_RW(command);
CSN = 1;
return(status);
}
void SPI_Write_Buf(unsigned char address, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char Byte_Count;
CSN = 0;
SPI_RW(address);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
SPI_RW(pBuf[Byte_Count]);
}
CSN = 1;
}
void Init_NRF24L01(void)
{
CE = 0;
CSN = 1;
SCK = 0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);
SPI_RW_Reg(WRITE_REG + RF_CH, 0);
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
CE = 1;
Delay_us(150);
}
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char status, Byte_Count;
CSN = 0;
status = SPI_RW(reg);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
pBuf[Byte_Count] = SPI_RW(0x00);
}
CSN = 1;
return(status);
}
void nRF24L01_RxPacket(unsigned char *rx_buf)
{
CE = 0;
sta = SPI_RW_Reg(READ_REG+STATUS, 0x00);
if(sta==0x40)
{
LED = 0;
SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+STATUS, 0xff);
Delay_us(150);
}
CE = 1;
}
void main(void)
{
Delay_us(255);
CLK_DIV |= 0x01;
LED = 1;
Init_NRF24L01();
while(1)
{
nRF24L01_RxPacket(Rx_Buf);
}
}