@@ -47,8 +47,11 @@ void SPIClass::init() {
47
47
if (initialized)
48
48
return ;
49
49
interruptMode = 0 ;
50
- interruptMask = 0 ;
51
50
interruptSave = 0 ;
51
+ interruptMask[0 ] = 0 ;
52
+ interruptMask[1 ] = 0 ;
53
+ interruptMask[2 ] = 0 ;
54
+ interruptMask[3 ] = 0 ;
52
55
initCb ();
53
56
SPI_Configure (spi, id, SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS);
54
57
SPI_Enable (spi);
@@ -59,9 +62,11 @@ void SPIClass::init() {
59
62
#define interruptsStatus () __interruptsStatus()
60
63
static inline unsigned char __interruptsStatus (void ) __attribute__((always_inline, unused));
61
64
static inline unsigned char __interruptsStatus (void ) {
62
- unsigned int primask;
65
+ unsigned int primask, faultmask ;
63
66
asm volatile (" mrs %0, primask" : " =r" (primask));
64
67
if (primask) return 0 ;
68
+ asm volatile (" mrs %0, faultmask" : " =r" (faultmask));
69
+ if (faultmask) return 0 ;
65
70
return 1 ;
66
71
}
67
72
#endif
@@ -72,37 +77,41 @@ void SPIClass::usingInterrupt(uint8_t interruptNumber)
72
77
73
78
irestore = interruptsStatus ();
74
79
noInterrupts ();
75
- if (interruptMode < 2 ) {
80
+ if (interruptMode < 16 ) {
76
81
if (interruptNumber > NUM_DIGITAL_PINS) {
77
- interruptMode = 2 ;
82
+ interruptMode = 16 ;
78
83
} else {
79
- uint8_t imask = interruptMask;
80
84
Pio *pio = g_APinDescription[interruptNumber].pPort ;
85
+ uint32_t mask = g_APinDescription[interruptNumber].ulPin ;
81
86
if (pio == PIOA) {
82
- imask |= 1 ;
87
+ interruptMode |= 1 ;
88
+ interruptMask[0 ] |= mask;
83
89
} else if (pio == PIOB) {
84
- imask |= 2 ;
90
+ interruptMode |= 2 ;
91
+ interruptMask[1 ] |= mask;
85
92
} else if (pio == PIOC) {
86
- imask |= 4 ;
93
+ interruptMode |= 4 ;
94
+ interruptMask[2 ] |= mask;
87
95
} else if (pio == PIOD) {
88
- imask |= 8 ;
96
+ interruptMode |= 8 ;
97
+ interruptMask[3 ] |= mask;
98
+ } else {
99
+ interruptMode = 16 ;
89
100
}
90
- interruptMask = imask;
91
- interruptMode = 1 ;
92
101
}
93
102
}
94
103
if (irestore) interrupts ();
95
104
}
96
105
97
106
void SPIClass::beginTransaction (uint8_t pin, SPISettings settings)
98
107
{
99
- if (interruptMode > 0 ) {
100
- if (interruptMode == 1 ) {
101
- uint8_t imask = interruptMask;
102
- if (imask & 1 ) NVIC_DisableIRQ (PIOA_IRQn) ;
103
- if (imask & 2 ) NVIC_DisableIRQ (PIOB_IRQn) ;
104
- if (imask & 4 ) NVIC_DisableIRQ (PIOC_IRQn) ;
105
- if (imask & 8 ) NVIC_DisableIRQ (PIOD_IRQn) ;
108
+ uint8_t mode = interruptMode;
109
+ if (mode > 0 ) {
110
+ if (mode < 16 ) {
111
+ if (mode & 1 ) PIOA-> PIO_IDR = interruptMask[ 0 ] ;
112
+ if (mode & 2 ) PIOB-> PIO_IDR = interruptMask[ 1 ] ;
113
+ if (mode & 4 ) PIOC-> PIO_IDR = interruptMask[ 2 ] ;
114
+ if (mode & 8 ) PIOD-> PIO_IDR = interruptMask[ 3 ] ;
106
115
} else {
107
116
interruptSave = interruptsStatus ();
108
117
noInterrupts ();
@@ -111,17 +120,20 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings)
111
120
uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL (pin);
112
121
bitOrder[ch] = settings.border ;
113
122
SPI_ConfigureNPCS (spi, ch, settings.config );
123
+ // setBitOrder(pin, settings.border);
124
+ // setDataMode(pin, settings.datamode);
125
+ // setClockDivider(pin, settings.clockdiv);
114
126
}
115
127
116
128
void SPIClass::endTransaction (void )
117
129
{
118
- if (interruptMode > 0 ) {
119
- if (interruptMode == 1 ) {
120
- uint8_t imask = interruptMask;
121
- if (imask & 1 ) NVIC_EnableIRQ (PIOA_IRQn) ;
122
- if (imask & 2 ) NVIC_EnableIRQ (PIOB_IRQn) ;
123
- if (imask & 4 ) NVIC_EnableIRQ (PIOC_IRQn) ;
124
- if (imask & 8 ) NVIC_EnableIRQ (PIOD_IRQn) ;
130
+ uint8_t mode = interruptMode;
131
+ if (mode > 0 ) {
132
+ if (mode < 16 ) {
133
+ if (mode & 1 ) PIOA-> PIO_IER = interruptMask[ 0 ] ;
134
+ if (mode & 2 ) PIOB-> PIO_IER = interruptMask[ 1 ] ;
135
+ if (mode & 4 ) PIOC-> PIO_IER = interruptMask[ 2 ] ;
136
+ if (mode & 8 ) PIOD-> PIO_IER = interruptMask[ 3 ] ;
125
137
} else {
126
138
if (interruptSave) interrupts ();
127
139
}
0 commit comments