?? nrf24l01.c
字號:
//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.
void nrf24l01_set_as_rx_param(bool rx_active_mode, unsigned char config)
{
config |= nrf24l01_CONFIG_PRIM_RX;
if((config & nrf24l01_CONFIG_PWR_UP) != 0)
nrf24l01_power_up_param(rx_active_mode, config);
else
nrf24l01_power_down_param(config);
}
//takes a 24L01 that is already in RX standby mode and puts it in active RX mode
void nrf24l01_rx_standby_to_active()
{
nrf24l01_set_ce();
}
//takes a 24L01 that is already in active RX mode and puts it in RX standy mode
void nrf24l01_rx_active_to_standby()
{
nrf24l01_clear_ce();
}
//sets up the 24L01 as a transmitter
//this function takes the existing contents of the CONFIG register and simply
// clears the PRIM_RX bit in the CONFIG register.
//note: if the read value of the CONFIG register already has the PRIM_RX bit cleared, this
// function exits in order to not make an unecessary register write.
void nrf24l01_set_as_tx()
{
unsigned char config;
nrf24l01_read_register(nrf24l01_CONFIG, &config, 1);
if((config & nrf24l01_CONFIG_PRIM_RX) == 0)
return;
config &= (~nrf24l01_CONFIG_PRIM_RX);
nrf24l01_write_register(nrf24l01_CONFIG, &config, 1);
nrf24l01_clear_ce();
}
//sets up the 24L01 as a transmitter
//this function allows the user to set the contents of the CONFIG register, but the function
// clears the PRIM_RX bit in the CONFIG register, so the user does not need to.
void nrf24l01_set_as_tx_param(unsigned char config)
{
config &= ~(nrf24l01_CONFIG_PRIM_RX);
if((config & nrf24l01_CONFIG_PWR_UP) != 0)
nrf24l01_power_up_param(false, config);
else
nrf24l01_power_down_param(config);
}
//executes the W_REGISTER SPI operation
//unsigned char regnumber indicates the register number assigned by the nrf24l01 specification.
// For regnumber values, see section titled "register definitions" in nrf24l01.h.
//unsigned char * data should be of size 1 for all register writes except for RX_ADDR_P0, RX_ADDR_P1,
// and TX_ADDR. The size of data should be set according to the user-specified size of the address
// length for the register the address is being sent to.
//unsigned int len is always the size of unsigned char * data. For example, if data is declared as
// data[6], len should equal 6.
//returns the value of the STATUS register
unsigned char nrf24l01_write_register(unsigned char regnumber, unsigned char * data, unsigned int len)
{
return nrf24l01_execute_command(nrf24l01_W_REGISTER | (regnumber & nrf24l01_W_REGISTER_DATA), data, len, false);
}
//executes the R_REGISTER SPI operation
//unsigned char regnumber indicates the register number assigned by the nrf24l01 specification.
// For regnumber values, see section titled "register definitions" in nrf24l01.h.
//unsigned char * data should be of size 1 for all register writes except for RX_ADDR_P0, RX_ADDR_P1,
// and TX_ADDR. The size of data should be set according to the user-specified size of the address
// length for the register the address is being read from.
//unsigned int len is always the size of unsigned char * data. For example, if data is declared as
// data[6], len = 6.
//returns the value of the STATUS register
unsigned char nrf24l01_read_register(unsigned char regnumber, unsigned char * data, unsigned int len)
{
return nrf24l01_execute_command(regnumber & nrf24l01_R_REGISTER_DATA, data, len, true);
}
//executes the W_TX_PAYLOAD operation
//unsigned char * data is the actual payload to be sent to the nrf24l01.
//unsigned int len is the length of the payload being sent (this should be sized
// according to the payload length specified by the receiving nrf24l01).
//if bool transmit is true, the nrf24l01 immediately transmits the data in the payload.
// if false, the user must use the nrf24l01_transmit() function to send the payload.
//returns the value of the STATUS register
unsigned char nrf24l01_write_tx_payload(unsigned char * data, unsigned int len, bool transmit)
{
unsigned char status;
status = nrf24l01_execute_command(nrf24l01_W_TX_PAYLOAD, data, len, false);
if(transmit == true)
nrf24l01_transmit();
return status;
}
//executes the R_RX_PAYLOAD instruction
//unsigned char * data is the actual payload that has been received by the nrf24l01.
// The user must size data according to the payload width specified to the nrf24l01.
// This variable is filled by this function, so individual byte values need not be
// initialized by the user.
//unsigned int len is the length of the payload being clocked out of the nrf24l01 (this
// should be sized according to the payload length specified to the nrf24l01).
//returns the value of the STATUS register
unsigned char nrf24l01_read_rx_payload(unsigned char * data, unsigned int len)
{
unsigned char status;
nrf24l01_clear_ce();
status = nrf24l01_execute_command(nrf24l01_R_RX_PAYLOAD, data, len, true);
nrf24l01_set_ce();
return status;
}
//executes the FLUSH_TX SPI operation
//this funciton empties the contents of the TX FIFO
//returns the value of the STATUS register
unsigned char nrf24l01_flush_tx()
{
return nrf24l01_execute_command(nrf24l01_FLUSH_TX, NULL, 0, true);
}
//executes the FLUSH_RX SPI operation
//this funciton empties the contents of the RX FIFO
//returns the value of the STATUS register
unsigned char nrf24l01_flush_rx()
{
return nrf24l01_execute_command(nrf24l01_FLUSH_RX, NULL, 0, true);
}
//executes the REUSE_TX_PL SPI operation
//this funciton allows the user to constantly send a packet repeatedly when issued.
//returns the value of the STATUS register
unsigned char nrf24l01_reuse_tx_pl()
{
return nrf24l01_execute_command(nrf24l01_REUSE_TX_PL, NULL, 0, true);
}
//executes the FLUSH_TX SPI operation
//this funciton does nothing
//returns the value of the STATUS register
unsigned char nrf24l01_nop()
{
return nrf24l01_execute_command(nrf24l01_NOP, NULL, 0, true);
}
//transmits the current tx payload
void nrf24l01_transmit()
{
nrf24l01_set_ce();
delay_us(10);
nrf24l01_clear_ce();
}
//clears the pin on the host microcontroller that is attached to the 24l01's CE pin
void nrf24l01_clear_ce()
{
nrf24l01_CE_IOREGISTER &= ~nrf24l01_CE_PINMASK;
}
//sets the pin on the host microcontroller that is attached to the 24l01's CE pin
void nrf24l01_set_ce()
{
nrf24l01_CE_IOREGISTER |= nrf24l01_CE_PINMASK;
}
//returns true if CE is high, false if not
bool nrf24l01_ce_pin_active()
{
if((nrf24l01_CE_IOREGISTER & nrf24l01_CE_PINMASK) != 0)
return true;
else
return false;
}
//sets the pin on the host microcontroller that is attached to the 24l01's CSN pin
void nrf24l01_clear_csn()
{
nrf24l01_CSN_IOREGISTER &= ~nrf24l01_CSN_PINMASK;
}
//clears the pin on the host microcontroller that is attached to the 24l01's CSN pin
void nrf24l01_set_csn()
{
nrf24l01_CSN_IOREGISTER |= nrf24l01_CSN_PINMASK;
}
//returns true if CSN is high, false if not
bool nrf24l01_csn_pin_active()
{
if((nrf24l01_CSN_IOREGISTER & nrf24l01_CSN_PINMASK) != 0)
return true;
else
return false;
}
//sets the TX address in the TX_ADDR register
//unsigned char * address is the actual address to be used. It should be sized
// according to the tx_addr length specified to the nrf24l01.
//unsigned int len is the length of the address. Its value should be specified
// according to the tx_addr length specified to the nrf24l01.
void nrf24l01_set_tx_addr(unsigned char * address, unsigned int len)
{
nrf24l01_write_register(nrf24l01_TX_ADDR, address, len);
}
//sets the RX address in the RX_ADDR register that is offset by rxpipenum
//unsigned char * address is the actual address to be used. It should be sized
// according to the rx_addr length that is being filled.
//unsigned int len is the length of the address. Its value should be specified
// according to the rx_addr length specified to the nrf24l01.
//unsigned char rxpipenum is the pipe number (zero to five) whose address is being
// specified. If an invalid address (greater than five) is supplied, the function
// does nothing.
void nrf24l01_set_rx_addr(unsigned char * address, unsigned int len, unsigned char rxpipenum)
{
if(rxpipenum > 5)
return;
nrf24l01_write_register(nrf24l01_RX_ADDR_P0 + rxpipenum, address, len);
}
//sets the RX payload width on the pipe offset by rxpipenum
//unsigned char payloadwidth is the length of the payload for the pipe referenced in
// rxpipenum. It must be less than or equal to 32. If an invalid payload width is
// specified, the function does nothing.
//unsigned char rxpipenum is the pipe number (zero to five) whose address is being
// specified. If an invalid address (greater than five) is supplied, the function
// does nothing.
void nrf24l01_set_rx_pw(unsigned char payloadwidth, unsigned char rxpipenum)
{
if((rxpipenum > 5) || (payloadwidth > 32))
return;
nrf24l01_write_register(nrf24l01_RX_PW_P0 + rxpipenum, &payloadwidth, 1);
}
//gets the RX payload width on the pipe offset by rxpipenum
//unsigned char rxpipenum is the pipe number (zero to five) whose address is being
// specified. If an invalid address (greater than five) is supplied, the function
// does nothing.
unsigned char nrf24l01_get_rx_pw(unsigned char rxpipenum)
{
unsigned char data;
if((rxpipenum > 5))
return;
nrf24l01_read_register(nrf24l01_RX_PW_P0 + rxpipenum, &data, 1);
return data;
}
//returns the value of the CONFIG register
unsigned char nrf24l01_get_config()
{
unsigned char data;
nrf24l01_read_register(nrf24l01_CONFIG, &data, 1);
return data;
}
//sets the value of the CONFIG register
void nrf24l01_set_config(unsigned char config)
{
nrf24l01_write_register(nrf24l01_CONFIG, &config, 1);
}
//returns the current RF channel in RF_CH register
unsigned char nrf24l01_get_rf_ch()
{
unsigned char data;
nrf24l01_read_register(nrf24l01_RF_CH, &data, 1);
return data;
}
//unsigned char channel is the channel to be changed to.
void nrf24l01_set_rf_ch(unsigned char channel)
{
unsigned char data;
data = channel & ~nrf24l01_RF_CH_RESERVED;
nrf24l01_write_register(nrf24l01_RF_CH, &data, 1);
}
//returns the value of the OBSERVE_TX register
unsigned char nrf24l01_get_observe_tx()
{
unsigned char data;
nrf24l01_read_register(nrf24l01_OBSERVE_TX, &data, 1);
return data;
}
//returns the current PLOS_CNT value in OBSERVE_TX register
unsigned char nrf24l01_get_plos_cnt()
{
unsigned char data;
nrf24l01_read_register(nrf24l01_OBSERVE_TX, &data, 1);
return ((data & nrf24l01_OBSERVE_TX_PLOS_CNT) >> 4);
}
//clears the PLOS_CNT field of the OBSERVE_TX register
//this function makes a read of the current value of RF_CH and
// simply writes it back to the register, clearing PLOS_CNT
void nrf24l01_clear_plos_cnt()
{
unsigned char data;
nrf24l01_read_register(nrf24l01_RF_CH, &data, 1);
nrf24l01_write_register(nrf24l01_RF_CH, &data, 1);
}
//clears the PLOS_CNT field of the OBSERVE_TX register
//this function allows the user to set the RF_CH register by using
// the argument in the function during the PLOS_CNT clearing process
void nrf24l01_clear_plos_cnt_param(unsigned char rf_ch)
{
nrf24l01_write_register(nrf24l01_RF_CH, &rf_ch, 1);
}
//returns the current ARC_CNT value in OBSERVE_TX register
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -