📄 hal_nrf.c
字号:
case HAL_NRF_TX:
return hal_nrf_read_multibyte_reg (address, addr);
default:
*addr = hal_nrf_read_reg(RX_ADDR_P0 + address);
return 1;
}
}
void hal_nrf_set_auto_retr(uint8_t retr, uint16_t delay)
{
setup_retr_t setup_retr;
setup_retr.bits.ard = (delay / 250) - 1;
setup_retr.bits.arc = retr;
hal_nrf_write_reg (SETUP_RETR, setup_retr.value);
}
void hal_nrf_set_address_width(hal_nrf_address_width_t aw)
{
setup_aw_t setup_aw;
setup_aw.bits.aw = (uint8_t)aw - 2;
hal_nrf_write_reg (SETUP_AW, setup_aw.value);
}
uint8_t hal_nrf_get_address_width (void)
{
return hal_nrf_read_reg (SETUP_AW) + 2;
}
void hal_nrf_set_rx_payload_width(uint8_t pipe_num, uint8_t pload_width)
{
hal_nrf_write_reg (RX_PW_P0 + pipe_num, pload_width);
}
uint8_t hal_nrf_get_pipe_status(uint8_t pipe_num)
{
en_pipes_t en_rxaddr;
en_pipes_t en_aa;
uint8_t en_rx_r, en_aa_r;
en_rxaddr.value = hal_nrf_read_reg (EN_RXADDR);
en_aa.value = hal_nrf_read_reg (EN_AA);
switch (pipe_num)
{
case 0:
en_rx_r = en_rxaddr.bits.pipe_0;
en_aa_r = en_aa.bits.pipe_0;
break;
case 1:
en_rx_r = en_rxaddr.bits.pipe_1;
en_aa_r = en_aa.bits.pipe_1;
break;
case 2:
en_rx_r = en_rxaddr.bits.pipe_2;
en_aa_r = en_aa.bits.pipe_2;
break;
case 3:
en_rx_r = en_rxaddr.bits.pipe_3;
en_aa_r = en_aa.bits.pipe_3;
break;
case 4:
en_rx_r = en_rxaddr.bits.pipe_4;
en_aa_r = en_aa.bits.pipe_4;
break;
case 5:
en_rx_r = en_rxaddr.bits.pipe_5;
en_aa_r = en_aa.bits.pipe_5;
break;
default:
en_rx_r = 0;
en_aa_r = 0;
break;
}
return (uint8_t)(en_aa_r << 1) + en_rx_r;
}
uint8_t hal_nrf_get_auto_retr_status(void)
{
return hal_nrf_read_reg(OBSERVE_TX);
}
uint8_t hal_nrf_get_packet_lost_ctr(void)
{
return ((hal_nrf_read_reg(OBSERVE_TX) & (BIT_7|BIT_6|BIT_5|BIT_4)) >> 4);
}
uint8_t hal_nrf_get_rx_payload_width(uint8_t pipe_num)
{
uint8_t pw;
switch (pipe_num)
{
case 0:
pw = hal_nrf_read_reg (RX_PW_P0);
break;
case 1:
pw = hal_nrf_read_reg (RX_PW_P1);
break;
case 2:
pw = hal_nrf_read_reg (RX_PW_P2);
break;
case 3:
pw = hal_nrf_read_reg (RX_PW_P3);
break;
case 4:
pw = hal_nrf_read_reg (RX_PW_P4);
break;
case 5:
pw = hal_nrf_read_reg (RX_PW_P5);
break;
default:
pw = 0;
break;
}
return pw;
}
void hal_nrf_set_rf_channel(uint8_t channel)
{
rf_ch_t rf_ch;
rf_ch.bits.rf_ch = channel;
hal_nrf_write_reg (RF_CH, rf_ch.value);
}
void hal_nrf_set_output_power(hal_nrf_output_power_t power)
{
rf_setup_t rf_setup;
rf_setup.value = hal_nrf_read_reg (RF_SETUP);
rf_setup.bits.rf_pwr = (uint8_t)power;
hal_nrf_write_reg (RF_SETUP, rf_setup.value);
}
void hal_nrf_set_datarate(hal_nrf_datarate_t datarate)
{
rf_setup_t rf_setup;
rf_setup.value = hal_nrf_read_reg (RF_SETUP);
switch (datarate)
{
case HAL_NRF_250KBPS:
rf_setup.bits.rf_dr_low = 1;
rf_setup.bits.rf_dr_high = 0;
break;
case HAL_NRF_1MBPS:
rf_setup.bits.rf_dr_low = 0;
rf_setup.bits.rf_dr_high = 0;
break;
case HAL_NRF_2MBPS:
default:
rf_setup.bits.rf_dr_low = 0;
rf_setup.bits.rf_dr_high = 1;
break;
}
hal_nrf_write_reg (RF_SETUP, rf_setup.value);
}
bool hal_nrf_rx_fifo_empty(void)
{
if(hal_nrf_get_rx_data_source()==7)
{
return true;
}
else
{
return false;
}
}
bool hal_nrf_rx_fifo_full(void)
{
return (bool)((hal_nrf_read_reg(FIFO_STATUS)>> RX_EMPTY) & 1);
}
bool hal_nrf_tx_fifo_empty(void)
{
return (bool)((hal_nrf_read_reg(FIFO_STATUS) >> TX_EMPTY) & 1);
}
bool hal_nrf_tx_fifo_full(void)
{
return (bool)((hal_nrf_read_reg(FIFO_STATUS) >> TX_FIFO_FULL) & 1);
}
uint8_t hal_nrf_get_tx_fifo_status(void)
{
return ((hal_nrf_read_reg(FIFO_STATUS) & ((1<<TX_FIFO_FULL)|(1<<TX_EMPTY))) >> 4);
}
uint8_t hal_nrf_get_rx_fifo_status(void)
{
return (hal_nrf_read_reg(FIFO_STATUS) & ((1<<RX_FULL)|(1<<RX_EMPTY)));
}
uint8_t hal_nrf_get_fifo_status(void)
{
return hal_nrf_read_reg(FIFO_STATUS);
}
uint8_t hal_nrf_get_transmit_attempts(void)
{
return (hal_nrf_read_reg(OBSERVE_TX) & (BIT_3|BIT_2|BIT_1|BIT_0));
}
bool hal_nrf_get_carrier_detect(void)
{
return hal_nrf_read_reg(CD) & 1;
}
void hal_nrf_activate_features(void)
{return;}
void hal_nrf_setup_dynamic_payload (uint8_t setup)
{
en_pipes_t dynpd;
dynpd.value = setup & ~0xC0;
hal_nrf_write_reg (DYNPD, dynpd.value);
}
void hal_nrf_enable_dynamic_payload(bool enable)
{
feature_t feature;
feature.value = hal_nrf_read_reg (FEATURE);
feature.bits.en_dpl = (enable) ? 1 : 0;
hal_nrf_write_reg (FEATURE, feature.value);
}
void hal_nrf_enable_ack_payload(bool enable)
{
feature_t feature;
feature.value = hal_nrf_read_reg (FEATURE);
feature.bits.en_ack_pay = (enable) ? 1 : 0;
hal_nrf_write_reg (FEATURE, feature.value);
}
void hal_nrf_enable_dynamic_ack(bool enable)
{
feature_t feature;
feature.value = hal_nrf_read_reg (FEATURE);
feature.bits.en_dyn_ack = (enable) ? 1 : 0;
hal_nrf_write_reg (FEATURE, feature.value);
}
void hal_nrf_write_tx_payload(const uint8_t *tx_pload, uint8_t length)
{
hal_nrf_write_multibyte_reg(W_TX_PAYLOAD, tx_pload, length);
}
void hal_nrf_write_tx_payload_noack(const uint8_t *tx_pload, uint8_t length)
{
hal_nrf_write_multibyte_reg(W_TX_PAYLOAD_NOACK, tx_pload, length);
}
void hal_nrf_write_ack_payload(uint8_t pipe, const uint8_t *tx_pload, uint8_t length)
{
hal_nrf_write_multibyte_reg(W_ACK_PAYLOAD | pipe, tx_pload, length);
}
uint8_t hal_nrf_read_rx_payload_width()
{
return hal_nrf_read_reg(R_RX_PL_WID);
}
uint16_t hal_nrf_read_rx_payload(uint8_t *rx_pload)
{
return hal_nrf_read_multibyte_reg(UINT8(HAL_NRF_RX_PLOAD), rx_pload);
}
uint8_t hal_nrf_get_rx_data_source(void)
{
return ((hal_nrf_nop() & (BIT_3|BIT_2|BIT_1)) >> 1);
}
void hal_nrf_reuse_tx(void)
{
CSN_LOW();
hal_nrf_rw(REUSE_TX_PL);
CSN_HIGH();
}
bool hal_nrf_get_reuse_tx_status(void)
{
return (bool)((hal_nrf_get_fifo_status() & (1<<TX_REUSE)) >> TX_REUSE);
}
void hal_nrf_flush_rx(void)
{
CSN_LOW();
hal_nrf_rw(FLUSH_RX);
CSN_HIGH();
}
void hal_nrf_flush_tx(void)
{
CSN_LOW();
hal_nrf_rw(FLUSH_TX);
CSN_HIGH();
}
uint8_t hal_nrf_nop(void)
{
uint8_t retval;
CSN_LOW();
retval = hal_nrf_rw(NOP);
CSN_HIGH();
return retval;
}
void hal_nrf_set_pll_mode(bool pll_lock)
{
rf_setup_t rf_setup;
rf_setup.value = hal_nrf_read_reg (RF_SETUP);
rf_setup.bits.pll_lock = (pll_lock) ? 1 : 0;
hal_nrf_write_reg(RF_SETUP, rf_setup.value);
}
uint8_t hal_nrf_get_rssi(void)
{
agc_config_t agc_config;
uint8_t value[2];
hal_nrf_read_multibyte_reg(AGC_CONFIG, value);
agc_config.value = ((value[1]) | (value[0] << 8));
return UINT8(agc_config.bits.lnb_out);
}
void hal_nrf_enable_continious_wave (bool enable)
{
rf_setup_t rf_setup;
rf_setup.value = hal_nrf_read_reg (RF_SETUP);
rf_setup.bits.cont_wave = (enable ? 1 : 0);
hal_nrf_write_reg(RF_SETUP, rf_setup.value);
}
uint8_t hal_nrf_read_reg(uint8_t reg)
{
uint8_t temp;
CSN_LOW();
hal_nrf_rw(reg);
temp = hal_nrf_rw(0);
CSN_HIGH();
return temp;
}
uint8_t hal_nrf_write_reg(uint8_t reg, uint8_t value)
{
uint8_t retval;
CSN_LOW();
retval = hal_nrf_rw(W_REGISTER + reg);
hal_nrf_rw(value);
CSN_HIGH();
return retval;
}
uint16_t hal_nrf_read_multibyte_reg(uint8_t reg, uint8_t *pbuf)
{
uint8_t ctr, length;
switch(reg)
{
case HAL_NRF_PIPE0:
case HAL_NRF_PIPE1:
case HAL_NRF_TX:
length = ctr = hal_nrf_get_address_width();
CSN_LOW();
hal_nrf_rw(RX_ADDR_P0 + reg);
break;
case HAL_NRF_RX_PLOAD:
if( (reg = hal_nrf_get_rx_data_source()) < 7)
{
length = ctr = hal_nrf_read_rx_payload_width();
CSN_LOW();
hal_nrf_rw(R_RX_PAYLOAD);
}
else
{
ctr = length = 0;
}
break;
case AGC_CONFIG:
ctr = length = 2;
CSN_LOW();
hal_nrf_rw (AGC_CONFIG);
break;
default:
ctr = length = 0;
break;
}
while(ctr--)
{
*pbuf++ = hal_nrf_rw(0);
}
CSN_HIGH();
return (((uint16_t) reg << 8) | length);
}
void hal_nrf_write_multibyte_reg(uint8_t cmd, const uint8_t *pbuf, uint8_t length)
{
CSN_LOW();
hal_nrf_rw(cmd);
while(length--)
{
hal_nrf_rw(*pbuf++);
}
CSN_HIGH();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -