📄 nrf24l01.h
字号:
/******************************************************************************
*
* File: nrf24l01.h
*
* Copyright S. Brennen Ball, 2006-2007
*
* The author provides no guarantees, warantees, or promises, implied or
* otherwise. By using this software you agree to indemnify the author
* of any damages incurred by using it.
*
*****************************************************************************/
#ifndef NRF24L01_H_
#define NRF24L01_H_
#include <stddef.h>
#ifndef bool
#define bool unsigned char
#endif
#ifndef false
#define false 0
#endif
#ifndef true
#define true !false
#endif
/////////////////////////////////////////////////////////////////////////////////
// SPI function requirements
//
// The user must define a function to send one byte of data and also return the
// resulting byte of data data through the SPI port. The function used here
// has the function prototype
//
// unsigned char spi_send_read_byte(unsigned char byte);
//
// This function should take the argument unsigned char byte and send it through
// the SPI port to the 24L01. Then, it should wait until the 24L01 has returned
// its response over SPI. This received byte should be the return value of the
// function.
//
// You should also change the include file name below to whatever the name of your
// SPI include file is.
//////////////////////////////////////////////////////////////////////////////////
#include "spi1.h"
#define spi_send_read_byte(byte) spi1_send_read_byte(byte)
/////////////////////////////////////////////////////////////////////////////////
// Delay function requirements
//
// The user must define a function that delays for the specified number of
// microseconds. This function needs to be as precise as possible, and the use
// of a timer module within your microcontroller is highly recommended. The
// function used here has the prototype
//
// void delay_us(unsigned int microseconds);
//
// You should also change the include file name below to whatever the name of your
// delay include file is.
//////////////////////////////////////////////////////////////////////////////////
#include "delays.h"
#define delay_us(microseconds) DelayUS(microseconds)
//////////////////////////////////////////////////////////////////////////////////
// IO pin definitions
//
// Below you will find several definitions and includes. The first is an #include
// for your microcontroller's include file to allow you to use register names
// rather than numbers. The next three are to allow you to control the pins on
// the 24L01 that aren't automatically handled by SPI. These are CE, CSN, and
// IRQ.
//
// The general format of these defines is a define for the IO register the pin is
// attached to. The second define is a mask for the pin. For example, say that
// your CE pin is tied to an IO port with the register name IOPORT1. Also, let's
// say that the IO port is 8-bits wide, and you have attached the pin to pin 0 of
// the port. Then your define would look like this:
//
// #define nrf24l01_CE_IOREGISTER IOPORT1
// #define nrf24l01_CE_PINMASK 0x01
//
// If you have defines in your include file for individual IO pins, you could use
// this define in this file, as well. Using the previous example, assume that in
// your microcontroller's include file, pin 0 of IOPORT1 has a define like this
//
// #define IOPORT1_PIN0 0x01
//
// Then, you could make your defines for the CE pin in this file look like this:
//
// #define nrf24l01_CE_IOREGISTER IOPORT1
// #define nrf24l01_CE_PINMASK IOPORT1_PIN0
//
// You should also change the include file name below to whatever the name of your
// processor's register definition include file is.
/////////////////////////////////////////////////////////////////////////////////////
#include <p18f452.h>
//defines for uC pins CE pin is connected to
//This is used so that the routines can send TX payload data and
// properly initialize the nrf24l01 in TX and RX states.
//Change these definitions (and then recompile) to suit your particular application.
#define nrf24l01_CE_IOREGISTER PORTC
#define nrf24l01_CE_PINMASK 0x02
//defines for uC pins CSN pin is connected to
//This is used so that the routines can send properly operate the SPI interface
// on the nrf24l01.
//Change these definitions (and then recompile) to suit your particular application.
#define nrf24l01_CSN_IOREGISTER PORTC
#define nrf24l01_CSN_PINMASK 0x04
//defines for uC pins IRQ pin is connected to
//This is used so that the routines can poll for IRQ or create an ISR.
//Change these definitions (and then recompile) to suit your particular application.
#define nrf24l01_IRQ_IOREGISTER PORTB
#define nrf24l01_IRQ_PINMASK 0x01
////////////////////////////////////////////////////////////////////////////////////
// SPI commands
//
// The following are defines for all of the commands and data masks on the SPI
// interface.
////////////////////////////////////////////////////////////////////////////////////
//SPI command defines
#define nrf24l01_R_REGISTER 0x00
#define nrf24l01_W_REGISTER 0x20
#define nrf24l01_R_RX_PAYLOAD 0x61
#define nrf24l01_W_TX_PAYLOAD 0xA0
#define nrf24l01_FLUSH_TX 0xE1
#define nrf24l01_FLUSH_RX 0xE2
#define nrf24l01_REUSE_TX_PL 0xE3
#define nrf24l01_NOP 0xFF
//SPI command data mask defines
#define nrf24l01_R_REGISTER_DATA 0x1F
#define nrf24l01_W_REGISTER_DATA 0x1F
////////////////////////////////////////////////////////////////////////////////////
// Register definitions
//
// Below are the defines for each register's address in the 24L01.
////////////////////////////////////////////////////////////////////////////////////
#define nrf24l01_CONFIG 0x00
#define nrf24l01_EN_AA 0x01
#define nrf24l01_EN_RXADDR 0x02
#define nrf24l01_SETUP_AW 0x03
#define nrf24l01_SETUP_RETR 0x04
#define nrf24l01_RF_CH 0x05
#define nrf24l01_RF_SETUP 0x06
#define nrf24l01_STATUS 0x07
#define nrf24l01_OBSERVE_TX 0x08
#define nrf24l01_CD 0x09
#define nrf24l01_RX_ADDR_P0 0x0A
#define nrf24l01_RX_ADDR_P1 0x0B
#define nrf24l01_RX_ADDR_P2 0x0C
#define nrf24l01_RX_ADDR_P3 0x0D
#define nrf24l01_RX_ADDR_P4 0x0E
#define nrf24l01_RX_ADDR_P5 0x0F
#define nrf24l01_TX_ADDR 0x10
#define nrf24l01_RX_PW_P0 0x11
#define nrf24l01_RX_PW_P1 0x12
#define nrf24l01_RX_PW_P2 0x13
#define nrf24l01_RX_PW_P3 0x14
#define nrf24l01_RX_PW_P4 0x15
#define nrf24l01_RX_PW_P5 0x16
#define nrf24l01_FIFO_STATUS 0x17
////////////////////////////////////////////////////////////////////////////////////
// Default register values
//
// Below are the defines for each register's default value in the 24L01. Multi-byte
// registers use notation B<X>, where "B" represents "byte" and <X> is the byte
// number.
////////////////////////////////////////////////////////////////////////////////////
#define nrf24l01_CONFIG_DEFAULT_VAL 0x08
#define nrf24l01_EN_AA_DEFAULT_VAL 0x3F
#define nrf24l01_EN_RXADDR_DEFAULT_VAL 0x03
#define nrf24l01_SETUP_AW_DEFAULT_VAL 0x03
#define nrf24l01_SETUP_RETR_DEFAULT_VAL 0x03
#define nrf24l01_RF_CH_DEFAULT_VAL 0x02
#define nrf24l01_RF_SETUP_DEFAULT_VAL 0x0F
#define nrf24l01_STATUS_DEFAULT_VAL 0x0E
#define nrf24l01_OBSERVE_TX_DEFAULT_VAL 0x00
#define nrf24l01_CD_DEFAULT_VAL 0x00
#define nrf24l01_RX_ADDR_P0_B0_DEFAULT_VAL 0xE7
#define nrf24l01_RX_ADDR_P0_B1_DEFAULT_VAL 0xE7
#define nrf24l01_RX_ADDR_P0_B2_DEFAULT_VAL 0xE7
#define nrf24l01_RX_ADDR_P0_B3_DEFAULT_VAL 0xE7
#define nrf24l01_RX_ADDR_P0_B4_DEFAULT_VAL 0xE7
#define nrf24l01_RX_ADDR_P1_B0_DEFAULT_VAL 0xC2
#define nrf24l01_RX_ADDR_P1_B1_DEFAULT_VAL 0xC2
#define nrf24l01_RX_ADDR_P1_B2_DEFAULT_VAL 0xC2
#define nrf24l01_RX_ADDR_P1_B3_DEFAULT_VAL 0xC2
#define nrf24l01_RX_ADDR_P1_B4_DEFAULT_VAL 0xC2
#define nrf24l01_RX_ADDR_P2_DEFAULT_VAL 0xC3
#define nrf24l01_RX_ADDR_P3_DEFAULT_VAL 0xC4
#define nrf24l01_RX_ADDR_P4_DEFAULT_VAL 0xC5
#define nrf24l01_RX_ADDR_P5_DEFAULT_VAL 0xC6
#define nrf24l01_TX_ADDR_B0_DEFAULT_VAL 0xE7
#define nrf24l01_TX_ADDR_B1_DEFAULT_VAL 0xE7
#define nrf24l01_TX_ADDR_B2_DEFAULT_VAL 0xE7
#define nrf24l01_TX_ADDR_B3_DEFAULT_VAL 0xE7
#define nrf24l01_TX_ADDR_B4_DEFAULT_VAL 0xE7
#define nrf24l01_RX_PW_P0_DEFAULT_VAL 0x00
#define nrf24l01_RX_PW_P1_DEFAULT_VAL 0x00
#define nrf24l01_RX_PW_P2_DEFAULT_VAL 0x00
#define nrf24l01_RX_PW_P3_DEFAULT_VAL 0x00
#define nrf24l01_RX_PW_P4_DEFAULT_VAL 0x00
#define nrf24l01_RX_PW_P5_DEFAULT_VAL 0x00
#define nrf24l01_FIFO_STATUS_DEFAULT_VAL 0x11
////////////////////////////////////////////////////////////////////////////////////
// Register bitwise definitions
//
// Below are the defines for each register's bitwise fields in the 24L01.
////////////////////////////////////////////////////////////////////////////////////
//CONFIG register bitwise definitions
#define nrf24l01_CONFIG_RESERVED 0x80
#define nrf24l01_CONFIG_MASK_RX_DR 0x40
#define nrf24l01_CONFIG_MASK_TX_DS 0x20
#define nrf24l01_CONFIG_MASK_MAX_RT 0x10
#define nrf24l01_CONFIG_EN_CRC 0x08
#define nrf24l01_CONFIG_CRCO 0x04
#define nrf24l01_CONFIG_PWR_UP 0x02
#define nrf24l01_CONFIG_PRIM_RX 0x01
//EN_AA register bitwise definitions
#define nrf24l01_EN_AA_RESERVED 0xC0
#define nrf24l01_EN_AA_ENAA_ALL 0x3F
#define nrf24l01_EN_AA_ENAA_P5 0x20
#define nrf24l01_EN_AA_ENAA_P4 0x10
#define nrf24l01_EN_AA_ENAA_P3 0x08
#define nrf24l01_EN_AA_ENAA_P2 0x04
#define nrf24l01_EN_AA_ENAA_P1 0x02
#define nrf24l01_EN_AA_ENAA_P0 0x01
#define nrf24l01_EN_AA_ENAA_NONE 0x00
//EN_RXADDR register bitwise definitions
#define nrf24l01_EN_RXADDR_RESERVED 0xC0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -