2020 */  
2121
2222#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 
2332
2433SPIClass::SPIClass (uint8_t  spi_bus)
2534 :_spi_num(spi_bus)
@@ -32,7 +41,31 @@ SPIClass::SPIClass(uint8_t spi_bus)
3241 ,_div(0 )
3342 ,_freq(1000000 )
3443 ,_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 
3556{}
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+ }
3669
3770void  SPIClass::begin (int8_t  sck, int8_t  miso, int8_t  mosi, int8_t  ss)
3871{
@@ -106,19 +139,23 @@ void SPIClass::setHwCs(bool use)
106139
107140void  SPIClass::setFrequency (uint32_t  freq)
108141{
142+  SPI_PARAM_LOCK ();
109143 // check if last freq changed
110144 uint32_t  cdiv = spiGetClockDiv (_spi);
111145 if (_freq != freq || _div != cdiv) {
112146 _freq = freq;
113147 _div = spiFrequencyToClockDiv (_freq);
114148 spiSetClockDiv (_spi, _div);
115149 }
150+  SPI_PARAM_UNLOCK ();
116151}
117152
118153void  SPIClass::setClockDivider (uint32_t  clockDiv)
119154{
155+  SPI_PARAM_LOCK ();
120156 _div = clockDiv;
121157 spiSetClockDiv (_spi, _div);
158+  SPI_PARAM_UNLOCK ();
122159}
123160
124161uint32_t  SPIClass::getClockDivider ()
@@ -138,6 +175,7 @@ void SPIClass::setBitOrder(uint8_t bitOrder)
138175
139176void  SPIClass::beginTransaction (SPISettings settings)
140177{
178+  SPI_PARAM_LOCK ();
141179 // check if last freq changed
142180 uint32_t  cdiv = spiGetClockDiv (_spi);
143181 if (_freq != settings._clock  || _div != cdiv) {
@@ -153,6 +191,7 @@ void SPIClass::endTransaction()
153191 if (_inTransaction){
154192 _inTransaction = false ;
155193 spiEndTransaction (_spi);
194+  SPI_PARAM_UNLOCK (); //  <-- Im not sure should it be here or right after spiTransaction()
156195 }
157196}
158197
0 commit comments