📄 hal_nrf.c
字号:
/* Copyright (c) 2007 Nordic Semiconductor. All Rights Reserved.
*
* The information contained herein is property of Nordic Semiconductor ASA.
* Terms and conditions of usage are described in detail in NORDIC
* SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
*
* Licensees are granted free, non-transferable use of the information. NO
* WARRENTY of ANY KIND is provided. This heading must NOT be removed from
* the file.
*
* $LastChangedRevision: 3653 $
*/
/** @file
*
* @author Runar Kjellhaug
*
*/
/*lint -t2 */
/*lint -esym( 534, hal_nrf_write_reg ) */
/*lint -esym( 534, hal_nrf_rw ) */
/*lint -e708 */
/*lint -e46 */
#include <stdint.h>
#include <stdbool.h>
#include "nordic_common.h"
#include "hal_nrf.h"
#define SET_BIT(pos) ((uint8_t) (1<<( (uint8_t) (pos) )))
#define UINT8(t) ((uint8_t) (t))
/** Basis function read_reg.
* Use this function to read the contents
* of one radios register.
*
* @param reg Register to read
* @return Register contents
*/
uint8_t hal_nrf_read_reg(uint8_t reg);
/** Basis function write_reg.
* Use this function to write a new value to
* a radio register.
*
* @param reg Register to write
* @param value New value to write
* @return Status register
*/
uint8_t hal_nrf_write_reg(uint8_t reg, uint8_t value);
/** Basis function, read_multibyte register .
* Use this function to read multiple bytes from
* a multibyte radio-register
*
* @param reg Multibyte register to read from
* @param *pbuf Pointer to buffer in which to store read bytes to
*
* @return pipe# of received data (MSB), if operation used by a hal_nrf_read_rx_pload
* @return length of read data (LSB), either for hal_nrf_read_rx_pload or
* for hal_nrf_get_address.
*/
uint16_t hal_nrf_read_multibyte_reg(uint8_t reg, uint8_t *pbuf);
/** Basis function, write_multibyte register.
* Use this function to write multiple bytes to
* a multiple radio register.
*
* @param reg Register to write
* @param *pbuf pointer to buffer in which data to write is
* @param length \# of bytes to write
*/
void hal_nrf_write_multibyte_reg(uint8_t reg, const uint8_t *pbuf, uint8_t length);
/**
* Typedef for the CONFIG register. Contains all the bitaddressable
* settings in the bits struct and the value sent to the radio in the uint8_t
*/
typedef union {
uint8_t value;
struct {
uint8_t prim_rx : 1;
uint8_t pwr_up : 1;
uint8_t crc0 : 1;
uint8_t en_crc : 1;
uint8_t mask_max_rt : 1;
uint8_t mask_tx_ds : 1;
uint8_t mask_rx_dr : 1;
const uint8_t : 1;
} bits;
} config_t;
/**
* Typedef for the EN_AA, EN_RXADDR and DYNPD registers. Contains all the
* bitaddressable settings in the bits struct and the value sent to the radio
* in the uint8_t
*/
typedef union {
uint8_t value;
struct {
uint8_t pipe_0 : 1;
uint8_t pipe_1 : 1;
uint8_t pipe_2 : 1;
uint8_t pipe_3 : 1;
uint8_t pipe_4 : 1;
uint8_t pipe_5 : 1;
const uint8_t : 2;
} bits;
} en_pipes_t;
/**
* Typedef for the SETUP_AW register. Contains all the bitaddressable
* settings in the bits struct and the value sent to the radio in the uint8_t
*/
typedef union {
uint8_t value;
struct {
uint8_t aw : 2;
const uint8_t : 6;
} bits;
} setup_aw_t;
/**
* Typedef for the SETUP_RETR register. Contains all the bitaddressable
* settings in the bits struct and the value sent to the radio in the uint8_t
*/
typedef union {
uint8_t value;
struct {
uint8_t arc : 4;
uint8_t ard : 4;
} bits;
} setup_retr_t;
/**
* Typedef for the RF_CH register. Contains all the bitaddressable
* settings in the bits struct and the value sent to the radio in the uint8_t
*/
typedef union {
uint8_t value;
struct {
uint8_t rf_ch : 7;
const uint8_t : 1;
} bits;
} rf_ch_t;
/**
* Typedef for the RF_SETUP register. Contains all the bitaddressable
* settings in the bits struct and the value sent to the radio in the uint8_t
*/
typedef union {
uint8_t value;
struct {
const uint8_t : 1;
uint8_t rf_pwr : 2;
uint8_t rf_dr_high : 1;
uint8_t pll_lock : 1;
uint8_t rf_dr_low : 1;
const uint8_t : 1;
uint8_t cont_wave : 1;
} bits;
} rf_setup_t;
/**
* Typedef for the RX_PW_Px registers. Contains all the bitaddressable
* settings in the bits struct and the value sent to the radio in the uint8_t
*/
typedef union {
uint8_t value;
struct {
uint8_t rx_pw : 6;
const uint8_t : 2;
} bits;
} rx_pw_t;
/**
* Typedef for the FEATURE register. Contains all the bitaddressable
* settings in the bits struct and the value sent to the radio in the uint8_t
*/
typedef union {
uint8_t value;
struct {
uint8_t en_dyn_ack : 1;
uint8_t en_ack_pay : 1;
uint8_t en_dpl : 1;
const uint8_t : 5;
} bits;
} feature_t;
/**
* Typedef for the AGC_CONFIG register. Contains all the bitaddressable
* settings in the bits struct and the value sent to the radio in the uint8_t
*/
typedef union {
uint16_t value;
struct {
uint8_t lnb_out : 3;
uint8_t lnb_in : 3;
uint8_t agc_en : 1;
uint8_t agc_th1mbit : 3;
uint8_t agc_th2mbit : 3;
uint8_t cd_th : 3;
} bits;
} agc_config_t;
/** Content of the CONFIG register */
//static config_t config;
/** Content of the EN_AA register */
//static en_pipes_t en_aa;
/** Content of the EN_RXADDR register */
//static en_pipes_t en_rxaddr;
/** Content of the SETUP_AW register */
//static setup_aw_t setup_aw;
/** Content of the SETUP_RETR register */
//static setup_retr_t setup_retr;
/** Content of the RF_CH register */
//static rf_ch_t rf_ch;
/** Content of the RF_SETUP register */
//static rf_setup_t rf_setup;
/** Content of the RX_PW_P0 register */
//static rx_pw_t rx_pw_px;
/** Content of the DYNPD register */
//static en_pipes_t dynpd;
/** Content of the FEATURE register */
//static feature_t feature;
/** Content of the AGC_CONFIG register */
//static agc_config_t agc_config;
void hal_nrf_set_operation_mode(hal_nrf_operation_mode_t op_mode)
{
config_t config;
config.value = hal_nrf_read_reg (CONFIG);
if(op_mode == HAL_NRF_PRX)
{
config.bits.prim_rx = 1;
}
else
{
config.bits.prim_rx = 0;
}
hal_nrf_write_reg (CONFIG, config.value);
}
void hal_nrf_set_power_mode(hal_nrf_pwr_mode_t pwr_mode)
{
config_t config;
config.value = hal_nrf_read_reg (CONFIG);
if(pwr_mode == HAL_NRF_PWR_UP)
{
config.bits.pwr_up = 1;
}
else
{
config.bits.pwr_up = 0;
}
hal_nrf_write_reg (CONFIG, config.value);
}
void hal_nrf_set_crc_mode(hal_nrf_crc_mode_t crc_mode)
{
config_t config;
config.value = hal_nrf_read_reg (CONFIG);
switch (crc_mode)
{
case HAL_NRF_CRC_OFF:
config.bits.en_crc = 0;
break;
case HAL_NRF_CRC_8BIT:
config.bits.en_crc = 1;
config.bits.crc0 = 0;
break;
case HAL_NRF_CRC_16BIT:
config.bits.en_crc = 1;
config.bits.crc0 = 1;
break;
default:
break;
}
hal_nrf_write_reg (CONFIG, config.value);
}
void hal_nrf_set_irq_mode(hal_nrf_irq_source_t int_source, bool irq_state)
{
config_t config;
config.value = hal_nrf_read_reg (CONFIG);
switch (int_source)
{
case HAL_NRF_MAX_RT:
config.bits.mask_max_rt = irq_state ? 0 : 1;
break;
case HAL_NRF_TX_DS:
config.bits.mask_tx_ds = irq_state ? 0 : 1;
break;
case HAL_NRF_RX_DR:
config.bits.mask_rx_dr = irq_state ? 0 : 1;
break;
}
hal_nrf_write_reg (CONFIG, config.value);
}
uint8_t hal_nrf_get_clear_irq_flags(void)
{
uint8_t retval;
retval = hal_nrf_write_reg (STATUS, (BIT_6|BIT_5|BIT_4));
return (retval & (BIT_6|BIT_5|BIT_4));
}
void hal_nrf_clear_irq_flag(hal_nrf_irq_source_t int_source)
{
hal_nrf_write_reg (STATUS, SET_BIT(int_source));
}
uint8_t hal_nrf_get_irq_flags(void)
{
return hal_nrf_nop() & (BIT_6|BIT_5|BIT_4);
}
void hal_nrf_open_pipe(hal_nrf_address_t pipe_num, bool auto_ack)
{
en_pipes_t en_rxaddr;
en_pipes_t en_aa;
en_rxaddr.value = hal_nrf_read_reg (EN_RXADDR);
en_aa.value = hal_nrf_read_reg (EN_AA);
switch(pipe_num)
{
case HAL_NRF_PIPE0:
case HAL_NRF_PIPE1:
case HAL_NRF_PIPE2:
case HAL_NRF_PIPE3:
case HAL_NRF_PIPE4:
case HAL_NRF_PIPE5:
en_rxaddr.value = en_rxaddr.value | SET_BIT(pipe_num);
if(auto_ack)
{
en_aa.value = en_aa.value | SET_BIT(pipe_num);
}
else
{
en_aa.value = en_aa.value & ~SET_BIT(pipe_num);
}
break;
case HAL_NRF_ALL:
en_rxaddr.value = ~(BIT_6|BIT_7);
if(auto_ack)
{
en_aa.value = ~(BIT_6|BIT_7);
}
else
{
en_aa.value = 0;
}
break;
default:
break;
}
hal_nrf_write_reg (EN_RXADDR, en_rxaddr.value);
hal_nrf_write_reg (EN_AA, en_aa.value);
}
void hal_nrf_close_pipe(hal_nrf_address_t pipe_num)
{
en_pipes_t en_rxaddr;
en_pipes_t en_aa;
en_rxaddr.value = hal_nrf_read_reg (EN_RXADDR);
en_aa.value = hal_nrf_read_reg (EN_AA);
switch(pipe_num)
{
case HAL_NRF_PIPE0:
case HAL_NRF_PIPE1:
case HAL_NRF_PIPE2:
case HAL_NRF_PIPE3:
case HAL_NRF_PIPE4:
case HAL_NRF_PIPE5:
en_rxaddr.value = en_rxaddr.value & ~SET_BIT(pipe_num);
en_aa.value = en_aa.value & ~SET_BIT(pipe_num);
break;
case HAL_NRF_ALL:
en_rxaddr.value = 0;
en_aa.value = 0;
break;
default:
break;
}
hal_nrf_write_reg (EN_RXADDR, en_rxaddr.value);
hal_nrf_write_reg (EN_AA, en_aa.value);
}
void hal_nrf_set_address(const hal_nrf_address_t address, const uint8_t *addr)
{
switch(address)
{
case HAL_NRF_TX:
case HAL_NRF_PIPE0:
case HAL_NRF_PIPE1:
hal_nrf_write_multibyte_reg(W_REGISTER + RX_ADDR_P0 + (uint8_t) address, addr, hal_nrf_get_address_width());
break;
case HAL_NRF_PIPE2:
case HAL_NRF_PIPE3:
case HAL_NRF_PIPE4:
case HAL_NRF_PIPE5:
hal_nrf_write_reg (RX_ADDR_P0 + (uint8_t) address, *addr);
break;
default:
break;
}
}
uint8_t hal_nrf_get_address(uint8_t address, uint8_t *addr)
{
switch (address)
{
case HAL_NRF_PIPE0:
case HAL_NRF_PIPE1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -