Skip to content

Commit 8629853

Browse files
author
fpr
committed
Fixed issue #11: SPI constructors and SS pin usage modified
Signed-off-by: fpr <[email protected]>
1 parent 2fa0645 commit 8629853

File tree

3 files changed

+26
-12
lines changed

3 files changed

+26
-12
lines changed

cores/arduino/stm32/spi_com.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,12 @@ void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
144144
g_pin_sclk = obj->pin_sclk;
145145
if (obj->pin_ssel != NC) {
146146
g_pin_ssel = obj->pin_ssel;
147+
handle->Init.NSS = SPI_NSS_HARD_OUTPUT;
148+
handle->Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
147149
} else {
148150
g_pin_ssel = NC;
149151
handle->Init.NSS = SPI_NSS_SOFT;
152+
handle->Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
150153
}
151154

152155
/* Fill default value */

libraries/SPI/SPI.cpp

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@
1111

1212
#include "SPI.h"
1313

14-
14+
/* The following contructors are available:
15+
- SPIClass SPI
16+
- SPIClass SPI(mosi,miso,sclk)
17+
- SPIClass SPI(mosi,miso,sclk,ss)
18+
*/
1519
SPIClass SPI;
1620

1721
SPIClass::SPIClass() : g_active_id(-1)
@@ -22,13 +26,20 @@ SPIClass::SPIClass() : g_active_id(-1)
2226
_spi.pin_ssel = NC;
2327
}
2428

29+
/* By default hardware SS pin is not used. To use hardware SS pin you should set
30+
ssel pin. Enable this pin disable software CS. See microcontroller documentation
31+
for the list of available SS pins. */
2532
SPIClass::SPIClass(uint8_t mosi, uint8_t miso, uint8_t sclk, uint8_t ssel) : g_active_id(-1)
2633
{
2734
_spi.pin_miso = digitalToPinName(miso);
2835
_spi.pin_mosi = digitalToPinName(mosi);
2936
_spi.pin_sclk = digitalToPinName(sclk);
30-
// If no ssel pin used, set it to value NUM_DIGITAL_PINS
31-
_spi.pin_ssel = digitalToPinName(ssel);
37+
38+
if(ssel != 0xFF) {
39+
_spi.pin_ssel = digitalToPinName(ssel);
40+
} else {
41+
_spi.pin_ssel = NC;
42+
}
3243
}
3344

3445
//begin using the default chip select
@@ -43,7 +54,7 @@ void SPIClass::begin(uint8_t _pin)
4354
if(_pin > SPI_CHANNELS_NUM)
4455
return;
4556

46-
if(_pin != BOARD_SPI_OWN_SS) {
57+
if((_pin != BOARD_SPI_OWN_SS) && (_spi.pin_ssel == NC)) {
4758
pinMode(_pin, OUTPUT);
4859
digitalWrite(_pin, HIGH);
4960
}
@@ -185,12 +196,12 @@ byte SPIClass::transfer(uint8_t _pin, uint8_t data, SPITransferMode _mode)
185196
g_active_id = _pin;
186197
}
187198

188-
if(_pin != BOARD_SPI_OWN_SS)
199+
if((_pin != BOARD_SPI_OWN_SS) && (_spi.pin_ssel == NC))
189200
digitalWrite(_pin, LOW);
190201

191-
spi_transfer(&_spi, &data, &rx_buffer, sizeof(uint8_t), 10000000);
202+
spi_transfer(&_spi, &data, &rx_buffer, sizeof(uint8_t), 10000);
192203

193-
if((_pin != BOARD_SPI_OWN_SS) && (_mode == SPI_LAST))
204+
if((_pin != BOARD_SPI_OWN_SS) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC))
194205
digitalWrite(_pin, HIGH);
195206

196207
return rx_buffer;
@@ -208,12 +219,12 @@ uint16_t SPIClass::transfer16(uint8_t _pin, uint16_t data, SPITransferMode _mode
208219
g_active_id = _pin;
209220
}
210221

211-
if(_pin != BOARD_SPI_OWN_SS)
222+
if((_pin != BOARD_SPI_OWN_SS) && (_spi.pin_ssel == NC))
212223
digitalWrite(_pin, LOW);
213224

214225
spi_transfer(&_spi, (uint8_t *)&data, (uint8_t *)&rx_buffer, sizeof(uint16_t), 10000000);
215226

216-
if((_pin != BOARD_SPI_OWN_SS) && (_mode == SPI_LAST))
227+
if((_pin != BOARD_SPI_OWN_SS) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC))
217228
digitalWrite(_pin, HIGH);
218229

219230
return rx_buffer;
@@ -229,12 +240,12 @@ void SPIClass::transfer(uint8_t _pin, void *_buf, size_t _count, SPITransferMode
229240
g_active_id = _pin;
230241
}
231242

232-
if(_pin != BOARD_SPI_OWN_SS)
243+
if((_pin != BOARD_SPI_OWN_SS) && (_spi.pin_ssel == NC))
233244
digitalWrite(_pin, LOW);
234245

235246
spi_send(&_spi,(uint8_t *)_buf, _count,10000);
236247

237-
if((_pin != BOARD_SPI_OWN_SS) && (_mode == SPI_LAST))
248+
if((_pin != BOARD_SPI_OWN_SS) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC))
238249
digitalWrite(_pin, HIGH);
239250
}
240251

libraries/SPI/SPI.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class SPISettings {
125125
class SPIClass {
126126
public:
127127
SPIClass();
128-
SPIClass(uint8_t mosi, uint8_t miso, uint8_t sclk, uint8_t ssel);
128+
SPIClass(uint8_t mosi, uint8_t miso, uint8_t sclk, uint8_t ssel = 0xFF);
129129

130130
// Transfer functions
131131
byte transfer(byte _pin, uint8_t _data, SPITransferMode _mode = SPI_LAST);

0 commit comments

Comments
 (0)