Disable interrupts while transmitting data
This commit is contained in:
parent
999cd0e0c9
commit
f359f46ffc
18
software.hpp
18
software.hpp
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
#include "../io/io.hpp"
|
#include "../io/io.hpp"
|
||||||
#include "../util/type.hpp"
|
#include "../util/type.hpp"
|
||||||
#include "../util/util.hpp"
|
#include "../util/util.hpp"
|
||||||
@ -45,6 +47,8 @@ class Software {
|
|||||||
|
|
||||||
static word_t transfer(const word_t data)
|
static word_t transfer(const word_t data)
|
||||||
{
|
{
|
||||||
|
const auto oldInterruptState = disableInterrupts();
|
||||||
|
|
||||||
auto dataIn = word_t{};
|
auto dataIn = word_t{};
|
||||||
|
|
||||||
util::for_constexpr(
|
util::for_constexpr(
|
||||||
@ -74,6 +78,8 @@ class Software {
|
|||||||
},
|
},
|
||||||
util::make_index_sequence<Cfg::BITS>{});
|
util::make_index_sequence<Cfg::BITS>{});
|
||||||
|
|
||||||
|
enableInterrupts(oldInterruptState);
|
||||||
|
|
||||||
return dataIn;
|
return dataIn;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,6 +95,18 @@ class Software {
|
|||||||
static io::Pin<Cfg::SS_PIN> sm_ss;
|
static io::Pin<Cfg::SS_PIN> sm_ss;
|
||||||
|
|
||||||
static constexpr auto DELAY_US = calcClockDelay();
|
static constexpr auto DELAY_US = calcClockDelay();
|
||||||
|
|
||||||
|
static inline uint8_t disableInterrupts()
|
||||||
|
{
|
||||||
|
const auto oldInterruptState = SREG;
|
||||||
|
cli();
|
||||||
|
return oldInterruptState;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void enableInterrupts(const uint8_t oldInterruptState)
|
||||||
|
{
|
||||||
|
SREG = oldInterruptState;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace spi
|
} // namespace spi
|
||||||
|
Loading…
Reference in New Issue
Block a user