#include <reg51.h>
#include <intrins.h>
#include "api.h"
/***************************************************/
#define uchar unsigned char
#define TX_ADR_WIDTH 5 // 地址字节数为5 BYTE
#define TX_PLOAD_WIDTH 20 // 数据量为20 BYTE
uchar const TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 接收发送数据的地址.
uchar rx_buf[TX_PLOAD_WIDTH];
uchar tx_buf[TX_PLOAD_WIDTH];
uchar flag;
uchar stx_en=1;
uchar srx_en=1;
int rxtx_time;
uchar rx_data;
uchar tx_data;
/**************************************************/
sbit CE = P1^3;
sbit CSN= P1^4;
sbit SCK= P1^7;
sbit MOSI= P1^5;
sbit MISO= P1^6;
sbit IRQ = P3^2;
sbit rece_led = P1^0;
sbit test_led = P3^7;
/**************************************************/
uchar bdata sta;
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/**************************************************/
void init_io(void)
{
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
}
/**************************************************/
void init_int0(void)
{
EA=1;
EX0=1;
}
/**************************************************/
void delay100(void)
{ uchar x;
uchar y;
for(x=0;x<10;x++)
{ for(y=0;y<100;y++)
_nop_();
}
}
/**************************************************/
void delay_ms(unsigned int x)
{ unsigned int i,j;
i=0;
for(i=0;i<x;i++)
{ j=108;
while(j--);
}
}
/**************************************************/
uchar SPI_RW(uchar byte)
{ uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 输出 8 位
{ MOSI = (byte & 0x80); // 从MOSI脚输出,从高位到低位.当BYTE 最高位为1时逻辑运算为1,输出1.运算为0时输出0
byte = (byte << 1); // 左移1位.将低位向高位转移.
SCK = 1; // 将SCK脚拉高,
byte |= MISO; // 从MISO 中读出状态位存入BYTE中.
SCK = 0; // 将SCK脚拉低.发送一位完成.
}
return(byte); // 返回状态位
}
/**************************************************/
uchar SPI_RW_Reg(BYTE reg, BYTE value)
{ uchar status;
CSN = 0; // CS为低,开始SPI传输
status = SPI_RW(reg); // 传送命令与地址
SPI_RW(value); // 写1 BYTE 值
CSN = 1; // 完成SPI传输
return(status); // 返回 status
}
/**************************************************/
BYTE SPI_Read(BYTE reg)
{
BYTE reg_val;
CSN = 0; // CS为低,开始SPI传输
SPI_RW(reg); // 设置读地址
reg_val = SPI_RW(0); // 读数据
CSN = 1; // 完成SPI传输
return(reg_val); // 返回数据
}
/**************************************************/
uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
{ uchar status,byte_ctr;
CSN = 0; // CS为低,开始SPI传输
status = SPI_RW(reg); // 传输读接收数据的命令. 61H
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
pBuf[byte_ctr] = SPI_RW(0); // 读 1 BYTE数据
CSN = 1; // 数据传送完成.
return(status); // return nRF24L01 status byte
}
/**************************************************/
uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
{ uchar status,byte_ctr;
CSN = 0; // CS为低,开始SPI传输
status = SPI_RW(reg); // 传输写发送数据的命令. A0H
for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 传送发送数据
SPI_RW(*pBuf++);
CSN = 1; // 数据传送完成.
return(status); // return nRF24L01 status byte
}
/**************************************************/
void nRF24L01_config(void)
{
init_io();
CE=0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 设发送地址和地址宽度 20+10H
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 设接收地址和地址宽度 20+0AH
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 选择数据宽度 20+11H
SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x03);//
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);// // 关闭Pipe0 自动应答 20+01H
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);// // 开放Pipe0 接收数据 20+02H
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // // 500us + 86us, 10 retrans... 20+04H
SPI_RW_Reg(WRITE_REG + RF_CH, 40); // // 选择RF频率通道 20+05H
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // // 设置TX_PWR,Datarate,LNA 20+06H
CE=1;
}
/**************************************************/
void nRF24L01_Tx_packet(uchar *tx_buf)
{
CE=0;
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 写发送数 A0H
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); //
CE=1;
delay100();
CE=0;
}
uchar nRF24L01_Rx_packet(uchar *rx_buf)
{
uchar revalue = 0;
srx_en=1;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //
CE = 1;
delay100();
rxtx_time = 20*100;
while (srx_en)
{
rxtx_time--;
if(rxtx_time==0)
{
return 0;
}
}
sta = SPI_Read(STATUS);
if(RX_DR)
{
CE=0;
SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH); //读取数据
rx_data = rx_buf[0];
if(rx_data == 0x5a)
rece_led = ~ rece_led;
}
return revalue;
}
/**************************************************/
void main(void)
{
char i ;
test_led = 0;
init_io(); // Initialize IO port
init_int0(); // enable int0 interrupt
// 初始化MCU/***********************************************
nRF24L01_config();
// 配置NRF24L01/********************************************
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // 配置NRF24L01为发射模式/*********************
delay_ms(50);
test_led = 1;
while(1)
{
nRF24L01_Rx_packet(rx_buf);
SPI_RW_Reg(FLUSH_RX,0);
SPI_RW_Reg(WRITE_REG+STATUS,sta);// clear RX_DR or TX_DS or MAX_RT interrupt flag
test_led = ~ test_led;
}
}
/**************************************************
Function: ISR_int0() interrupt 0;
Description:
if RX_DR=1 or TX_DS or MAX_RT=1,enter this subprogram;
if RX_DR=1,read the payload from RX_FIFO and set flag;
/**************************************************/
void ISR_int0(void) interrupt 0
{
if(srx_en) // 判断是否是接收中断
{
srx_en = 0;
}
}
/**************************************************/