@@ -22,6 +22,7 @@ SPIClass::SPIClass() : _CSPinConfig(NO_CONFIG)
22
22
_spi.pin_mosi = digitalPinToPinName (MOSI);
23
23
_spi.pin_sclk = digitalPinToPinName (SCK);
24
24
_spi.pin_ssel = NC;
25
+ _device = SPI_MASTER;
25
26
}
26
27
27
28
/* *
@@ -49,27 +50,36 @@ SPIClass::SPIClass(uint32_t mosi, uint32_t miso, uint32_t sclk, uint32_t ssel) :
49
50
_spi.pin_mosi = digitalPinToPinName (mosi);
50
51
_spi.pin_sclk = digitalPinToPinName (sclk);
51
52
_spi.pin_ssel = digitalPinToPinName (ssel);
53
+ _device = SPI_MASTER;
52
54
}
53
55
54
56
/* *
55
57
* @brief Initialize the SPI instance.
56
58
* @param _pin: chip select pin (optional). If this parameter is filled,
57
59
* it gives the management of the CS pin to the SPI class. In this case
58
60
* do not manage the CS pin outside of the SPI class.
61
+ * @param device: device mode (optional), master or slave. Default is master.
59
62
*/
60
- void SPIClass::begin (uint8_t _pin)
63
+ void SPIClass::begin (uint8_t _pin, SPIDeviceMode device )
61
64
{
65
+ _device = device;
66
+
62
67
uint8_t idx = pinIdx (_pin, ADD_NEW_PIN);
63
68
if (idx >= NB_SPI_SETTINGS) {
64
69
return ;
65
70
}
66
71
67
72
if ((_pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
68
- pinMode (_pin, OUTPUT);
69
- digitalWrite (_pin, HIGH);
73
+ if (_device == SPI_MASTER) {
74
+ pinMode (_pin, OUTPUT);
75
+ digitalWrite (_pin, HIGH);
76
+ } else {
77
+ pinMode (_pin, INPUT_PULLUP);
78
+ }
70
79
}
71
80
72
81
_spi.handle .State = HAL_SPI_STATE_RESET;
82
+ _spi.handle .Init .Mode = (_device == SPI_MASTER) ? SPI_MODE_MASTER : SPI_MODE_SLAVE;
73
83
spi_init (&_spi, spiSettings[idx].clk ,
74
84
spiSettings[idx].dMode ,
75
85
spiSettings[idx].bOrder );
@@ -106,10 +116,15 @@ void SPIClass::beginTransaction(uint8_t _pin, SPISettings settings)
106
116
spiSettings[idx].noReceive = settings.noReceive ;
107
117
108
118
if ((_pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
109
- pinMode (_pin, OUTPUT);
110
- digitalWrite (_pin, HIGH);
119
+ if (_device == SPI_MASTER) {
120
+ pinMode (_pin, OUTPUT);
121
+ digitalWrite (_pin, HIGH);
122
+ } else {
123
+ pinMode (_pin, INPUT_PULLUP);
124
+ }
111
125
}
112
126
127
+ _spi.handle .Init .Mode = (_device == SPI_MASTER) ? SPI_MODE_MASTER : SPI_MODE_SLAVE;
113
128
spi_init (&_spi, spiSettings[idx].clk ,
114
129
spiSettings[idx].dMode ,
115
130
spiSettings[idx].bOrder );
@@ -244,13 +259,13 @@ byte SPIClass::transfer(uint8_t _pin, uint8_t data, SPITransferMode _mode)
244
259
_CSPinConfig = _pin;
245
260
}
246
261
247
- if ((_pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
262
+ if ((_device == SPI_MASTER) && ( _pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
248
263
digitalWrite (_pin, LOW);
249
264
}
250
265
251
266
spi_transfer (&_spi, &data, &rx_buffer, sizeof (uint8_t ), SPI_TRANSFER_TIMEOUT, spiSettings[idx].noReceive );
252
267
253
- if ((_pin != CS_PIN_CONTROLLED_BY_USER) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) {
268
+ if ((_device == SPI_MASTER) && ( _pin != CS_PIN_CONTROLLED_BY_USER) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) {
254
269
digitalWrite (_pin, HIGH);
255
270
}
256
271
@@ -292,14 +307,14 @@ uint16_t SPIClass::transfer16(uint8_t _pin, uint16_t data, SPITransferMode _mode
292
307
data = tmp;
293
308
}
294
309
295
- if ((_pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
310
+ if ((_device == SPI_MASTER) && ( _pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
296
311
digitalWrite (_pin, LOW);
297
312
}
298
313
299
314
spi_transfer (&_spi, (uint8_t *)&data, (uint8_t *)&rx_buffer, sizeof (uint16_t ),
300
315
SPI_TRANSFER_TIMEOUT, spiSettings[idx].noReceive );
301
316
302
- if ((_pin != CS_PIN_CONTROLLED_BY_USER) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) {
317
+ if ((_device == SPI_MASTER) && ( _pin != CS_PIN_CONTROLLED_BY_USER) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) {
303
318
digitalWrite (_pin, HIGH);
304
319
}
305
320
@@ -342,14 +357,14 @@ void SPIClass::transfer(uint8_t _pin, void *_buf, size_t _count, SPITransferMode
342
357
_CSPinConfig = _pin;
343
358
}
344
359
345
- if ((_pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
360
+ if ((_device == SPI_MASTER) && ( _pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
346
361
digitalWrite (_pin, LOW);
347
362
}
348
363
349
364
spi_transfer (&_spi, ((uint8_t *)_buf), ((uint8_t *)_buf), _count,
350
365
SPI_TRANSFER_TIMEOUT, spiSettings[idx].noReceive );
351
366
352
- if ((_pin != CS_PIN_CONTROLLED_BY_USER) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) {
367
+ if ((_device == SPI_MASTER) && ( _pin != CS_PIN_CONTROLLED_BY_USER) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) {
353
368
digitalWrite (_pin, HIGH);
354
369
}
355
370
}
@@ -386,14 +401,14 @@ void SPIClass::transfer(byte _pin, void *_bufout, void *_bufin, size_t _count, S
386
401
_CSPinConfig = _pin;
387
402
}
388
403
389
- if ((_pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
404
+ if ((_device == SPI_MASTER) && ( _pin != CS_PIN_CONTROLLED_BY_USER) && (_spi.pin_ssel == NC)) {
390
405
digitalWrite (_pin, LOW);
391
406
}
392
407
393
408
spi_transfer (&_spi, ((uint8_t *)_bufout), ((uint8_t *)_bufin), _count,
394
409
SPI_TRANSFER_TIMEOUT, spiSettings[idx].noReceive );
395
410
396
- if ((_pin != CS_PIN_CONTROLLED_BY_USER) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) {
411
+ if ((_device == SPI_MASTER) && ( _pin != CS_PIN_CONTROLLED_BY_USER) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) {
397
412
digitalWrite (_pin, HIGH);
398
413
}
399
414
}
0 commit comments