NRF24L01硬件设计和软件实现(STC15)

NRF24L01硬件设计和软件实现(STC15)_第1张图片

上面是我创建的群聊,欢迎新朋友的加入。

NRF24L01硬件设计和软件实现(STC15)_第2张图片

这个东西做了有很久了,STC+NRF24L01方案,当时弄个黑油还花了100大洋。

这个东西有两部分组成,一个无线板,一个底板。

1.无线部分

NRF24L01硬件设计和软件实现(STC15)_第3张图片

原理图是直接照抄数据手册的

NRF24L01硬件设计和软件实现(STC15)_第4张图片

做出来就是绿色的这种

2.STC15底板

NRF24L01硬件设计和软件实现(STC15)_第5张图片

考虑到方便调试,加了一个CH340下载电路

NRF24L01硬件设计和软件实现(STC15)_第6张图片

3.驱动程序实现

#include "nrf24l01.h"

const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; 
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; 
/**********************/
/* SPI数据收发函数    */
/**********************/
u8 SPI_RW(u8 tr_data)
{
	u16 bit_ctr;
	for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
	{
		NRF_MOSI = (tr_data & 0x80);         // output 'uchar', MSB to MOSI
		tr_data = (tr_data << 1);           // shift next bit into MSB..
		NRF_SCK = 1;                      // Set SCK high..
		tr_data |= NRF_MISO;       		  // capture current MISO bit
		NRF_SCK = 0;            		  // ..then set SCK low again
	}
	return(tr_data);           		  // return read uchar
}

/*********************************************/
/* 函数功能:给24L01的寄存器写值(一个字节) */
/* 入口参数:reg   要写的寄存器地址          */
/*           value 给寄存器写的值            */
/* 出口参数:status 状态值                   */
/*********************************************/
u8 NRF24L01_RW_Reg(u8 reg,u8 value)
{
	u16 status;

	NRF_CSN = 0;                   // CSN low, init SPI transaction
	status = SPI_RW(reg);      // select register
	SPI_RW(value);             // ..and write value to it..
	NRF_CSN = 1;                   // CSN high again

	return(status);            // return nRF24L01 status uchar
}
/*************************************************/
/* 函数功能:读24L01的寄存器值 (一个字节)      */
/* 入口参数:reg  要读的寄存器地址               */
/* 出口参数:value 读出寄存器的值                */
/*************************************************/
u8 NRF24L01_Read_Reg(u8 reg)
{
	u8 reg_val;
	
	NRF_CSN = 0;                // CSN low, initialize SPI communication...
	SPI_RW(reg);            // Select register to read from..
	reg_val = SPI_RW(0);    // ..then read registervalue
	NRF_CSN = 1;                // CSN high, terminate SPI communication
	
	return(reg_val);        // return register value
}
/*********************************************/
/* 函数功能:读24L01的寄存器值(多个字节)   */
/* 入口参数:reg   寄存器地址                */
/*           *pBuf 读出寄存器值的存放数组    */
/*           len   数组字节长度              */
/* 出口参数:status 状态值                   */
/*********************************************/
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
	u16 status,uchar_ctr;
	
	NRF_CSN = 0;                    		// Set CSN low, init SPI tranaction
	status = SPI_RW(reg);       		// Select register to write to and read status uchar
	
	for(uchar_ctr=0;uchar_ctr
#ifndef NRF24L01_H_
#define NRF24L01_H_

#include "usart.h"
#include "system.h"

sbit NRF_CE = P1^1;
sbit NRF_CSN = P1^0;
sbit NRF_MISO = P3^3;
sbit NRF_MOSI = P3^6;
sbit NRF_SCK = P3^7;
sbit NRF_IRQ = P3^2;

/**********  NRF24L01寄存器操作命令  ***********/
#define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#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  //空操作,可以用来读状态寄存器	 
/**********  NRF24L01寄存器地址   *************/
#define CONFIG          0x00  //配置寄存器地址                             
#define EN_AA           0x01  //使能自动应答功能 
#define EN_RXADDR       0x02  //接收地址允许
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
#define SETUP_RETR      0x04  //建立自动重发
#define RF_CH           0x05  //RF通道
#define RF_SETUP        0x06  //RF寄存器
#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有效数据宽度(1~32字节) 
#define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节) 
#define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节) 
#define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节) 
#define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS     0x17  // FIFO状态寄存器
/*————————————————————————————————————————————————————————————————————*/
		
/******   STATUS寄存器bit位定义      *******/
#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字节有效数据宽度

u8 NRF24L01_Check(void);
void NRF24L01_RT_Init(void);
u8 NRF24L01_TxPacket(u8 *txbuf);
u8 NRF24L01_RxPacket(u8 *rxbuf);
u8 NRF24L01_RW_Reg(u8 reg,u8 value);

#endif

 

你可能感兴趣的:(NRF24L01硬件设计和软件实现(STC15))