@@ -22,6 +22,7 @@ SPIClass::SPIClass() : _CSPinConfig(NO_CONFIG)
2222 _spi.pin_mosi = digitalPinToPinName (MOSI);
2323 _spi.pin_sclk = digitalPinToPinName (SCK);
2424 _spi.pin_ssel = NC;
25+ _device = SPI_MASTER;
2526}
2627
2728/* *
@@ -49,27 +50,36 @@ SPIClass::SPIClass(uint32_t mosi, uint32_t miso, uint32_t sclk, uint32_t ssel) :
4950 _spi.pin_mosi = digitalPinToPinName (mosi);
5051 _spi.pin_sclk = digitalPinToPinName (sclk);
5152 _spi.pin_ssel = digitalPinToPinName (ssel);
53+ _device = SPI_MASTER;
5254}
5355
5456/* *
5557 * @brief Initialize the SPI instance.
5658 * @param _pin: chip select pin (optional). If this parameter is filled,
5759 * it gives the management of the CS pin to the SPI class. In this case
5860 * do not manage the CS pin outside of the SPI class.
61+ * @param device: device mode (optional), master or slave. Default is master.
5962 */
60- void SPIClass::begin (uint8_t _pin)
63+ void SPIClass::begin (uint8_t _pin, SPIDeviceMode device )
6164{
65+ _device = device;
66+
6267 uint8_t idx = pinIdx (_pin, ADD_NEW_PIN);
6368 if (idx >= NB_SPI_SETTINGS) {
6469 return ;
6570 }
6671
6772 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+ }
7079 }
7180
7281 _spi.handle .State = HAL_SPI_STATE_RESET;
82+ _spi.handle .Init .Mode = (_device == SPI_MASTER) ? SPI_MODE_MASTER : SPI_MODE_SLAVE;
7383 spi_init (&_spi, spiSettings[idx].clk ,
7484 spiSettings[idx].dMode ,
7585 spiSettings[idx].bOrder );
@@ -106,10 +116,15 @@ void SPIClass::beginTransaction(uint8_t _pin, SPISettings settings)
106116 spiSettings[idx].noReceive = settings.noReceive ;
107117
108118 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+ }
111125 }
112126
127+ _spi.handle .Init .Mode = (_device == SPI_MASTER) ? SPI_MODE_MASTER : SPI_MODE_SLAVE;
113128 spi_init (&_spi, spiSettings[idx].clk ,
114129 spiSettings[idx].dMode ,
115130 spiSettings[idx].bOrder );
@@ -244,13 +259,13 @@ byte SPIClass::transfer(uint8_t _pin, uint8_t data, SPITransferMode _mode)
244259 _CSPinConfig = _pin;
245260 }
246261
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)) {
248263 digitalWrite (_pin, LOW);
249264 }
250265
251266 spi_transfer (&_spi, &data, &rx_buffer, sizeof (uint8_t ), SPI_TRANSFER_TIMEOUT, spiSettings[idx].noReceive );
252267
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)) {
254269 digitalWrite (_pin, HIGH);
255270 }
256271
@@ -292,14 +307,14 @@ uint16_t SPIClass::transfer16(uint8_t _pin, uint16_t data, SPITransferMode _mode
292307 data = tmp;
293308 }
294309
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)) {
296311 digitalWrite (_pin, LOW);
297312 }
298313
299314 spi_transfer (&_spi, (uint8_t *)&data, (uint8_t *)&rx_buffer, sizeof (uint16_t ),
300315 SPI_TRANSFER_TIMEOUT, spiSettings[idx].noReceive );
301316
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)) {
303318 digitalWrite (_pin, HIGH);
304319 }
305320
@@ -342,14 +357,14 @@ void SPIClass::transfer(uint8_t _pin, void *_buf, size_t _count, SPITransferMode
342357 _CSPinConfig = _pin;
343358 }
344359
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)) {
346361 digitalWrite (_pin, LOW);
347362 }
348363
349364 spi_transfer (&_spi, ((uint8_t *)_buf), ((uint8_t *)_buf), _count,
350365 SPI_TRANSFER_TIMEOUT, spiSettings[idx].noReceive );
351366
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)) {
353368 digitalWrite (_pin, HIGH);
354369 }
355370}
@@ -386,14 +401,14 @@ void SPIClass::transfer(byte _pin, void *_bufout, void *_bufin, size_t _count, S
386401 _CSPinConfig = _pin;
387402 }
388403
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)) {
390405 digitalWrite (_pin, LOW);
391406 }
392407
393408 spi_transfer (&_spi, ((uint8_t *)_bufout), ((uint8_t *)_bufin), _count,
394409 SPI_TRANSFER_TIMEOUT, spiSettings[idx].noReceive );
395410
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)) {
397412 digitalWrite (_pin, HIGH);
398413 }
399414}
0 commit comments