HAL for digitalRead/Write() and pinMode() (#607)

This commit is contained in:
Olivier
2016-10-16 10:12:24 +02:00
committed by Embedded Innovation
parent ef65d0e4df
commit 80659ddb00
13 changed files with 150 additions and 47 deletions
+1
View File
@@ -66,6 +66,7 @@
//#define F(x) (x) //#define F(x) (x)
#include "core/MyHwESP8266.cpp" #include "core/MyHwESP8266.cpp"
#elif defined(ARDUINO_ARCH_AVR) #elif defined(ARDUINO_ARCH_AVR)
#include "drivers/AVR/DigitalWriteFast/digitalWriteFast.h"
#include "core/MyHwATMega328.cpp" #include "core/MyHwATMega328.cpp"
#elif defined(ARDUINO_ARCH_SAMD) #elif defined(ARDUINO_ARCH_SAMD)
#include "core/MyHwSAMD.cpp" #include "core/MyHwSAMD.cpp"
+4 -4
View File
@@ -87,14 +87,14 @@ typedef struct
if (enable) if (enable)
{ {
// Pull up pin // Pull up pin
pinMode(MY_W5100_SPI_EN, INPUT); hwPinMode(MY_W5100_SPI_EN, INPUT);
digitalWrite(MY_W5100_SPI_EN, HIGH); hwDigitalWrite(MY_W5100_SPI_EN, HIGH);
} }
else else
{ {
// Ground pin // Ground pin
pinMode(MY_W5100_SPI_EN, OUTPUT); hwPinMode(MY_W5100_SPI_EN, OUTPUT);
digitalWrite(MY_W5100_SPI_EN, LOW); hwDigitalWrite(MY_W5100_SPI_EN, LOW);
} }
} }
#else #else
+4 -2
View File
@@ -58,7 +58,10 @@ do { \
// Define these as macros to save valuable space // Define these as macros to save valuable space
#define hwDigitalWrite(__pin, __value) (digitalWrite(__pin, __value)) #define hwDigitalWrite(__pin, __value) digitalWriteFast(__pin, __value)
#define hwDigitalRead(__pin) digitalReadFast(__pin)
#define hwPinMode(__pin, __value) pinModeFast(__pin, __value)
#if defined(MY_DISABLED_SERIAL) #if defined(MY_DISABLED_SERIAL)
#define hwInit() #define hwInit()
@@ -78,7 +81,6 @@ do { \
#define hwWriteConfig(__pos, __value) (eeprom_update_byte((uint8_t*)(__pos), (__value))) #define hwWriteConfig(__pos, __value) (eeprom_update_byte((uint8_t*)(__pos), (__value)))
#endif #endif
//
#define hwReadConfigBlock(__buf, __pos, __length) (eeprom_read_block((__buf), (void*)(__pos), (__length))) #define hwReadConfigBlock(__buf, __pos, __length) (eeprom_read_block((__buf), (void*)(__pos), (__length)))
#define hwWriteConfigBlock(__buf, __pos, __length) (eeprom_write_block((void*)(__buf), (void*)(__pos), (__length))) #define hwWriteConfigBlock(__buf, __pos, __length) (eeprom_write_block((void*)(__buf), (void*)(__pos), (__length)))
+3 -2
View File
@@ -33,8 +33,9 @@
// Define these as macros to save valuable space // Define these as macros to save valuable space
#define hwDigitalWrite(__pin, __value) digitalWrite(__pin, __value)
#define hwDigitalWrite(__pin, __value) (digitalWrite(__pin, __value)) #define hwDigitalRead(__pin) digitalRead(__pin)
#define hwPinMode(__pin, __value) pinMode(__pin, __value)
#if defined(MY_DISABLED_SERIAL) #if defined(MY_DISABLED_SERIAL)
#define hwInit() #define hwInit()
+5 -2
View File
@@ -33,8 +33,11 @@
#define MY_SERIALDEVICE Serial #define MY_SERIALDEVICE Serial
// Define these as macros (do nothing) // Define these as macros
#define hwDigitalWrite(__pin, __value) #define hwDigitalWrite(__pin, __value) digitalWrite(__pin, __value)
#define hwDigitalRead(__pin) digitalRead(__pin)
#define hwPinMode(__pin, __value) pinMode(__pin, __value)
#define hwWatchdogReset() #define hwWatchdogReset()
#define hwReboot() #define hwReboot()
#define hwMillis() millis() #define hwMillis() millis()
+7 -6
View File
@@ -34,17 +34,18 @@
#define max(a,b) ((a)>(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b))
#define snprintf_P(s, f, ...) snprintf((s), (f), __VA_ARGS__) #define snprintf_P(s, f, ...) snprintf((s), (f), __VA_ARGS__)
uint8_t configBlock[1024];
// Define these as macros to save valuable space // Define these as macros to save valuable space
#define hwDigitalWrite(__pin, __value) digitalWrite(__pin, __value)
uint8_t configBlock[1024]; #define hwDigitalRead(__pin) digitalRead(__pin)
#define hwDigitalWrite(__pin, __value) (digitalWrite(__pin, __value)) #define hwPinMode(__pin, __value) pinMode(__pin, __value)
void hwInit();
void hwWatchdogReset();
void hwReboot();
#define hwMillis() millis() #define hwMillis() millis()
#define hwRandomNumberInit() randomSeed(analogRead(MY_SIGNING_SOFT_RANDOMSEED_PIN)) #define hwRandomNumberInit() randomSeed(analogRead(MY_SIGNING_SOFT_RANDOMSEED_PIN))
void hwInit();
void hwWatchdogReset();
void hwReboot();
void hwReadConfigBlock(void* buf, void* adr, size_t length); void hwReadConfigBlock(void* buf, void* adr, size_t length);
void hwWriteConfigBlock(void* buf, void* adr, size_t length); void hwWriteConfigBlock(void* buf, void* adr, size_t length);
void hwWriteConfig(int adr, uint8_t value); void hwWriteConfig(int adr, uint8_t value);
+3 -3
View File
@@ -29,8 +29,8 @@ inline void inclusionInit() {
_inclusionMode = false; _inclusionMode = false;
#if defined(MY_INCLUSION_BUTTON_FEATURE) #if defined(MY_INCLUSION_BUTTON_FEATURE)
// Setup digital in that triggers inclusion mode // Setup digital in that triggers inclusion mode
pinMode(MY_INCLUSION_MODE_BUTTON_PIN, INPUT); hwPinMode(MY_INCLUSION_MODE_BUTTON_PIN, INPUT);
digitalWrite(MY_INCLUSION_MODE_BUTTON_PIN, HIGH); hwDigitalWrite(MY_INCLUSION_MODE_BUTTON_PIN, HIGH);
#endif #endif
} }
@@ -49,7 +49,7 @@ void inclusionModeSet(bool newMode) {
inline void inclusionProcess() { inline void inclusionProcess() {
#ifdef MY_INCLUSION_BUTTON_FEATURE #ifdef MY_INCLUSION_BUTTON_FEATURE
if (!_inclusionMode && digitalRead(MY_INCLUSION_MODE_BUTTON_PIN) == MY_INCLUSION_BUTTON_PRESSED) { if (!_inclusionMode && hwDigitalRead(MY_INCLUSION_MODE_BUTTON_PIN) == MY_INCLUSION_BUTTON_PRESSED) {
// Start inclusion mode // Start inclusion mode
inclusionModeSet(true); inclusionModeSet(true);
} }
+6 -6
View File
@@ -63,8 +63,8 @@
#if defined(MY_RS485_DE_PIN) #if defined(MY_RS485_DE_PIN)
#define assertDE() digitalWrite(MY_RS485_DE_PIN, HIGH); delayMicroseconds(5) #define assertDE() hwDigitalWrite(MY_RS485_DE_PIN, HIGH); delayMicroseconds(5)
#define deassertDE() digitalWrite(MY_RS485_DE_PIN, LOW) #define deassertDE() hwDigitalWrite(MY_RS485_DE_PIN, LOW)
#else #else
#define assertDE() #define assertDE()
@@ -258,7 +258,7 @@ bool transportSend(uint8_t to, const void* data, uint8_t len)
} }
#if defined(MY_RS485_DE_PIN) #if defined(MY_RS485_DE_PIN)
digitalWrite(MY_RS485_DE_PIN, HIGH); hwDigitalWrite(MY_RS485_DE_PIN, HIGH);
delayMicroseconds(5); delayMicroseconds(5);
#endif #endif
@@ -300,7 +300,7 @@ bool transportSend(uint8_t to, const void* data, uint8_t len)
#endif #endif
#endif #endif
#endif #endif
digitalWrite(MY_RS485_DE_PIN, LOW); hwDigitalWrite(MY_RS485_DE_PIN, LOW);
#endif #endif
return true; return true;
} }
@@ -312,8 +312,8 @@ bool transportInit() {
_dev.begin(MY_RS485_BAUD_RATE); _dev.begin(MY_RS485_BAUD_RATE);
_serialReset(); _serialReset();
#if defined(MY_RS485_DE_PIN) #if defined(MY_RS485_DE_PIN)
pinMode(MY_RS485_DE_PIN, OUTPUT); hwPinMode(MY_RS485_DE_PIN, OUTPUT);
digitalWrite(MY_RS485_DE_PIN, LOW); hwDigitalWrite(MY_RS485_DE_PIN, LOW);
#endif #endif
return true; return true;
} }
@@ -0,0 +1,95 @@
/*
* Optimized digital functions for AVR microcontrollers
* based on http://code.google.com/p/digitalwritefast
*/
#ifndef __digitalWriteFast_h_
#define __digitalWriteFast_h_
#if defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA1280) || defined(ARDUINO_AVR_MEGA2560) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)
#define __digitalPinToPortReg(__pin) \
(((__pin) >= 22 && (__pin) <= 29) ? &PORTA : \
((((__pin) >= 10 && (__pin) <= 13) || ((__pin) >= 50 && (__pin) <= 53)) ? &PORTB : \
(((__pin) >= 30 && (__pin) <= 37) ? &PORTC : \
((((__pin) >= 18 && (__pin) <= 21) || (__pin) == 38) ? &PORTD : \
((((__pin) <= 3) || (__pin) == 5) ? &PORTE : \
(((__pin) >= 54 && (__pin) <= 61) ? &PORTF : \
((((__pin) >= 39 && (__pin) <= 41) || (__pin) == 4) ? &PORTG : \
((((__pin) >= 6 && (__pin) <= 9) || (__pin) == 16 || (__pin) == 17) ? &PORTH : \
(((__pin) == 14 || (__pin) == 15) ? &PORTJ : \
(((__pin) >= 62 && (__pin) <= 69) ? &PORTK : &PORTL))))))))))
#define __digitalPinToDDRReg(__pin) \
(((__pin) >= 22 && (__pin) <= 29) ? &DDRA : \
((((__pin) >= 10 && (__pin) <= 13) || ((__pin) >= 50 && (__pin) <= 53)) ? &DDRB : \
(((__pin) >= 30 && (__pin) <= 37) ? &DDRC : \
((((__pin) >= 18 && (__pin) <= 21) || (__pin) == 38) ? &DDRD : \
((((__pin) <= 3) || (__pin) == 5) ? &DDRE : \
(((__pin) >= 54 && (__pin) <= 61) ? &DDRF : \
((((__pin) >= 39 && (__pin) <= 41) || (__pin) == 4) ? &DDRG : \
((((__pin) >= 6 && (__pin) <= 9) || (__pin) == 16 || (__pin) == 17) ? &DDRH : \
(((__pin) == 14 || (__pin) == 15) ? &DDRJ : \
(((__pin) >= 62 && (__pin) <= 69) ? &DDRK : &DDRL))))))))))
#define __digitalPinToPINReg(__pin) \
(((__pin) >= 22 && (__pin) <= 29) ? &PINA : \
((((__pin) >= 10 && (__pin) <= 13) || ((__pin) >= 50 && (__pin) <= 53)) ? &PINB : \
(((__pin) >= 30 && (__pin) <= 37) ? &PINC : \
((((__pin) >= 18 && (__pin) <= 21) || (__pin) == 38) ? &PIND : \
((((__pin) <= 3) || (__pin) == 5) ? &PINE : \
(((__pin) >= 54 && (__pin) <= 61) ? &PINF : \
((((__pin) >= 39 && (__pin) <= 41) || (__pin) == 4) ? &PING : \
((((__pin) >= 6 && (__pin) <= 9) || (__pin) == 16 || (__pin) == 17) ? &PINH : \
(((__pin) == 14 || (__pin) == 15) ? &PINJ : \
(((__pin) >= 62 && (__pin) <= 69) ? &PINK : &PINL))))))))))
#define __digitalPinToBit(__pin) \
(((__pin) >= 7 && (__pin) <= 9) ? (__pin) - 3 : \
(((__pin) >= 10 && (__pin) <= 13) ? (__pin) - 6 : \
(((__pin) >= 22 && (__pin) <= 29) ? (__pin) - 22 : \
(((__pin) >= 30 && (__pin) <= 37) ? 37 - (__pin) : \
(((__pin) >= 39 && (__pin) <= 41) ? 41 - (__pin) : \
(((__pin) >= 42 && (__pin) <= 49) ? 49 - (__pin) : \
(((__pin) >= 50 && (__pin) <= 53) ? 53 - (__pin) : \
(((__pin) >= 54 && (__pin) <= 61) ? (__pin) - 54 : \
(((__pin) >= 62 && (__pin) <= 69) ? (__pin) - 62 : \
(((__pin) == 0 || (__pin) == 15 || (__pin) == 17 || (__pin) == 21) ? 0 : \
(((__pin) == 1 || (__pin) == 14 || (__pin) == 16 || (__pin) == 20) ? 1 : \
(((__pin) == 19) ? 2 : \
(((__pin) == 5 || (__pin) == 6 || (__pin) == 18) ? 3 : \
(((__pin) == 2) ? 4 : \
(((__pin) == 3 || (__pin) == 4) ? 5 : 7)))))))))))))))
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__)
#define __digitalPinToPortReg(__pin) (((__pin) <= 7) ? &PORTB : (((__pin) >= 8 && (__pin) <= 15) ? &PORTD : (((__pin) >= 16 && (__pin) <= 23) ? &PORTC : &PORTA)))
#define __digitalPinToDDRReg(__pin) (((__pin) <= 7) ? &DDRB : (((__pin) >= 8 && (__pin) <= 15) ? &DDRD : (((__pin) >= 8 && (__pin) <= 15) ? &DDRC : &DDRA)))
#define __digitalPinToPINReg(__pin) (((__pin) <= 7) ? &PINB : (((__pin) >= 8 && (__pin) <= 15) ? &PIND : (((__pin) >= 8 && (__pin) <= 15) ? &PINC : &PINA)))
#define __digitalPinToBit(__pin) (((__pin) <= 7) ? (__pin) : (((__pin) >= 8 && (__pin) <= 15) ? (__pin) - 8 : (((__pin) >= 16 && (__pin) <= 23) ? (__pin) - 16 : (__pin) - 24)))
#elif defined(ARDUINO_AVR_LEONARDO) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)
#define __digitalPinToPortReg(__pin) ((((__pin) <= 4) || (__pin) == 6 || (__pin) == 12 || (__pin) == 24 || (__pin) == 25 || (__pin) == 29) ? &PORTD : (((__pin) == 5 || (__pin) == 13) ? &PORTC : (((__pin) >= 18 && (__pin) <= 23)) ? &PORTF : (((__pin) == 7) ? &PORTE : &PORTB)))
#define __digitalPinToDDRReg(__pin) ((((__pin) <= 4) || (__pin) == 6 || (__pin) == 12 || (__pin) == 24 || (__pin) == 25 || (__pin) == 29) ? &DDRD : (((__pin) == 5 || (__pin) == 13) ? &DDRC : (((__pin) >= 18 && (__pin) <= 23)) ? &DDRF : (((__pin) == 7) ? &DDRE : &DDRB)))
#define __digitalPinToPINReg(__pin) ((((__pin) <= 4) || (__pin) == 6 || (__pin) == 12 || (__pin) == 24 || (__pin) == 25 || (__pin) == 29) ? &PIND : (((__pin) == 5 || (__pin) == 13) ? &PINC : (((__pin) >= 18 && (__pin) <= 23)) ? &PINF : (((__pin) == 7) ? &PINE : &PINB)))
#define __digitalPinToBit(__pin) (((__pin) >= 8 && (__pin) <= 11) ? (__pin) - 4 : (((__pin) >= 18 && (__pin) <= 21) ? 25 - (__pin) : (((__pin) == 0) ? 2 : (((__pin) == 1) ? 3 : (((__pin) == 2) ? 1 : (((__pin) == 3) ? 0 : (((__pin) == 4) ? 4 : (((__pin) == 6) ? 7 : (((__pin) == 13) ? 7 : (((__pin) == 14) ? 3 : (((__pin) == 15) ? 1 : (((__pin) == 16) ? 2 : (((__pin) == 17) ? 0 : (((__pin) == 22) ? 1 : (((__pin) == 23) ? 0 : (((__pin) == 24) ? 4 : (((__pin) == 25) ? 7 : (((__pin) == 26) ? 4 : (((__pin) == 27) ? 5 : 6 )))))))))))))))))))
#elif defined(ARDUINO_AVR_UNO) || defined(ARDUINO_AVR_DUEMILANOVE) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__)
#if defined(__AVR_ATmega328PB__)
#define __digitalPinToPortReg(__pin) (((__pin) <= 7) ? &PORTD : (((__pin) >= 8 && (__pin) <= 13) ? &PORTB : (((__pin) >= 14 && (__pin) <= 19) ? &PORTC : &PORTE)))
#define __digitalPinToDDRReg(__pin) (((__pin) <= 7) ? &DDRD : (((__pin) >= 8 && (__pin) <= 13) ? &DDRB : (((__pin) >= 14 && (__pin) <= 19) ? &DDRC : &DDRE)))
#define __digitalPinToPINReg(__pin) (((__pin) <= 7) ? &PIND : (((__pin) >= 8 && (__pin) <= 13) ? &PINB : (((__pin) >= 14 && (__pin) <= 19) ? &PINC : &PINE)))
#define __digitalPinToBit(__pin) (((__pin) <= 7) ? (__pin) : (((__pin) >= 8 && (__pin) <= 13) ? (__pin) - 8 : (((__pin) >= 14 && (__pin) <= 19) ? (__pin) - 14 : (((__pin) >= 20 && (__pin) <= 21) ? (__pin) - 18 : (__pin) - 22))))
#else
#define __digitalPinToPortReg(__pin) (((__pin) <= 7) ? &PORTD : (((__pin) >= 8 && (__pin) <= 13) ? &PORTB : &PORTC))
#define __digitalPinToDDRReg(__pin) (((__pin) <= 7) ? &DDRD : (((__pin) >= 8 && (__pin) <= 13) ? &DDRB : &DDRC))
#define __digitalPinToPINReg(__pin) (((__pin) <= 7) ? &PIND : (((__pin) >= 8 && (__pin) <= 13) ? &PINB : &PINC))
#define __digitalPinToBit(__pin) (((__pin) <= 7) ? (__pin) : (((__pin) >= 8 && (__pin) <= 13) ? (__pin) - 8 : (__pin) - 14))
#endif
#endif
#if defined(ARDUINO_ARCH_AVR)
#if !defined(digitalWriteFast)
#define digitalWriteFast(__pin, __value) do { if (__builtin_constant_p(__pin) && __builtin_constant_p(__value)) { bitWrite(*__digitalPinToPortReg(__pin), __digitalPinToBit(__pin), (__value)); } else { digitalWrite((__pin), (__value)); } } while (0)
#endif
#if !defined(pinModeFast)
#define pinModeFast(__pin, __value) do { if (__builtin_constant_p(__pin) && __builtin_constant_p(__value)) { bitWrite(*__digitalPinToDDRReg(__pin), __digitalPinToBit(__pin), (__value)); } else { pinMode((__pin), (__value)); } } while (0)
#endif
#if !defined(digitalReadFast)
#define digitalReadFast(__pin) ( (bool) (__builtin_constant_p(__pin) ) ? (( bitRead(*__digitalPinToPINReg(__pin), __digitalPinToBit(__pin))) ) : digitalRead((__pin)) )
#endif
#endif
#endif
+3 -3
View File
@@ -76,9 +76,9 @@ void AltSoftSerial::init(uint32_t cycles_per_bit)
} }
ticks_per_bit = cycles_per_bit; ticks_per_bit = cycles_per_bit;
rx_stop_ticks = cycles_per_bit * 37 / 4; rx_stop_ticks = cycles_per_bit * 37 / 4;
pinMode(INPUT_CAPTURE_PIN, INPUT_PULLUP); hwPinMode(INPUT_CAPTURE_PIN, INPUT_PULLUP);
digitalWrite(OUTPUT_COMPARE_A_PIN, HIGH); hwDigitalWrite(OUTPUT_COMPARE_A_PIN, HIGH);
pinMode(OUTPUT_COMPARE_A_PIN, OUTPUT); hwPinMode(OUTPUT_COMPARE_A_PIN, OUTPUT);
rx_state = 0; rx_state = 0;
rx_buffer_head = 0; rx_buffer_head = 0;
rx_buffer_tail = 0; rx_buffer_tail = 0;
+5 -5
View File
@@ -35,11 +35,11 @@ LOCAL uint8_t MY_RF24_NODE_ADDRESS = AUTO;
#endif #endif
LOCAL void RF24_csn(bool level) { LOCAL void RF24_csn(bool level) {
digitalWrite(MY_RF24_CS_PIN, level); hwDigitalWrite(MY_RF24_CS_PIN, level);
} }
LOCAL void RF24_ce(bool level) { LOCAL void RF24_ce(bool level) {
digitalWrite(MY_RF24_CE_PIN, level); hwDigitalWrite(MY_RF24_CE_PIN, level);
} }
LOCAL uint8_t RF24_spiMultiByteTransfer(uint8_t cmd, uint8_t* buf, uint8_t len, bool aReadMode) { LOCAL uint8_t RF24_spiMultiByteTransfer(uint8_t cmd, uint8_t* buf, uint8_t len, bool aReadMode) {
@@ -338,10 +338,10 @@ LOCAL bool RF24_initialize(void) {
(void)RF24_getObserveTX; (void)RF24_getObserveTX;
// Initialize pins // Initialize pins
pinMode(MY_RF24_CE_PIN,OUTPUT); hwPinMode(MY_RF24_CE_PIN,OUTPUT);
pinMode(MY_RF24_CS_PIN,OUTPUT); hwPinMode(MY_RF24_CS_PIN,OUTPUT);
#if defined(MY_RX_MESSAGE_BUFFER_FEATURE) #if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
pinMode(MY_RF24_IRQ_PIN,INPUT); hwPinMode(MY_RF24_IRQ_PIN,INPUT);
#endif #endif
// Initialize SPI // Initialize SPI
_SPI.begin(); _SPI.begin();
+11 -11
View File
@@ -87,8 +87,8 @@ bool RFM69::initialize(uint8_t freqBand, uint8_t nodeID, uint8_t networkID)
{255, 0} {255, 0}
}; };
digitalWrite(_slaveSelectPin, HIGH); hwDigitalWrite(_slaveSelectPin, HIGH);
pinMode(_slaveSelectPin, OUTPUT); hwPinMode(_slaveSelectPin, OUTPUT);
SPI.begin(); SPI.begin();
unsigned long start = millis(); unsigned long start = millis();
uint8_t timeout = 50; uint8_t timeout = 50;
@@ -318,15 +318,15 @@ void RFM69::sendFrame(uint8_t toAddress, const void* buffer, uint8_t bufferSize,
// no need to wait for transmit mode to be ready since its handled by the radio // no need to wait for transmit mode to be ready since its handled by the radio
setMode(RF69_MODE_TX); setMode(RF69_MODE_TX);
uint32_t txStart = millis(); uint32_t txStart = millis();
while (digitalRead(_interruptPin) == 0 && millis() - txStart < RF69_TX_LIMIT_MS); // wait for DIO0 to turn HIGH signalling transmission finish while (hwDigitalRead(_interruptPin) == 0 && millis() - txStart < RF69_TX_LIMIT_MS); // wait for DIO0 to turn HIGH signalling transmission finish
//while (readReg(REG_IRQFLAGS2) & RF_IRQFLAGS2_PACKETSENT == 0x00); // wait for ModeReady //while (readReg(REG_IRQFLAGS2) & RF_IRQFLAGS2_PACKETSENT == 0x00); // wait for ModeReady
setMode(RF69_MODE_STANDBY); setMode(RF69_MODE_STANDBY);
} }
// internal function - interrupt gets called when a packet is received // internal function - interrupt gets called when a packet is received
void RFM69::interruptHandler() { void RFM69::interruptHandler() {
//pinMode(4, OUTPUT); //hwPinMode(4, OUTPUT);
//digitalWrite(4, 1); //hwDigitalWrite(4, 1);
if (_mode == RF69_MODE_RX && (readReg(REG_IRQFLAGS2) & RF_IRQFLAGS2_PAYLOADREADY)) if (_mode == RF69_MODE_RX && (readReg(REG_IRQFLAGS2) & RF_IRQFLAGS2_PAYLOADREADY))
{ {
//RSSI = readRSSI(); //RSSI = readRSSI();
@@ -342,7 +342,7 @@ void RFM69::interruptHandler() {
PAYLOADLEN = 0; PAYLOADLEN = 0;
unselect(); unselect();
receiveBegin(); receiveBegin();
//digitalWrite(4, 0); //hwDigitalWrite(4, 0);
return; return;
} }
@@ -364,7 +364,7 @@ void RFM69::interruptHandler() {
setMode(RF69_MODE_RX); setMode(RF69_MODE_RX);
} }
RSSI = readRSSI(); RSSI = readRSSI();
//digitalWrite(4, 0); //hwDigitalWrite(4, 0);
} }
// internal function // internal function
@@ -464,12 +464,12 @@ void RFM69::select() {
SPI.setDataMode(SPI_MODE0); SPI.setDataMode(SPI_MODE0);
SPI.setBitOrder(MSBFIRST); SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV4); // decided to slow down from DIV2 after SPI stalling in some instances, especially visible on mega1284p when RFM69 and FLASH chip both present SPI.setClockDivider(SPI_CLOCK_DIV4); // decided to slow down from DIV2 after SPI stalling in some instances, especially visible on mega1284p when RFM69 and FLASH chip both present
digitalWrite(_slaveSelectPin, LOW); hwDigitalWrite(_slaveSelectPin, LOW);
} }
// unselect the RFM69 transceiver (set CS high, restore SPI settings) // unselect the RFM69 transceiver (set CS high, restore SPI settings)
void RFM69::unselect() { void RFM69::unselect() {
digitalWrite(_slaveSelectPin, HIGH); hwDigitalWrite(_slaveSelectPin, HIGH);
// restore SPI settings to what they were before talking to RFM69 // restore SPI settings to what they were before talking to RFM69
#if defined (SPCR) && defined (SPSR) #if defined (SPCR) && defined (SPSR)
SPCR = _SPCR; SPCR = _SPCR;
@@ -504,8 +504,8 @@ void RFM69::setHighPowerRegs(bool onOff) {
// set the slave select (CS) pin // set the slave select (CS) pin
void RFM69::setCS(uint8_t newSPISlaveSelect) { void RFM69::setCS(uint8_t newSPISlaveSelect) {
_slaveSelectPin = newSPISlaveSelect; _slaveSelectPin = newSPISlaveSelect;
digitalWrite(_slaveSelectPin, HIGH); hwDigitalWrite(_slaveSelectPin, HIGH);
pinMode(_slaveSelectPin, OUTPUT); hwPinMode(_slaveSelectPin, OUTPUT);
} }
//for debugging //for debugging
+3 -3
View File
@@ -72,12 +72,12 @@ void SPIFlash::select() {
SPI.setClockDivider(SPI_CLOCK_DIV4); //decided to slow down from DIV2 after SPI stalling in some instances, especially visible on mega1284p when RFM69 and FLASH chip both present SPI.setClockDivider(SPI_CLOCK_DIV4); //decided to slow down from DIV2 after SPI stalling in some instances, especially visible on mega1284p when RFM69 and FLASH chip both present
SPI.begin(); SPI.begin();
#endif #endif
digitalWrite(_slaveSelectPin, LOW); hwDigitalWrite(_slaveSelectPin, LOW);
} }
/// UNselect the flash chip /// UNselect the flash chip
void SPIFlash::unselect() { void SPIFlash::unselect() {
digitalWrite(_slaveSelectPin, HIGH); hwDigitalWrite(_slaveSelectPin, HIGH);
//restore SPI settings to what they were before talking to the FLASH chip //restore SPI settings to what they were before talking to the FLASH chip
#ifdef SPI_HAS_TRANSACTION #ifdef SPI_HAS_TRANSACTION
SPI.endTransaction(); SPI.endTransaction();
@@ -97,7 +97,7 @@ boolean SPIFlash::initialize()
_SPCR = SPCR; _SPCR = SPCR;
_SPSR = SPSR; _SPSR = SPSR;
#endif #endif
pinMode(_slaveSelectPin, OUTPUT); hwPinMode(_slaveSelectPin, OUTPUT);
#ifdef SPI_HAS_TRANSACTION #ifdef SPI_HAS_TRANSACTION
_settings = SPISettings(4000000, MSBFIRST, SPI_MODE0); _settings = SPISettings(4000000, MSBFIRST, SPI_MODE0);
#endif #endif