253 lines
7.2 KiB
C
253 lines
7.2 KiB
C
|
/*
|
||
|
* ----------------------------------------------------------------------------
|
||
|
* “THE COFFEEWARE LICENSE” (Revision 1):
|
||
|
* <ihsan@kehribar.me> wrote this file. As long as you retain this notice you
|
||
|
* can do whatever you want with this stuff. If we meet some day, and you think
|
||
|
* this stuff is worth it, you can buy me a coffee in return.
|
||
|
* -----------------------------------------------------------------------------
|
||
|
* This library is based on this library:
|
||
|
* https://github.com/aaronds/arduino-nrf24l01
|
||
|
* Which is based on this library:
|
||
|
* http://www.tinkerer.eu/AVRLib/nRF24L01
|
||
|
* -----------------------------------------------------------------------------
|
||
|
*/
|
||
|
#ifndef NRF24
|
||
|
#define NRF24
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include <avr/io.h>
|
||
|
|
||
|
#ifdef TURTLE
|
||
|
#define NRF24_IO_PORT PORTB
|
||
|
#define NRF24_IO_PINREG PINB
|
||
|
#define NRF24_IO_DDR DDRB
|
||
|
#else
|
||
|
#define NRF24_IO_PORT PORTC
|
||
|
#define NRF24_IO_PINREG PINC
|
||
|
#define NRF24_IO_DDR DDRC
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define NRF24_CE_PIN 0
|
||
|
#define NRF24_CSN_PIN 1
|
||
|
#define NRF24_SCK_PIN 2
|
||
|
#define NRF24_MOSI_PIN 3
|
||
|
#define NRF24_MISO_PIN 4
|
||
|
|
||
|
|
||
|
/* IO Helpers */
|
||
|
#define nrf24_set_bit(reg,bit) reg |= (1<<bit)
|
||
|
#define nrf24_clr_bit(reg,bit) reg &= ~(1<<bit)
|
||
|
#define nrf24_check_bit(reg,bit) (reg&(1<<bit))
|
||
|
|
||
|
/* Memory Map */
|
||
|
#define CONFIG 0x00
|
||
|
#define EN_AA 0x01
|
||
|
#define EN_RXADDR 0x02
|
||
|
#define SETUP_AW 0x03
|
||
|
#define SETUP_RETR 0x04
|
||
|
#define RF_CH 0x05
|
||
|
#define RF_SETUP 0x06
|
||
|
#define STATUS 0x07
|
||
|
#define OBSERVE_TX 0x08
|
||
|
#define CD 0x09
|
||
|
#define RX_ADDR_P0 0x0A
|
||
|
#define RX_ADDR_P1 0x0B
|
||
|
#define RX_ADDR_P2 0x0C
|
||
|
#define RX_ADDR_P3 0x0D
|
||
|
#define RX_ADDR_P4 0x0E
|
||
|
#define RX_ADDR_P5 0x0F
|
||
|
#define TX_ADDR 0x10
|
||
|
#define RX_PW_P0 0x11
|
||
|
#define RX_PW_P1 0x12
|
||
|
#define RX_PW_P2 0x13
|
||
|
#define RX_PW_P3 0x14
|
||
|
#define RX_PW_P4 0x15
|
||
|
#define RX_PW_P5 0x16
|
||
|
#define FIFO_STATUS 0x17
|
||
|
#define DYNPD 0x1C
|
||
|
|
||
|
/* Bit Mnemonics */
|
||
|
|
||
|
/* configuratio nregister */
|
||
|
#define MASK_RX_DR 6
|
||
|
#define MASK_TX_DS 5
|
||
|
#define MASK_MAX_RT 4
|
||
|
#define EN_CRC 3
|
||
|
#define CRCO 2
|
||
|
#define PWR_UP 1
|
||
|
#define PRIM_RX 0
|
||
|
|
||
|
/* enable auto acknowledgment */
|
||
|
#define ENAA_P5 5
|
||
|
#define ENAA_P4 4
|
||
|
#define ENAA_P3 3
|
||
|
#define ENAA_P2 2
|
||
|
#define ENAA_P1 1
|
||
|
#define ENAA_P0 0
|
||
|
|
||
|
/* enable rx addresses */
|
||
|
#define ERX_P5 5
|
||
|
#define ERX_P4 4
|
||
|
#define ERX_P3 3
|
||
|
#define ERX_P2 2
|
||
|
#define ERX_P1 1
|
||
|
#define ERX_P0 0
|
||
|
|
||
|
/* setup of address width */
|
||
|
#define AW 0 /* 2 bits */
|
||
|
|
||
|
/* setup of auto re-transmission */
|
||
|
#define ARD 4 /* 4 bits */
|
||
|
#define ARC 0 /* 4 bits */
|
||
|
|
||
|
/* RF setup register */
|
||
|
#define PLL_LOCK 4
|
||
|
#define RF_DR 3
|
||
|
#define RF_PWR 1 /* 2 bits */
|
||
|
|
||
|
/* general status register */
|
||
|
#define RX_DR 6
|
||
|
#define TX_DS 5
|
||
|
#define MAX_RT 4
|
||
|
#define RX_P_NO 1 /* 3 bits */
|
||
|
#define TX_FULL 0
|
||
|
|
||
|
/* transmit observe register */
|
||
|
#define PLOS_CNT 4 /* 4 bits */
|
||
|
#define ARC_CNT 0 /* 4 bits */
|
||
|
|
||
|
/* fifo status */
|
||
|
#define TX_REUSE 6
|
||
|
#define FIFO_FULL 5
|
||
|
#define TX_EMPTY 4
|
||
|
#define RX_FULL 1
|
||
|
#define RX_EMPTY 0
|
||
|
|
||
|
/* dynamic length */
|
||
|
#define DPL_P0 0
|
||
|
#define DPL_P1 1
|
||
|
#define DPL_P2 2
|
||
|
#define DPL_P3 3
|
||
|
#define DPL_P4 4
|
||
|
#define DPL_P5 5
|
||
|
|
||
|
/* Instruction Mnemonics */
|
||
|
#define R_REGISTER 0x00 /* last 4 bits will indicate reg. address */
|
||
|
#define W_REGISTER 0x20 /* last 4 bits will indicate reg. address */
|
||
|
#define REGISTER_MASK 0x1F
|
||
|
#define R_RX_PAYLOAD 0x61
|
||
|
#define W_TX_PAYLOAD 0xA0
|
||
|
#define FLUSH_TX 0xE1
|
||
|
#define FLUSH_RX 0xE2
|
||
|
#define REUSE_TX_PL 0xE3
|
||
|
#define ACTIVATE 0x50
|
||
|
#define R_RX_PL_WID 0x60
|
||
|
#define NOP 0xFF
|
||
|
|
||
|
#define LOW 0
|
||
|
#define HIGH 1
|
||
|
|
||
|
#define nrf24_ADDR_LEN 5
|
||
|
#define nrf24_CONFIG ((1<<EN_CRC)|(0<<CRCO))
|
||
|
|
||
|
#define NRF24_TRANSMISSON_OK 0
|
||
|
#define NRF24_MESSAGE_LOST 1
|
||
|
|
||
|
/* IO functions */
|
||
|
void nrf24_setupPins();
|
||
|
void nrf24_ce_digitalWrite(uint8_t state);
|
||
|
void nrf24_csn_digitalWrite(uint8_t state);
|
||
|
void nrf24_sck_digitalWrite(uint8_t state);
|
||
|
void nrf24_mosi_digitalWrite(uint8_t state);
|
||
|
uint8_t nrf24_miso_digitalRead();
|
||
|
|
||
|
/* adjustment functions */
|
||
|
void nrf24_init();
|
||
|
void nrf24_rx_address(uint8_t* adr);
|
||
|
void nrf24_tx_address(uint8_t* adr);
|
||
|
void nrf24_config(uint8_t channel, uint8_t pay_length);
|
||
|
|
||
|
/* state check functions */
|
||
|
uint8_t nrf24_dataReady();
|
||
|
uint8_t nrf24_isSending();
|
||
|
uint8_t nrf24_getStatus();
|
||
|
uint8_t nrf24_rxFifoEmpty();
|
||
|
|
||
|
/* core TX / RX functions */
|
||
|
void nrf24_send(uint8_t* value);
|
||
|
void nrf24_getData(uint8_t* data);
|
||
|
|
||
|
/* use in dynamic length mode */
|
||
|
uint8_t nrf24_payloadLength();
|
||
|
|
||
|
/* post transmission analysis */
|
||
|
uint8_t nrf24_lastMessageStatus();
|
||
|
uint8_t nrf24_retransmissionCount();
|
||
|
|
||
|
/* Returns the payload length */
|
||
|
uint8_t nrf24_payload_length();
|
||
|
|
||
|
/* power management */
|
||
|
void nrf24_powerUpRx();
|
||
|
void nrf24_powerUpTx();
|
||
|
void nrf24_powerDown();
|
||
|
|
||
|
/* low level interface ... */
|
||
|
uint8_t spi_transfer(uint8_t tx);
|
||
|
void nrf24_transmitSync(uint8_t* dataout,uint8_t len);
|
||
|
void nrf24_transferSync(uint8_t* dataout,uint8_t* datain,uint8_t len);
|
||
|
void nrf24_configRegister(uint8_t reg, uint8_t value);
|
||
|
void nrf24_readRegister(uint8_t reg, uint8_t* value, uint8_t len);
|
||
|
void nrf24_writeRegister(uint8_t reg, uint8_t* value, uint8_t len);
|
||
|
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
/* You should implement the platform spesific functions in your code */
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
/* In this function you should do the following things:
|
||
|
* - Set MISO pin input
|
||
|
* - Set MOSI pin output
|
||
|
* - Set SCK pin output
|
||
|
* - Set CSN pin output
|
||
|
* - Set CE pin output */
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
extern void nrf24_setupPins();
|
||
|
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
/* nrf24 CE pin control function
|
||
|
* - state:1 => Pin HIGH
|
||
|
* - state:0 => Pin LOW */
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
extern void nrf24_ce_digitalWrite(uint8_t state);
|
||
|
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
/* nrf24 CE pin control function
|
||
|
* - state:1 => Pin HIGH
|
||
|
* - state:0 => Pin LOW */
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
extern void nrf24_csn_digitalWrite(uint8_t state);
|
||
|
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
/* nrf24 SCK pin control function
|
||
|
* - state:1 => Pin HIGH
|
||
|
* - state:0 => Pin LOW */
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
extern void nrf24_sck_digitalWrite(uint8_t state);
|
||
|
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
/* nrf24 MOSI pin control function
|
||
|
* - state:1 => Pin HIGH
|
||
|
* - state:0 => Pin LOW */
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
extern void nrf24_mosi_digitalWrite(uint8_t state);
|
||
|
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
/* nrf24 MISO pin read function
|
||
|
/* - returns: Non-zero if the pin is high */
|
||
|
/* -------------------------------------------------------------------------- */
|
||
|
extern uint8_t nrf24_miso_digitalRead();
|
||
|
|
||
|
#endif
|