121 lines
3.9 KiB
C
121 lines
3.9 KiB
C
/*
|
|
* Project: nRF905 AVR/Arduino Library/Driver
|
|
* Author: Zak Kemble, contact@zakkemble.co.uk
|
|
* Copyright: (C) 2013 by Zak Kemble
|
|
* License: GNU GPL v3 (see License.txt)
|
|
* Web: http://blog.zakkemble.co.uk/nrf905-avrarduino-librarydriver/
|
|
*/
|
|
|
|
#ifndef NRF905_DEFS_H_
|
|
#define NRF905_DEFS_H_
|
|
|
|
#define AM_IS_USED_HW (!NRF905_AM_SW && defined(AM))
|
|
#define POWER_UP() (digitalWrite(PWR_MODE, HIGH))
|
|
#define POWER_DOWN() (digitalWrite(PWR_MODE, LOW))
|
|
#define DISABLE_STANDBY_MODE() (digitalWrite(TRX_EN, HIGH))
|
|
#define ENABLE_STANDBY_MODE() (digitalWrite(TRX_EN, LOW))
|
|
#define SPI_SELECT() (digitalWrite(CSN, LOW))
|
|
#define SPI_DESELECT() (digitalWrite(CSN, HIGH))
|
|
#define RECEIVE_MODE() (digitalWrite(TX_EN, LOW))
|
|
#define TRANSMIT_MODE() (digitalWrite(TX_EN, HIGH))
|
|
#define spi_transfer(data) (SPI.transfer(data))
|
|
//#define spi_transfer_nr(data) (SPI.transfer(data))
|
|
|
|
// Instructions
|
|
#define NRF905_CMD_NOP 0xFF
|
|
#define NRF905_CMD_W_CONFIG 0x00
|
|
#define NRF905_CMD_R_CONFIG 0x10
|
|
#define NRF905_CMD_W_TX_PAYLOAD 0x20
|
|
#define NRF905_CMD_R_TX_PAYLOAD 0x21
|
|
#define NRF905_CMD_W_TX_ADDRESS 0x22
|
|
#define NRF905_CMD_R_TX_ADDRESS 0x23
|
|
#define NRF905_CMD_R_RX_PAYLOAD 0x24
|
|
#define NRF905_CMD_CHAN_CONFIG 0x80
|
|
|
|
// Registers
|
|
#define NRF905_REG_CHANNEL 0x00
|
|
//#define NRF905_REG_AUTO_RETRAN 0x01
|
|
//#define NRF905_REG_LOW_RX 0x01
|
|
//#define NRF905_REG_PWR 0x01
|
|
#define NRF905_REG_BAND 0x01
|
|
#define NRF905_REG_CRC 0x09
|
|
#define NRF905_REG_CLK 0x09
|
|
#define NRF905_REG_OUTCLK 0x09
|
|
#define NRF905_REG_OUTCLK_FREQ 0x09
|
|
#define NRF905_REG_RX_ADDRESS 0x05
|
|
#define NRF905_REG_RX_PAYLOAD_SIZE 0x03
|
|
#define NRF905_REG_TX_PAYLOAD_SIZE 0x04
|
|
#define NRF905_REG_ADDR_WIDTH 0x02
|
|
|
|
// Clock options
|
|
#define NRF905_CLK_4MHZ 0x00
|
|
#define NRF905_CLK_8MHZ 0x08
|
|
#define NRF905_CLK_12MHZ 0x10
|
|
#define NRF905_CLK_16MHZ 0x18
|
|
#define NRF905_CLK_20MHZ 0x20
|
|
|
|
// Register masks
|
|
#define NRF905_MASK_CHANNEL 0xFC
|
|
#define NRF905_MASK_AUTO_RETRAN ~(NRF905_AUTO_RETRAN_ENABLE | NRF905_AUTO_RETRAN_DISABLE) //0xDF
|
|
#define NRF905_MASK_LOW_RX ~(NRF905_LOW_RX_ENABLE | NRF905_LOW_RX_DISABLE) //0xEF
|
|
#define NRF905_MASK_PWR ~(NRF905_PWR_n10 | NRF905_PWR_n2 | NRF905_PWR_6 | NRF905_PWR_10) //0xF3
|
|
#define NRF905_MASK_BAND ~(NRF905_BAND_433 | NRF905_BAND_868 | NRF905_BAND_915) //0xFD
|
|
#define NRF905_MASK_CRC (uint8_t)(~(NRF905_CRC_DISABLE | NRF905_CRC_8 | NRF905_CRC_16)) //0x3F // typecast to stop compiler moaning about large integer truncation
|
|
#define NRF905_MASK_CLK ~(NRF905_CLK_4MHZ | NRF905_CLK_8MHZ | NRF905_CLK_12MHZ | NRF905_CLK_16MHZ | NRF905_CLK_20MHZ) //0xC7
|
|
#define NRF905_MASK_OUTCLK ~(NRF905_OUTCLK_DISABLE | NRF905_OUTCLK_4MHZ | NRF905_OUTCLK_2MHZ | NRF905_OUTCLK_1MHZ | NRF905_OUTCLK_500KHZ) // 0xF8
|
|
|
|
// Bit positions
|
|
#define NRF905_STATUS_DR 5
|
|
#define NRF905_STATUS_AM 7
|
|
|
|
#include "nRF905_config.h"
|
|
|
|
#if (NRF905_DR_SW && NRF905_INTERRUPTS)
|
|
#error "NRF905_INTERRUPTS and NRF905_DR_SW can not both be enabled"
|
|
#endif
|
|
|
|
// Workout channel from frequency & band
|
|
#define NRF905_CALC_CHANNEL(f, b) ((((f) / (1 + (b>>1))) - 422400000UL) / 100000UL)
|
|
|
|
#define CONCAT(a, b) a ## b
|
|
#define CONCAT2(a, b, c) a ## b ## c
|
|
|
|
#define INTCONCAT(num) CONCAT(INT, num)
|
|
#define ISCCONCAT(num, bit) CONCAT2(ISC, num, bit)
|
|
#define INTVECTCONCAT(num) CONCAT2(INT, num, _vect)
|
|
|
|
#ifndef REG_EXTERNAL_INT
|
|
#ifdef EIMSK
|
|
#define REG_EXTERNAL_INT EIMSK
|
|
#elif defined GICR
|
|
#define REG_EXTERNAL_INT GICR
|
|
#else
|
|
#define REG_EXTERNAL_INT GIMSK
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef REG_EXTERNAL_INT_CTL
|
|
#ifdef EICRA
|
|
#if INTERRUPT_NUM < 4
|
|
#define REG_EXTERNAL_INT_CTL EICRA
|
|
#else
|
|
#define REG_EXTERNAL_INT_CTL EICRB
|
|
#endif
|
|
#else
|
|
#define REG_EXTERNAL_INT_CTL MCUCR
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef BIT_EXTERNAL_INT
|
|
#define BIT_EXTERNAL_INT INTCONCAT(INTERRUPT_NUM)
|
|
#endif
|
|
|
|
#ifndef BIT_EXTERNAL_INT_CTL
|
|
#define BIT_EXTERNAL_INT_CTL (_BV(ISCCONCAT(INTERRUPT_NUM, 1))|_BV(ISCCONCAT(INTERRUPT_NUM, 0)))
|
|
#endif
|
|
|
|
#ifndef INT_VECTOR
|
|
#define INT_VECTOR INTVECTCONCAT(INTERRUPT_NUM)
|
|
#endif
|
|
|
|
#endif /* NRF905_DEFS_H_ */ |