Skip to content

Commit 3fbdbb8

Browse files
committed
[SPI] Fix CS pin check
stm32duino#800 introduced a regression on analog pins Ax usage as CS pin. Signed-off-by: Frederic Pillon <[email protected]>
1 parent 642e6a2 commit 3fbdbb8

File tree

2 files changed

+17
-49
lines changed

2 files changed

+17
-49
lines changed

Diff for: libraries/SPI/src/SPI.cpp

+15-47
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,7 @@ SPIClass::SPIClass(uint8_t mosi, uint8_t miso, uint8_t sclk, uint8_t ssel) : _CS
5959
*/
6060
void SPIClass::begin(uint8_t _pin)
6161
{
62-
uint8_t idx;
63-
64-
if (_pin > NUM_DIGITAL_PINS) {
65-
return;
66-
}
67-
68-
idx = pinIdx(_pin, ADD_NEW_PIN);
62+
uint8_t idx = pinIdx(_pin, ADD_NEW_PIN);
6963
if (idx >= NB_SPI_SETTINGS) {
7064
return;
7165
}
@@ -101,13 +95,7 @@ void SPIClass::begin(uint8_t _pin)
10195
*/
10296
void SPIClass::beginTransaction(uint8_t _pin, SPISettings settings)
10397
{
104-
uint8_t idx;
105-
106-
if (_pin > NUM_DIGITAL_PINS) {
107-
return;
108-
}
109-
110-
idx = pinIdx(_pin, ADD_NEW_PIN);
98+
uint8_t idx = pinIdx(_pin, ADD_NEW_PIN);
11199
if (idx >= NB_SPI_SETTINGS) {
112100
return;
113101
}
@@ -134,10 +122,6 @@ void SPIClass::beginTransaction(uint8_t _pin, SPISettings settings)
134122
*/
135123
void SPIClass::endTransaction(uint8_t _pin)
136124
{
137-
if (_pin > NUM_DIGITAL_PINS) {
138-
return;
139-
}
140-
141125
RemovePin(_pin);
142126
_CSPinConfig = NO_CONFIG;
143127
}
@@ -160,10 +144,6 @@ void SPIClass::end()
160144
*/
161145
void SPIClass::setBitOrder(uint8_t _pin, BitOrder _bitOrder)
162146
{
163-
if (_pin > NUM_DIGITAL_PINS) {
164-
return;
165-
}
166-
167147
uint8_t idx = pinIdx(_pin, GET_IDX);
168148
if (idx >= NB_SPI_SETTINGS) {
169149
return;
@@ -190,10 +170,6 @@ void SPIClass::setBitOrder(uint8_t _pin, BitOrder _bitOrder)
190170
*/
191171
void SPIClass::setDataMode(uint8_t _pin, uint8_t _mode)
192172
{
193-
if (_pin > NUM_DIGITAL_PINS) {
194-
return;
195-
}
196-
197173
uint8_t idx = pinIdx(_pin, GET_IDX);
198174
if (idx >= NB_SPI_SETTINGS) {
199175
return;
@@ -223,10 +199,6 @@ void SPIClass::setDataMode(uint8_t _pin, uint8_t _mode)
223199
*/
224200
void SPIClass::setClockDivider(uint8_t _pin, uint8_t _divider)
225201
{
226-
if (_pin > NUM_DIGITAL_PINS) {
227-
return;
228-
}
229-
230202
uint8_t idx = pinIdx(_pin, GET_IDX);
231203
if (idx >= NB_SPI_SETTINGS) {
232204
return;
@@ -260,14 +232,12 @@ byte SPIClass::transfer(uint8_t _pin, uint8_t data, SPITransferMode _mode)
260232
{
261233
uint8_t rx_buffer = 0;
262234

263-
if (_pin > NUM_DIGITAL_PINS) {
235+
uint8_t idx = pinIdx(_pin, GET_IDX);
236+
if (idx >= NB_SPI_SETTINGS) {
264237
return rx_buffer;
265238
}
266-
uint8_t idx = pinIdx(_pin, GET_IDX);
239+
267240
if (_pin != _CSPinConfig) {
268-
if (idx >= NB_SPI_SETTINGS) {
269-
return rx_buffer;
270-
}
271241
spi_init(&_spi, spiSettings[idx].clk,
272242
spiSettings[idx].dMode,
273243
spiSettings[idx].bOrder);
@@ -305,10 +275,6 @@ uint16_t SPIClass::transfer16(uint8_t _pin, uint16_t data, SPITransferMode _mode
305275
uint16_t rx_buffer = 0;
306276
uint16_t tmp;
307277

308-
if (_pin > NUM_DIGITAL_PINS) {
309-
return rx_buffer;
310-
}
311-
312278
uint8_t idx = pinIdx(_pin, GET_IDX);
313279
if (idx >= NB_SPI_SETTINGS) {
314280
return rx_buffer;
@@ -361,14 +327,15 @@ uint16_t SPIClass::transfer16(uint8_t _pin, uint16_t data, SPITransferMode _mode
361327
*/
362328
void SPIClass::transfer(uint8_t _pin, void *_buf, size_t _count, SPITransferMode _mode)
363329
{
364-
if ((_count == 0) || (_buf == NULL) || (_pin > NUM_DIGITAL_PINS)) {
330+
if ((_count == 0) || (_buf == NULL)) {
365331
return;
366332
}
367333
uint8_t idx = pinIdx(_pin, GET_IDX);
334+
if (idx >= NB_SPI_SETTINGS) {
335+
return;
336+
}
368337
if (_pin != _CSPinConfig) {
369-
if (idx >= NB_SPI_SETTINGS) {
370-
return;
371-
}
338+
372339
spi_init(&_spi, spiSettings[idx].clk,
373340
spiSettings[idx].dMode,
374341
spiSettings[idx].bOrder);
@@ -404,14 +371,15 @@ void SPIClass::transfer(uint8_t _pin, void *_buf, size_t _count, SPITransferMode
404371
*/
405372
void SPIClass::transfer(byte _pin, void *_bufout, void *_bufin, size_t _count, SPITransferMode _mode)
406373
{
407-
if ((_count == 0) || (_bufout == NULL) || (_bufin == NULL) || (_pin > NUM_DIGITAL_PINS)) {
374+
if ((_count == 0) || (_bufout == NULL) || (_bufin == NULL)) {
408375
return;
409376
}
410377
uint8_t idx = pinIdx(_pin, GET_IDX);
378+
if (idx >= NB_SPI_SETTINGS) {
379+
return;
380+
}
381+
411382
if (_pin != _CSPinConfig) {
412-
if (idx >= NB_SPI_SETTINGS) {
413-
return;
414-
}
415383
spi_init(&_spi, spiSettings[idx].clk,
416384
spiSettings[idx].dMode,
417385
spiSettings[idx].bOrder);

Diff for: libraries/SPI/src/SPI.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ class SPIClass {
248248
{
249249
uint8_t i;
250250

251-
if (_pin > NUM_DIGITAL_PINS) {
251+
if ((_pin > NUM_DIGITAL_PINS) && (!digitalPinIsValid(_pin))) {
252252
return NB_SPI_SETTINGS;
253253
}
254254

@@ -271,7 +271,7 @@ class SPIClass {
271271

272272
void RemovePin(uint8_t _pin)
273273
{
274-
if (_pin > NUM_DIGITAL_PINS) {
274+
if ((_pin > NUM_DIGITAL_PINS) && (!digitalPinIsValid(_pin))) {
275275
return;
276276
}
277277

0 commit comments

Comments
 (0)