20
20
*/
21
21
22
22
#include " SPI.h"
23
+ #include " esp32-hal-log.h"
24
+
25
+ #if !CONFIG_DISABLE_HAL_LOCKS
26
+ #define SPI_PARAM_LOCK () do {} while (xSemaphoreTake(paramLock, portMAX_DELAY) != pdPASS)
27
+ #define SPI_PARAM_UNLOCK () xSemaphoreGive(paramLock)
28
+ #else
29
+ #define SPI_PARAM_LOCK ()
30
+ #define SPI_PARAM_UNLOCK ()
31
+ #endif
23
32
24
33
SPIClass::SPIClass (uint8_t spi_bus)
25
34
:_spi_num(spi_bus)
@@ -32,7 +41,31 @@ SPIClass::SPIClass(uint8_t spi_bus)
32
41
,_div(0 )
33
42
,_freq(1000000 )
34
43
,_inTransaction(false )
44
+ #if !CONFIG_DISABLE_HAL_LOCKS
45
+ ,paramLock(NULL )
46
+ {
47
+ if (paramLock==NULL ){
48
+ paramLock = xSemaphoreCreateMutex ();
49
+ if (paramLock==NULL ){
50
+ log_e (" xSemaphoreCreateMutex failed" );
51
+ return ;
52
+ }
53
+ }
54
+ }
55
+ #else
35
56
{}
57
+ #endif
58
+
59
+ SPIClass::~SPIClass ()
60
+ {
61
+ end ();
62
+ #if !CONFIG_DISABLE_HAL_LOCKS
63
+ if (paramLock!=NULL ){
64
+ vSemaphoreDelete (paramLock);
65
+ paramLock = NULL ;
66
+ }
67
+ #endif
68
+ }
36
69
37
70
void SPIClass::begin (int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
38
71
{
@@ -106,19 +139,23 @@ void SPIClass::setHwCs(bool use)
106
139
107
140
void SPIClass::setFrequency (uint32_t freq)
108
141
{
142
+ SPI_PARAM_LOCK ();
109
143
// check if last freq changed
110
144
uint32_t cdiv = spiGetClockDiv (_spi);
111
145
if (_freq != freq || _div != cdiv) {
112
146
_freq = freq;
113
147
_div = spiFrequencyToClockDiv (_freq);
114
148
spiSetClockDiv (_spi, _div);
115
149
}
150
+ SPI_PARAM_UNLOCK ();
116
151
}
117
152
118
153
void SPIClass::setClockDivider (uint32_t clockDiv)
119
154
{
155
+ SPI_PARAM_LOCK ();
120
156
_div = clockDiv;
121
157
spiSetClockDiv (_spi, _div);
158
+ SPI_PARAM_UNLOCK ();
122
159
}
123
160
124
161
uint32_t SPIClass::getClockDivider ()
@@ -138,6 +175,7 @@ void SPIClass::setBitOrder(uint8_t bitOrder)
138
175
139
176
void SPIClass::beginTransaction (SPISettings settings)
140
177
{
178
+ SPI_PARAM_LOCK ();
141
179
// check if last freq changed
142
180
uint32_t cdiv = spiGetClockDiv (_spi);
143
181
if (_freq != settings._clock || _div != cdiv) {
@@ -153,6 +191,7 @@ void SPIClass::endTransaction()
153
191
if (_inTransaction){
154
192
_inTransaction = false ;
155
193
spiEndTransaction (_spi);
194
+ SPI_PARAM_UNLOCK (); // <-- Im not sure should it be here or right after spiTransaction()
156
195
}
157
196
}
158
197
0 commit comments