Skip to content

Commit 00f5ed6

Browse files
committed
[avr] Made SPI.usingInterrupt() synchronized (Andrew Kroll)
1 parent 4948bf5 commit 00f5ed6

File tree

1 file changed

+7
-9
lines changed

1 file changed

+7
-9
lines changed

libraries/SPI/SPI.cpp

+7-9
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,9 @@ void SPIClass::end() {
111111

112112
void SPIClass::usingInterrupt(uint8_t interruptNumber)
113113
{
114-
uint8_t mask;
115-
116-
if (interruptMode > 1) return;
117-
118-
noInterrupts();
114+
uint8_t mask = 0;
115+
uint8_t sreg = SREG;
116+
noInterrupts(); // Protect from a scheduler and prevent transactionBegin
119117
switch (interruptNumber) {
120118
#ifdef SPI_INT0_MASK
121119
case 0: mask = SPI_INT0_MASK; break;
@@ -143,12 +141,12 @@ void SPIClass::usingInterrupt(uint8_t interruptNumber)
143141
#endif
144142
default:
145143
interruptMode = 2;
146-
interrupts();
147-
return;
144+
break;
148145
}
149-
interruptMode = 1;
150146
interruptMask |= mask;
151-
interrupts();
147+
if (!interruptMode)
148+
interruptMode = 1;
149+
SREG = sreg;
152150
}
153151

154152
void SPIClass::notUsingInterrupt(uint8_t interruptNumber)

0 commit comments

Comments
 (0)