diff --git a/README.markdown b/README.markdown new file mode 100644 index 0000000..00eeabd --- /dev/null +++ b/README.markdown @@ -0,0 +1,5 @@ +### chibiArduino + +A lightweight 802.15.4 wireless protocol stack for Arduino +http://freaklabs.org/index.php/chibiArduino.html + diff --git a/chibi.cpp b/chibi.cpp index 1a79614..9717471 100644 --- a/chibi.cpp +++ b/chibi.cpp @@ -64,9 +64,9 @@ static chb_rx_data_t rx_data; Init the chibi stack */ /**************************************************************************/ -void chibiInit() +uint8_t chibiInit() { - chb_init(); + return chb_init(); } /**************************************************************************/ diff --git a/chibi.h b/chibi.h index d0286ec..13c05ad 100644 --- a/chibi.h +++ b/chibi.h @@ -41,12 +41,17 @@ #ifndef CHIBI_H #define CHIBI_H +#if ARDUINO >= 100 +#include +#else #include +#endif + #include "chibiUsrCfg.h" #define BROADCAST_ADDR 0xFFFF -void chibiInit(); +uint8_t chibiInit(); void chibiSetShortAddr(uint16_t addr); uint16_t chibiGetShortAddr(); void chibiSetIEEEAddr(uint8_t *ieee_addr); @@ -59,6 +64,7 @@ uint8_t chibiGetData(uint8_t *data); uint8_t chibiGetRSSI(); uint16_t chibiGetSrcAddr(); uint8_t chibiSetChannel(uint8_t channel); +uint8_t chibiGetChannel(); void chibiSleepRadio(uint8_t enb); void chibiCmdInit(uint32_t speed); void chibiCmdPoll(); diff --git a/chibiUsrCfg.h b/chibiUsrCfg.h index f0c7fc7..5e43726 100644 --- a/chibiUsrCfg.h +++ b/chibiUsrCfg.h @@ -121,9 +121,24 @@ CHB_SLPTR_PIN default 2 on the chibiduino. */ /**************************************************************************/ +#if defined(__AVR_ATmega1284P__) +/* for bGeigie2 board using 1284P PORTA2 */ +#define CHB_SLPTR_PORT PORTA +#define CHB_SLPTR_DDIR DDRA +#define CHB_SLPTR_PIN 2 + +#elif defined(__AVR_ATmega32U4__) +/* for new Ninja2 board using 32u4 PORTD5 */ +#define CHB_SLPTR_PORT PORTD +#define CHB_SLPTR_DDIR DDRD +#define CHB_SLPTR_PIN 5 + +#else +/* for standard freakduino */ #define CHB_SLPTR_PORT PORTC #define CHB_SLPTR_DDIR DDRC #define CHB_SLPTR_PIN 2 +#endif /**************************************************************************/ /*! @@ -135,9 +150,24 @@ CHB_SPI_CS_PIN default 3 on the chibiduino. */ /**************************************************************************/ +#if defined(__AVR_ATmega1284P__) +/* for bGeigie2 board using 1284P */ +#define CHB_SPI_CS_PORT PORTD +#define CHB_SPI_CS_DDIR DDRD +#define CHB_SPI_CS_PIN 5 // PD.5 - SPI Chip Select (SSEL) + +#elif defined(__AVR_ATmega32U4__) +/* for bGeigie2 board using PORTD7 on 32u4 */ +#define CHB_SPI_CS_PORT PORTB +#define CHB_SPI_CS_DDIR DDRB +#define CHB_SPI_CS_PIN 0 // PB.0 - SPI Chip Select (SSEL) + +#else +/* for standard freakduino */ #define CHB_SPI_CS_PORT PORTC #define CHB_SPI_CS_DDIR DDRC #define CHB_SPI_CS_PIN 3 // PC.3 - SPI Chip Select (SSEL) +#endif /**************************************************************************/ @@ -148,7 +178,18 @@ CHB_RADIO_IRQ default PCINT0_vect on the chibiduino */ /**************************************************************************/ +#if defined(__AVR_ATmega1284P__) +/* for bGeigie2 board using 1284P (PC6) */ +#define CHB_RADIO_IRQ PCINT2_vect + +#elif defined(__AVR_ATmega32U4__) +/* for bGeigie2 board using 32U4 (PB7) */ +#define CHB_RADIO_IRQ PCINT0_vect + +#else +/* for standard freakduino (PB6) */ #define CHB_RADIO_IRQ PCINT0_vect +#endif /**************************************************************************/ /*! @@ -157,12 +198,33 @@ */ /**************************************************************************/ // enable rising edge interrupt on IRQ0 +#if defined(__AVR_ATmega1284P__) +/* for bGeigie2 board using 1284P */ +#define CFG_CHB_INTP() do \ + { \ + PCMSK2 |= _BV(PCINT22); \ + PCICR |= _BV(PCIE2); \ + } \ + while(0) + +#elif defined(__AVR_ATmega32U4__) +/* for bGeigie2 board using PCINT7 (PB7) on 32U4 */ +#define CFG_CHB_INTP() do \ + { \ + PCMSK0 |= _BV(PCINT7); \ + PCICR |= _BV(PCIE0); \ + } \ + while(0) + +#else +/* for standard freakduino (atmega328p) */ #define CFG_CHB_INTP() do \ { \ PCMSK0 |= _BV(PCINT6); \ PCICR |= _BV(PCIE0); \ } \ while(0) +#endif /**************************************************************************/ /*! @@ -174,8 +236,18 @@ off until the SPI bus is free and the data can be retrieved without collision. */ /**************************************************************************/ +#if defined(__AVR_ATmega1284P__) +#define CHB_IRQ_DISABLE() do {PCMSK2 &= ~_BV(PCINT22);} while(0) +#define CHB_IRQ_ENABLE() do {PCMSK2 |= _BV(PCINT22);} while(0) + +#elif defined(__AVR_ATmega32U4__) +#define CHB_IRQ_DISABLE() do {PCMSK0 &= ~_BV(PCINT7);} while(0) +#define CHB_IRQ_ENABLE() do {PCMSK0 |= _BV(PCINT7);} while(0) + +#else #define CHB_IRQ_DISABLE() do {PCMSK0 &= ~_BV(PCINT6);} while(0) #define CHB_IRQ_ENABLE() do {PCMSK0 |= _BV(PCINT6);} while(0) +#endif /**************************************************************************/ diff --git a/src/chb.c b/src/chb.c index 0aaf7d8..4bd9d52 100644 --- a/src/chb.c +++ b/src/chb.c @@ -49,11 +49,11 @@ static U16 prev_src_addr = 0xFFFE; */ /**************************************************************************/ -void chb_init() +U8 chb_init() { memset(&pcb, 0, sizeof(pcb_t)); pcb.src_addr = chb_get_short_addr(); - chb_drvr_init(); + return chb_drvr_init(); } /**************************************************************************/ diff --git a/src/chb.h b/src/chb.h index 094a772..a1e983a 100644 --- a/src/chb.h +++ b/src/chb.h @@ -92,7 +92,7 @@ typedef struct U8 *data; } chb_rx_data_t; -void chb_init(); +U8 chb_init(); pcb_t *chb_get_pcb(); U8 chb_write(U16 addr, U8 *data, U8 len); U8 chb_read(chb_rx_data_t *rx); diff --git a/src/chb_cmd.c b/src/chb_cmd.c index cd0d251..39df25e 100644 --- a/src/chb_cmd.c +++ b/src/chb_cmd.c @@ -39,7 +39,11 @@ */ /**************************************************************************/ #include -#include "WProgram.h" +#if ARDUINO >= 100 +#include +#else +#include +#endif #include "HardwareSerial.h" #include "chb_cmd.h" diff --git a/src/chb_drvr.c b/src/chb_drvr.c index 08f75fb..9536553 100644 --- a/src/chb_drvr.c +++ b/src/chb_drvr.c @@ -32,7 +32,11 @@ *******************************************************************/ #include -#include "WProgram.h" +#if ARDUINO >= 100 +#include +#else +#include +#endif #include "chb.h" #include "chb_drvr.h" #include "chb_buf.h" @@ -81,10 +85,8 @@ static U8 chb_get_status() /**************************************************************************/ static void chb_delay_us(U16 usec) { - do - { - delayMicroseconds(usec); - } while (--usec); + // Use the Arduino microsecond delay function + delayMicroseconds(usec); } /**************************************************************************/ @@ -587,7 +589,7 @@ U8 chb_tx(U8 *hdr, U8 *data, U8 len) Initialize the radio registers. */ /**************************************************************************/ -static void chb_radio_init() +static U8 chb_radio_init() { U8 ieee_addr[8]; @@ -658,7 +660,13 @@ static void chb_radio_init() // grab the error message from flash & print it out strcpy_P(buf, chb_err_init); Serial.print(buf); + + // return error status + return 0; } + + // If we reach this point, report success + return 1; } /**************************************************************************/ @@ -666,7 +674,7 @@ static void chb_radio_init() Initialize the complete driver. */ /**************************************************************************/ -void chb_drvr_init() +U8 chb_drvr_init() { // config SPI for at86rf230 access chb_spi_init(); @@ -675,7 +683,7 @@ void chb_drvr_init() CHB_SLPTR_DDIR |= (_BV(CHB_SLPTR_PIN)); // config radio - chb_radio_init(); + return chb_radio_init(); } /**************************************************************************/ diff --git a/src/chb_drvr.h b/src/chb_drvr.h index 3112d53..95f749d 100644 --- a/src/chb_drvr.h +++ b/src/chb_drvr.h @@ -250,7 +250,7 @@ enum */ /**************************************************************************/ // init -void chb_drvr_init(); +U8 chb_drvr_init(); // data access U8 chb_reg_read(U8 addr); diff --git a/src/chb_rx_int.c b/src/chb_rx_int.c index f3ccecc..cd7f46d 100644 --- a/src/chb_rx_int.c +++ b/src/chb_rx_int.c @@ -38,7 +38,11 @@ */ /**************************************************************************/ -#include "WProgram.h" +#if ARDUINO >= 100 +#include +#else +#include +#endif #include "chb.h" #include "chb_drvr.h" #include "chb_spi.h" @@ -59,7 +63,17 @@ ISR(CHB_RADIO_IRQ) CHB_ENTER_CRIT(); // get the pin's value to check whether it was a rising or falling edge. +#if defined(__AVR_ATmega1284P__) + /* for bGeigie2 board using 1284P (PC6) */ + pinval = PINC & _BV(PINC6); +#elif defined(__AVR_ATmega32U4__) + /* for bGeigie2 board using 32U4 (PB7) */ + pinval = PINB & _BV(PINB7); +#else + /* for standard freakduino (PB6) */ pinval = PINB & _BV(PINB6); +#endif + // we'll only enter the ISR if the interrupt is a positive edge. if (pinval) diff --git a/src/chb_rx_poll.c b/src/chb_rx_poll.c index e351c20..a8f1102 100644 --- a/src/chb_rx_poll.c +++ b/src/chb_rx_poll.c @@ -38,7 +38,11 @@ */ /**************************************************************************/ -#include "WProgram.h" +#if ARDUINO >= 100 +#include +#else +#include +#endif #include "chb.h" #include "chb_drvr.h" #include "chb_spi.h" diff --git a/src/chb_spi.h b/src/chb_spi.h index b1594a8..1445e87 100644 --- a/src/chb_spi.h +++ b/src/chb_spi.h @@ -49,6 +49,26 @@ #define CHB_SPI_DISABLE() do {CHB_SPI_CS_PORT |= _BV(CHB_SPI_CS_PIN);} while (0) /* Note: The SPI chip select pin is defined in chibiUsrCfg.h */ +#if defined(__AVR_ATmega1284P__) +/* for bGeigie2 board using 1284P */ +#define CHB_SPI_PORT PORTB +#define CHB_SPI_DDIR DDRB +#define CHB_SCK 7 // PB.7 - Output: SPI Serial Clock (SCLK) +#define CHB_MOSI 5 // PB.5 - Output: SPI Master out - slave in (MOSI) +#define CHB_MISO 6 // PB.6 - Input: SPI Master in - slave out (MISO) +#define CHB_SPI_SELN 4 // PB.4 - Input: The dedicated SPI CS pin needs to have internal pullup enabled if an input + +#elif defined(__AVR_ATmega32U4__) +/* for bGeigie2 board using 1284P */ +#define CHB_SPI_PORT PORTB +#define CHB_SPI_DDIR DDRB +#define CHB_SCK 1 // PB.1 - Output: SPI Serial Clock (SCLK) +#define CHB_MOSI 2 // PB.2 - Output: SPI Master out - slave in (MOSI) +#define CHB_MISO 3 // PB.3 - Input: SPI Master in - slave out (MISO) +#define CHB_SPI_SELN 0 // PB.0 - Input: The dedicated SPI CS pin needs to have internal pullup enabled if an input + +#else +/* for standard freakduino */ #define CHB_SPI_PORT PORTB #define CHB_SPI_DDIR DDRB #define CHB_SCK 5 // PB.5 - Output: SPI Serial Clock (SCLK) @@ -56,6 +76,8 @@ #define CHB_MISO 4 // PB.4 - Input: SPI Master in - slave out (MISO) #define CHB_SPI_SELN 2 // PB.2 - Input: The dedicated SPI CS pin needs to have internal pullup enabled if an input +#endif + void chb_spi_init(); U8 chb_xfer_byte(U8 data);