diff --git a/RF24.cpp b/RF24.cpp index a7869d5..4fe07bb 100644 --- a/RF24.cpp +++ b/RF24.cpp @@ -380,7 +380,7 @@ uint8_t RF24::getPayloadSize(void) /****************************************************************************/ -#if !defined (MINIMAL) + static const char rf24_datarate_e_str_0[] PROGMEM = "1MBPS"; static const char rf24_datarate_e_str_1[] PROGMEM = "2MBPS"; @@ -414,7 +414,7 @@ static const char * const rf24_pa_dbm_e_str_P[] PROGMEM = { rf24_pa_dbm_e_str_2, rf24_pa_dbm_e_str_3, }; - +#if !defined (MINIMAL) void RF24::printDetails(void) { print_status(get_status()); @@ -1210,50 +1210,51 @@ void RF24::setRetries(uint8_t delay, uint8_t count) } +//ATTiny support code pulled in from https://github.com/jscrane/RF24 - - - -#if defined (ATTINY) - -#include "pins_arduino.h" - -#if defined( __AVR_ATtiny85__ ) -const static uint8_t _CS = PB4; -const static uint8_t _MOSI = PB1; -const static uint8_t _MISO = PB0; -const static uint8_t _SCK = PB2; +#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) +// see http://gammon.com.au/spi +# define DI 0 // D0, pin 5 Data In +# define DO 1 // D1, pin 6 Data Out (this is *not* MOSI) +# define USCK 2 // D2, pin 7 Universal Serial Interface clock +# define SS 3 // D3, pin 2 Slave Select +#elif defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) +// these depend on the core used (check pins_arduino.h) +// this is for jeelabs' one (based on google-code core) +# define DI 4 // PA6 +# define DO 5 // PA5 +# define USCK 6 // PA4 +# define SS 3 // PA7 #endif -#if defined( __AVR_ATtiny84__ ) -const static uint8_t _CS = 3; -const static uint8_t _MOSI = 5; -const static uint8_t _MISO = 4; -const static uint8_t _SCK = 6; -#endif - -SPIClass SPI; +#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) void SPIClass::begin() { - pinMode(_SCK, OUTPUT); - pinMode(_MOSI, OUTPUT); - pinMode(_MISO,INPUT); + digitalWrite(SS, HIGH); + pinMode(USCK, OUTPUT); + pinMode(DO, OUTPUT); + pinMode(SS, OUTPUT); + pinMode(DI, INPUT); + USICR = _BV(USIWM0); - digitalWrite(_MISO,HIGH); - digitalWrite(_SCK, LOW); - digitalWrite(_MOSI, LOW); } -void SPIClass::end() { +byte SPIClass::transfer(byte b) { + + USIDR = b; + USISR = _BV(USIOIF); + do + USICR = _BV(USIWM0) | _BV(USICS1) | _BV(USICLK) | _BV(USITC); + while ((USISR & _BV(USIOIF)) == 0); + return USIDR; - pinMode(_SCK, INPUT); - pinMode(_MOSI, INPUT); - pinMode(_MISO,INPUT); } -void SPIClass::setDataMode(byte mode){} -void SPIClass::setClockDivider(byte rate){} +void SPIClass::end() {} +void SPIClass::setDataMode(uint8_t mode){} +void SPIClass::setBitOrder(uint8_t bitOrder){} +void SPIClass::setClockDivider(uint8_t rate){} + #endif - diff --git a/RF24.h b/RF24.h index ccf7417..e92d7c4 100644 --- a/RF24.h +++ b/RF24.h @@ -948,7 +948,7 @@ private: */ /** - * @example pingpair_dyn.pde + * @example pingpair_dyn.ino * * This is an example of how to use payloads of a varying (dynamic) size. */ @@ -1018,7 +1018,7 @@ private: * - Extended timeout periods have been added to aid in noisy or otherwise unreliable environments * - Delays have been removed where possible to ensure maximum efficiency * - Full Due support with extended SPI functions - * - Initial ATTiny support added (Untested) + * - ATTiny 24/44/84 25/45/85 now supported. * - More! See the links below and class documentation for more info. * * If issues are discovered with the documentation, please report them here: here @@ -1042,8 +1042,11 @@ private: * - ATMega 328 based boards (Uno, Nano, etc) * - Mega Boards (1280, 2560, etc) * - ARM based boards (Arduino Due) Note: Do not include printf.h or use printf begin. This functionality is already present. Must use one of the - * hardware SS/CSN pins. - * - ATTiny boards (Not fully tested) Note: Do not include SPI.h. The SPI functions for ATTiny are already included. + * hardware SS/CSN pins as extended SPI methods are used. + * Initial Due support taken from https://github.com/mcrosson/RF24/tree/due + * - ATTiny board support added from https://github.com/jscrane/RF24 + * Note: ATTiny support is built into the library. Do not include SPI.h. + * See here for wiring/pin info. * * @section More More Information * diff --git a/RF24_config.h b/RF24_config.h index 946586b..b7154a5 100644 --- a/RF24_config.h +++ b/RF24_config.h @@ -24,8 +24,15 @@ //#define MINIMAL // Define _BV for non-Arduino platforms and for Arduino DUE - - +#if defined (ARDUINO) + #include +#else + #include + #include + #include + extern HardwareSPI SPI; + #define _BV(x) (1<<(x)) + #endif #undef SERIAL_DEBUG @@ -33,6 +40,9 @@ #define IF_SERIAL_DEBUG(x) ({x;}) #else #define IF_SERIAL_DEBUG(x) + #if defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny85__) + #define printf_P(...) + #endif #endif // Avoid spurious warnings @@ -49,13 +59,13 @@ // Progmem is Arduino-specific // Arduino DUE is arm and does not include avr/pgmspace #if defined(ARDUINO) && ! defined(__arm__) -#include -#define PRIPSTR "%S" + #include + #define PRIPSTR "%S" #else #if ! defined(ARDUINO) // This doesn't work on Arduino DUE -typedef char const char; + typedef char const char; #else // Fill in pgm_read_byte that is used, but missing from DUE -#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) + #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) #endif typedef uint16_t prog_uint16_t; @@ -65,75 +75,55 @@ typedef char const char; #define PROGMEM #define pgm_read_word(p) (*(p)) #define PRIPSTR "%s" - #endif - - -// Define _BV for non-Arduino platforms and for Arduino DUE -#if ! defined(ARDUINO) || (defined(ARDUINO) && defined(__arm__)) -#define _BV(x) (1<<(x)) #endif - // Stuff that is normally provided by Arduino - #if !defined (ARDUINO) - - #include - #include - #include - extern HardwareSPI SPI; - #define _BV(x) (1<<(x)) - #else - - #if !defined( __AVR_ATtiny85__ ) || defined( __AVR_ATtiny84__) - #include - #else - #define ATTINY - - #define SPI_CLOCK_DIV4 0x00 - #define SPI_CLOCK_DIV16 0x01 - #define SPI_CLOCK_DIV64 0x02 - #define SPI_CLOCK_DIV128 0x03 - #define SPI_CLOCK_DIV2 0x04 - #define SPI_CLOCK_DIV8 0x05 - #define SPI_CLOCK_DIV32 0x06 - //#define SPI_CLOCK_DIV64 0x07 - - #define SPI_MODE0 0x00 - #define SPI_MODE1 0x04 - #define SPI_MODE2 0x08 - #define SPI_MODE3 0x0C - - #define SPI_MODE_MASK 0x0C // CPOL = bit 3, CPHA = bit 2 on SPCR - #define SPI_CLOCK_MASK 0x03 // SPR1 = bit 1, SPR0 = bit 0 on SPCR - #define SPI_2XCLOCK_MASK 0x01 // SPI2X = bit 0 on SPSR - class SPIClass { - public: - inline static byte transfer(byte _data); +// ATTiny support code is from https://github.com/jscrane/RF24 - static void begin(); // Default - static void end(); +#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) +#include +#include +#include - static void setDataMode(byte); - static void setClockDivider(byte); - static void setBitOrder(byte); - }; +#define SPI_CLOCK_DIV4 0x00 +#define SPI_CLOCK_DIV16 0x01 +#define SPI_CLOCK_DIV64 0x02 +#define SPI_CLOCK_DIV128 0x03 +#define SPI_CLOCK_DIV2 0x04 +#define SPI_CLOCK_DIV8 0x05 +#define SPI_CLOCK_DIV32 0x06 +//#define SPI_CLOCK_DIV64 0x07 - extern SPIClass SPI; +#define SPI_MODE0 0x00 +#define SPI_MODE1 0x04 +#define SPI_MODE2 0x08 +#define SPI_MODE3 0x0C - byte SPIClass::transfer(byte _data){ +#define SPI_MODE_MASK 0x0C // CPOL = bit 3, CPHA = bit 2 on SPCR +#define SPI_CLOCK_MASK 0x03 // SPR1 = bit 1, SPR0 = bit 0 on SPCR +#define SPI_2XCLOCK_MASK 0x01 // SPI2X = bit 0 on SPSR - USIDR = _data; - USISR = _BV(USIOIF); - while((USISR & _BV(USIOIF)) == 0){ - USICR = _BV(USIWM0) | _BV(USICS1) | _BV(USICLK) | _BV(USITC); - } - return USIDR; - } - #endif //ATTINY - #endif //Defined Arduino +class SPIClass { +public: + static byte transfer(byte _data); + // SPI Configuration methods + + inline static void attachInterrupt(); + inline static void detachInterrupt(); // Default + + static void begin(); // Default + static void end(); + + static void setBitOrder(uint8_t); + static void setDataMode(uint8_t); + static void setClockDivider(uint8_t); +}; +extern SPIClass SPI; + +#endif //ATTiny #endif // __RF24_CONFIG_H__