?? nrf24l01.c
字號:
/******************************************************************************
*
* File: nrf24l01.c
*
* 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.
*
*****************************************************************************/
#include "nrf24l01.h"
//Arguments except opt_rx_standby_mode fill the actual register they are named
// after. Registers that do not need to be initialized are not included here.
//The argument opt_rx_active_mode is only used if the user is initializing the
// 24L01 as a receiver. If the argument is false, the receiver will remain in
// standby mode and not monitor for packets. If the argument is true, the CE
// pin will be set and the 24L01 will monitor for packets. In TX mode, the value
// of this argument is insignificant.
//If the user wants to leave any 1-byte register in its default state, simply put
// as that register's argument nrf24l01_<reg>_DEFAULT_VAL, where <reg> is the register
// name.
//If the user wants to leave any of the 5-byte registers RX_ADDR_P0, RX_ADDR_P1, or
// TX_ADDR in its default state, simply put NULL in the argument for that address value.
void nrf24l01_initialize(unsigned char config,
unsigned char opt_rx_active_mode,
unsigned char en_aa,
unsigned char en_rxaddr,
unsigned char setup_aw,
unsigned char setup_retr,
unsigned char rf_ch,
unsigned char rf_setup,
unsigned char * rx_addr_p0,
unsigned char * rx_addr_p1,
unsigned char rx_addr_p2,
unsigned char rx_addr_p3,
unsigned char rx_addr_p4,
unsigned char rx_addr_p5,
unsigned char * tx_addr,
unsigned char rx_pw_p0,
unsigned char rx_pw_p1,
unsigned char rx_pw_p2,
unsigned char rx_pw_p3,
unsigned char rx_pw_p4,
unsigned char rx_pw_p5)
{
unsigned char data[5];
data[0] = en_aa;
nrf24l01_write_register(nrf24l01_EN_AA, data, 1);
data[0] = en_rxaddr;
nrf24l01_write_register(nrf24l01_EN_RXADDR, data, 1);
data[0] = setup_aw;
nrf24l01_write_register(nrf24l01_SETUP_AW, data, 1);
data[0] = setup_retr;
nrf24l01_write_register(nrf24l01_SETUP_RETR, data, 1);
data[0] = rf_ch;
nrf24l01_write_register(nrf24l01_RF_CH, data, 1);
data[0] = rf_setup;
nrf24l01_write_register(nrf24l01_RF_SETUP, data, 1);
if(rx_addr_p0 != NULL)
nrf24l01_set_rx_addr(rx_addr_p0, 5, 0);
else
{
data[0] = nrf24l01_RX_ADDR_P0_B0_DEFAULT_VAL;
data[1] = nrf24l01_RX_ADDR_P0_B1_DEFAULT_VAL;
data[2] = nrf24l01_RX_ADDR_P0_B2_DEFAULT_VAL;
data[3] = nrf24l01_RX_ADDR_P0_B3_DEFAULT_VAL;
data[4] = nrf24l01_RX_ADDR_P0_B4_DEFAULT_VAL;
nrf24l01_set_rx_addr(data, 5, 0);
}
if(rx_addr_p1 != NULL)
nrf24l01_set_rx_addr(rx_addr_p1, 5, 1);
else
{
data[0] = nrf24l01_RX_ADDR_P1_B0_DEFAULT_VAL;
data[1] = nrf24l01_RX_ADDR_P1_B1_DEFAULT_VAL;
data[2] = nrf24l01_RX_ADDR_P1_B2_DEFAULT_VAL;
data[3] = nrf24l01_RX_ADDR_P1_B3_DEFAULT_VAL;
data[4] = nrf24l01_RX_ADDR_P1_B4_DEFAULT_VAL;
nrf24l01_set_rx_addr(data, 5, 1);
}
data[0] = rx_addr_p2;
nrf24l01_set_rx_addr(data, 1, 2);
data[0] = rx_addr_p3;
nrf24l01_set_rx_addr(data, 1, 3);
data[0] = rx_addr_p4;
nrf24l01_set_rx_addr(data, 1, 4);
data[0] = rx_addr_p5;
nrf24l01_set_rx_addr(data, 1, 5);
if(tx_addr != NULL)
nrf24l01_set_tx_addr(tx_addr, 5);
else
{
data[0] = nrf24l01_TX_ADDR_B0_DEFAULT_VAL;
data[1] = nrf24l01_TX_ADDR_B1_DEFAULT_VAL;
data[2] = nrf24l01_TX_ADDR_B2_DEFAULT_VAL;
data[3] = nrf24l01_TX_ADDR_B3_DEFAULT_VAL;
data[4] = nrf24l01_TX_ADDR_B4_DEFAULT_VAL;
nrf24l01_set_tx_addr(data, 5);
}
data[0] = rx_pw_p0;
nrf24l01_write_register(nrf24l01_RX_PW_P0, data, 1);
data[0] = rx_pw_p1;
nrf24l01_write_register(nrf24l01_RX_PW_P1, data, 1);
data[0] = rx_pw_p2;
nrf24l01_write_register(nrf24l01_RX_PW_P2, data, 1);
data[0] = rx_pw_p3;
nrf24l01_write_register(nrf24l01_RX_PW_P3, data, 1);
data[0] = rx_pw_p4;
nrf24l01_write_register(nrf24l01_RX_PW_P4, data, 1);
data[0] = rx_pw_p5;
nrf24l01_write_register(nrf24l01_RX_PW_P5, data, 1);
if((config & nrf24l01_CONFIG_PWR_UP) != 0)
nrf24l01_power_up_param(opt_rx_active_mode, config);
else
nrf24l01_power_down_param(config);
}
//initializes the 24L01 to all default values except the PWR_UP and PRIM_RX bits
//this function also disables the auto-ack feature on the chip (EN_AA register is 0)
//bool rx is true if the device should be a receiver and false if it should be
// a transmitter.
//unsigned char payload_width is the payload width for pipe 0. All other pipes
// are left in their default (disabled) state.
//bool enable_auto_ack controls the auto ack feature on pipe 0. If true, auto-ack will
// be enabled. If false, auto-ack is disabled.
void nrf24l01_initialize_debug(bool rx, unsigned char p0_payload_width, bool enable_auto_ack)
{
unsigned char config;
unsigned char en_aa;
config = nrf24l01_CONFIG_DEFAULT_VAL | nrf24l01_CONFIG_PWR_UP;
if(enable_auto_ack != false)
en_aa = nrf24l01_EN_AA_ENAA_P0;
else
en_aa = nrf24l01_EN_AA_ENAA_NONE;
if(rx == true)
config = config | nrf24l01_CONFIG_PRIM_RX;
nrf24l01_initialize(config,
true,
en_aa,
nrf24l01_EN_RXADDR_DEFAULT_VAL,
nrf24l01_SETUP_AW_DEFAULT_VAL,
nrf24l01_SETUP_RETR_DEFAULT_VAL,
nrf24l01_RF_CH_DEFAULT_VAL,
nrf24l01_RF_SETUP_DEFAULT_VAL,
NULL,
NULL,
nrf24l01_RX_ADDR_P2_DEFAULT_VAL,
nrf24l01_RX_ADDR_P3_DEFAULT_VAL,
nrf24l01_RX_ADDR_P4_DEFAULT_VAL,
nrf24l01_RX_ADDR_P5_DEFAULT_VAL,
NULL,
p0_payload_width,
nrf24l01_RX_PW_P1_DEFAULT_VAL,
nrf24l01_RX_PW_P2_DEFAULT_VAL,
nrf24l01_RX_PW_P3_DEFAULT_VAL,
nrf24l01_RX_PW_P4_DEFAULT_VAL,
nrf24l01_RX_PW_P5_DEFAULT_VAL);
}
//initializes only the CONFIG register and pipe 0's payload width
//the primary purpose of this function is to allow users with microcontrollers with
// extremely small program memories to still be able to init their 24L01. This code
// should have a smaller footprint than the above init functions.
//when using this method, the 24L01 MUST have its default configuration loaded
// in all registers to work. It is recommended that the device be reset or
// have its power cycled immediately before this code is run.
//in normal circumstances, the user should use nrf24l01_initialize() rather than this
// function, since this function does not set all of the register values.
void nrf24l01_initialize_debug_lite(bool rx, unsigned char p0_payload_width)
{
unsigned char config;
config = nrf24l01_CONFIG_DEFAULT_VAL;
if(rx != false)
config |= nrf24l01_CONFIG_PRIM_RX;
nrf24l01_write_register(nrf24l01_RX_PW_P0, &p0_payload_width, 1);
nrf24l01_power_up_param(true, config);
}
//powers up the 24L01 with all necessary delays
//this function takes the existing contents of the CONFIG register and sets the PWR_UP
//the argument rx_active_mode is only used if the user is setting up the
// 24L01 as a receiver. If the argument is false, the receiver will remain in
// standby mode and not monitor for packets. If the argument is true, the CE
// pin will be set and the 24L01 will monitor for packets. In TX mode, the value
// of this argument is insignificant.
//note: if the read value of the CONFIG register already has the PWR_UP bit set, this function
// exits in order to not make an unecessary register write.
void nrf24l01_power_up(bool rx_active_mode)
{
unsigned char config;
nrf24l01_read_register(nrf24l01_CONFIG, &config, 1);
if((config & nrf24l01_CONFIG_PWR_UP) != 0)
return;
config |= nrf24l01_CONFIG_PWR_UP;
nrf24l01_write_register(nrf24l01_CONFIG, &config, 1);
delay_us(1500);
if((config & nrf24l01_CONFIG_PRIM_RX) == 0)
nrf24l01_clear_ce();
else
{
if(rx_active_mode != false)
nrf24l01_set_ce();
else
nrf24l01_clear_ce();
}
}
//powers up the 24L01 with all necessary delays
//this function allows the user to set the contents of the CONFIG register, but the function
// sets the PWR_UP bit in the CONFIG register, so the user does not need to.
//the argument rx_active_mode is only used if the user is setting up the
// 24L01 as a receiver. If the argument is false, the receiver will remain in
// standby mode and not monitor for packets. If the argument is true, the CE
// pin will be set and the 24L01 will monitor for packets. In TX mode, the value
// of this argument is insignificant.
void nrf24l01_power_up_param(bool rx_active_mode, unsigned char config)
{
unsigned char test, test2;
config |= nrf24l01_CONFIG_PWR_UP;
nrf24l01_write_register(nrf24l01_CONFIG, &config, 1);
delay_us(1500);
if((config & nrf24l01_CONFIG_PRIM_RX) == 0)
nrf24l01_clear_ce();
else
{
if(rx_active_mode != false)
nrf24l01_set_ce();
else
nrf24l01_clear_ce();
}
}
//powers down the 24L01
//this function takes the existing contents of the CONFIG register and simply
// clears the PWR_UP bit in the CONFIG register.
//note: if the read value of the CONFIG register already has the PWR_UP bit cleared, this
// function exits in order to not make an unecessary register write.
void nrf24l01_power_down()
{
unsigned char config;
nrf24l01_read_register(nrf24l01_CONFIG, &config, 1);
if((config & nrf24l01_CONFIG_PWR_UP) == 0)
return;
config &= (~nrf24l01_CONFIG_PWR_UP);
nrf24l01_write_register(nrf24l01_CONFIG, &config, 1);
nrf24l01_clear_ce();
}
//powers down the 24L01
//this function allows the user to set the contents of the CONFIG register, but the function
// clears the PWR_UP bit in the CONFIG register, so the user does not need to.
void nrf24l01_power_down_param(unsigned char config)
{
config &= (~nrf24l01_CONFIG_PWR_UP);
nrf24l01_write_register(nrf24l01_CONFIG, &config, 1);
nrf24l01_clear_ce();
}
//sets up the 24L01 as a receiver with all necessary delays
//this function takes the existing contents of the CONFIG register and sets the PRIM_RX
// bit in the CONFIG register.
//if the argument rx_active_mode is false, the receiver will remain in standby mode
// and not monitor for packets. If the argument is true, the CE pin will be set
// and the 24L01 will monitor for packets.
//note: if the read value of the CONFIG register already has the PRIM_RX bit set, this function
// exits in order to not make an unecessary register write.
void nrf24l01_set_as_rx(bool rx_active_mode)
{
unsigned char config;
unsigned char status;
status = nrf24l01_read_register(0, &config, 1);
if((config & nrf24l01_CONFIG_PRIM_RX) != 0)
return;
config |= nrf24l01_CONFIG_PRIM_RX;
nrf24l01_write_register(nrf24l01_CONFIG, &config, 1);
if(rx_active_mode != false)
nrf24l01_set_ce();
else
nrf24l01_clear_ce();
}
//sets up the 24L01 as a receiver with all necessary delays
//this function allows the user to set the contents of the CONFIG register, but the function
// sets the PRIM_RX bit in the CONFIG register, so the user does not need to.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -