/* * 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_H_ #define NRF905_H_ #include #include "nRF905_config.h" //#define nRF905_packet nrf905_packet_s; /** * \enum nRF905_radio_state_t * \brief Radio state */ typedef enum { NRF905_RADIO_STATE_POWER_DOWN, /**< Power down mode */ NRF905_RADIO_STATE_STANDBY, /**< standby mode*/ NRF905_RADIO_STATE_RX, /**< Receive mode */ NRF905_RADIO_STATE_RX_END, /**< Received data available */ NRF905_RADIO_STATE_TX, /**< Transmitting started */ NRF905_RADIO_STATE_TX_END, /**< Transmitting finished */ } nRF905_radio_state_t; /** * \enum nRF905_band_t * \brief Frequency bands. */ typedef enum { // NOTE: // When using NRF905_BAND_868 and NRF905_BAND_915 for calculating channel (NRF905_CALC_CHANNEL(f, b)) they should be value 0x01, // but when using them for setting registers their value should be 0x02. // They're defined as 0x02 here so when used for calculating channel they're right shifted by 1 NRF905_BAND_433 = 0x00, /**< 433MHz band */ NRF905_BAND_868 = 0x02, /**< 868MHz band */ NRF905_BAND_915 = 0x02 /**< 915MHz band */ } nRF905_band_t; /** * \enum nRF905_pwr_t * \brief Output power (n means negative, n10 = -10). */ typedef enum { NRF905_PWR_n10 = 0x00, /**< -10dBm = 100uW */ NRF905_PWR_n2 = 0x04, /**< -2dBm = 631uW */ NRF905_PWR_6 = 0x08, /**< 6dBm = 4mW */ NRF905_PWR_10 = 0x0C /**< 10dBm = 10mW */ } nRF905_pwr_t; /** * \enum nRF905_low_rx_t * \brief Save a few mA by reducing receive sensitivity. */ typedef enum { NRF905_LOW_RX_DISABLE = 0x00, /**< Disable low power receive */ NRF905_LOW_RX_ENABLE = 0x10 /**< Enable low power receive */ } nRF905_low_rx_t; /** * \enum nRF905_auto_retran_t * \brief Constantly retransmit payload while in transmit mode. * * Can be useful in areas with lots of interference, but you'll need to make sure you can differentiate between re-transmitted packets and new packets (like an ID number). * * Other transmissions will be blocked if collision avoidance is enabled. */ typedef enum { NRF905_AUTO_RETRAN_DISABLE = 0x00, /**< Disable auto re-transmit */ NRF905_AUTO_RETRAN_ENABLE = 0x20 /**< Enable auto re-transmit */ } nRF905_auto_retran_t; /** * \enum nRF905_outclk_t * \brief Output a clock signal on pin 3 of IC. */ typedef enum { NRF905_OUTCLK_DISABLE = 0x00, /**< Disable output clock */ NRF905_OUTCLK_4MHZ = 0x04, /**< 4MHz clock */ NRF905_OUTCLK_2MHZ = 0x05, /**< 2MHz clock */ NRF905_OUTCLK_1MHZ = 0x06, /**< 1MHz clock */ NRF905_OUTCLK_500KHZ = 0x07, /**< 500KHz clock */ } nRF905_outclk_t; /** * \enum nRF905_crc_t * \brief CRC Checksum. */ typedef enum { NRF905_CRC_DISABLE = 0x00, /**< Disable CRC */ NRF905_CRC_8 = 0x40, /**< 8bit CRC */ NRF905_CRC_16 = 0xC0, /**< 16bit CRC */ } nRF905_crc_t; /** * \enum nRF905_addr_size_t * \brief Address size. */ typedef enum { NRF905_ADDR_SIZE_1 = 0x01, /**< 1 byte */ NRF905_ADDR_SIZE_4 = 0x04, /**< 4 bytes */ } nRF905_addr_size_t; // Setting options //#define NRF905_BAND_433 0x00 //#define NRF905_BAND_868 0x02 //#define NRF905_BAND_915 0x02 //#define NRF905_PWR_n10 0x00 //#define NRF905_PWR_n2 0x04 //#define NRF905_PWR_6 0x08 //#define NRF905_PWR_10 0x0C //#define NRF905_LOW_RX_ENABLE 0x10 //#define NRF905_LOW_RX_DISABLE 0x00 //#define NRF905_AUTO_RETRAN_ENABLE 0x20 //#define NRF905_AUTO_RETRAN_DISABLE 0x00 //#define NRF905_OUTCLK_DISABLE 0x00 //#define NRF905_OUTCLK_4MHZ 0x04 //#define NRF905_OUTCLK_2MHZ 0x05 //#define NRF905_OUTCLK_1MHZ 0x06 //#define NRF905_OUTCLK_500KHZ 0x07 //#define NRF905_CRC_DISABLE 0x00 //#define NRF905_CRC_8 0x40 //#define NRF905_CRC_16 0xC0 //#define NRF905_ADDR_SIZE_1 0x01 //#define NRF905_ADDR_SIZE_4 0x04 /** * Maximum payload size */ #define NRF905_MAX_PAYLOAD 32 void nRF905_setConfigReg0(uint8_t value); void nRF905_setConfigReg1(uint8_t value); void nRF905_setConfigReg2(uint8_t value); void nRF905_setConfigReg9(uint8_t value); void nRF905_flushRecBuffer(void); uint8_t nRF905_getConfigReg(uint8_t reg); nRF905_radio_state_t nRF905_getStatus(void); /** * Initialise, must be called before anything else! * * @return (none) */ void nRF905_init(void); /** * Set frequency, workout the channel from the frequency * * 433MHz band: 422.4MHz - 473.5MHz, 100KHz steps * * 868/915MHz band: 844.8MHz - 947MHz, 200KHz steps * * @param [band] Frequency band * @param [freq] Frequency in Hz * @return (none) */ void nRF905_setFrequency(nRF905_band_t band, uint32_t freq); /** * Just set the channel, this skips having to workout the channel from the frequency * * @param [band] Frequency band * @param [channel] The channel (0 - 511) * @return (none) */ void nRF905_setChannel(nRF905_band_t band, uint16_t channel); #if 0 /** * Set auto retransmit * * @param [val] Enable/disable auto retransmit * @return (none) */ void nRF905_setAutoRetransmit(nRF905_auto_retran_t val); /** * Set low power receive * * @param [val] Enable/disable low power receive * @return (none) */ void nRF905_setLowRxPower(nRF905_low_rx_t val); /** * Set output power * * @param [val] Output power level * @return (none) */ void nRF905_setTransmitPower(nRF905_pwr_t val); /** * Set CRC * * @param [val] CRC Type * @return (none) */ void nRF905_setCRC(nRF905_crc_t val); /** * Set clock output * * @param [val] Clock out frequency * @return (none) */ void nRF905_setClockOut(nRF905_outclk_t val); #endif /** * Payload size * * @param [size] Payload size (1 - 32) * @return (none) */ void nRF905_setPayloadSizes(uint8_t size); //** //* Address size //* //* @param [size] Address size //* @return (none) //*/ //void nRF905_setAddressSize(nRF905_addr_size_t size); /** * Destination radio address * * @param [address] The address (usually a byte array of 1 or 4 bytes depending on NRF905_ADDR_SIZE) * @return (none) */ void nRF905_setTXAddress(uint8_t * address); /** * Address of this radio * * @param [address] The address (usually a byte array of 1 or 4 bytes depending on NRF905_ADDR_SIZE) * @return (none) */ void nRF905_setRXAddress(uint8_t * address); /** * Set payload data * * @param [data] Pointer to data * @param [len] How many bytes to copy (max NRF905_MAX_PAYLOAD) * @return false if the radio is currently transmitting something else, true otherwise */ uint8_t nRF905_setData(uint8_t * data, uint8_t len); /** * Send the payload. * * @return false if other transmissions are going on and collision detection is enabled or if the radio is currently transmitting, true if transmission has successfully began */ uint8_t nRF905_send(void); // //bool nRF905_sendPacket(nrf905_packet_s*); /** * Get current radio state, transmitting etc. * * @return Radio state */ nRF905_radio_state_t nRF905_getState(void); /** * Receive mode. If the radio is currently transmitting then receive mode will be entered once it has finished. * * @return (none) */ void nRF905_receive(void); /** * Get received payload if available. * * @param [data] Pointer to buffer to place data * @param [len] How many bytes to copy * @return false if no data available, otherwise true */ uint8_t nRF905_getData(uint8_t * data, uint8_t len); /** * Wake up into standby mode. * Will take 3ms to complete. * * @return (none) */ void nRF905_powerUp(void); /** * Sleep. * * @note Must call nRF905_powerUp() before transmitting or receiving again. * @return (none) */ void nRF905_powerDown(void); /** * Enter standby mode. * * @return (none) */ void nRF905_enterStandBy(void); /** * Leave standby and go into receive mode (same as just calling nRF905_receive()). * * @return (none) */ inline void nRF905_leaveStandBy(void) { nRF905_receive(); } /** * blah * * @return blah */ bool nRF905_receiveBusy(void); /** * See if airway is busy (carrier detect pin high). * * @return true if other transmissions detected, otherwise false */ inline bool nRF905_airwayBusy(void) { return digitalRead(CD); } /** * Disable data ready interrupt. * * If NRF905_INTERRUPTS is enabled then this function must be called before doing SPI communications with any other device. * * @return (none) */ inline void nRF905_interrupt_off(void) { #if NRF905_INTERRUPTS REG_EXTERNAL_INT &= ~_BV(BIT_EXTERNAL_INT); #endif } /** * Enable data ready interrupt. * * If NRF905_INTERRUPTS is enabled then this function must be called once you have finished doing SPI communications with another device. * * @return (none) */ inline void nRF905_interrupt_on(void) { #if NRF905_INTERRUPTS REG_EXTERNAL_INT |= _BV(BIT_EXTERNAL_INT); #endif } #endif /* NRF905_H_ */