Skip to content

Commit 101c8db

Browse files
committed
Fix spi_com config for SPI_DIRECTION_2LINES_RXONLY
1 parent 54f49cc commit 101c8db

File tree

1 file changed

+70
-10
lines changed

1 file changed

+70
-10
lines changed

libraries/SPI/src/utility/spi_com.c

Lines changed: 70 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,51 @@ spi_status_e spi_init(spi_t *obj, uint32_t speed, SPIMode mode, uint8_t msb, SPI
237237
}
238238
}
239239

240+
/* Validate pins based on direction mode */
241+
if (obj->direction == SPI_DIRECTION_1LINE) {
242+
/* Half-duplex: only MOSI (master) or MISO (slave) is used */
243+
if (obj->mode == SPI_MODE_MASTER) {
244+
if (spi_mosi == NP) {
245+
core_debug("ERROR: MOSI required for 1-line master mode\n");
246+
return SPI_ERROR;
247+
}
248+
spi_miso = spi_mosi; /* Merge with same peripheral for validation */
249+
} else {
250+
if (spi_miso == NP) {
251+
core_debug("ERROR: MISO required for 1-line slave mode\n");
252+
return SPI_ERROR;
253+
}
254+
spi_mosi = spi_miso; /* Merge with same peripheral for validation */
255+
}
256+
} else if (obj->direction == SPI_DIRECTION_2LINES_RXONLY) {
257+
/* RX-only: only MISO (master) or MOSI (slave) is used */
258+
if (obj->mode == SPI_MODE_MASTER) {
259+
if (spi_miso == NP) {
260+
core_debug("ERROR: MISO required for master RX-only mode\n");
261+
return SPI_ERROR;
262+
}
263+
spi_mosi = spi_miso; /* Merge with same peripheral for validation */
264+
} else {
265+
if (spi_mosi == NP) {
266+
core_debug("ERROR: MOSI required for slave RX-only mode\n");
267+
return SPI_ERROR;
268+
}
269+
spi_miso = spi_mosi; /* Merge with same peripheral for validation */
270+
}
271+
} else {
272+
/* Full duplex (SPI_DIRECTION_2LINES): both MOSI and MISO required */
273+
if (spi_mosi == NP || spi_miso == NP) {
274+
core_debug("ERROR: Both MOSI and MISO required for 2-line mode\n");
275+
return SPI_ERROR;
276+
}
277+
}
278+
279+
/* Validate SCLK is always required */
280+
if (spi_sclk == NP) {
281+
core_debug("ERROR: SCLK is required\n");
282+
return SPI_ERROR;
283+
}
284+
240285
SPI_TypeDef *spi_data = pinmap_merge_peripheral(spi_mosi, spi_miso);
241286
SPI_TypeDef *spi_cntl = pinmap_merge_peripheral(spi_sclk, spi_ssel);
242287

@@ -335,19 +380,34 @@ spi_status_e spi_init(spi_t *obj, uint32_t speed, SPIMode mode, uint8_t msb, SPI
335380
#if defined(SUBGHZSPI_BASE)
336381
if (handle->Instance != SUBGHZSPI) {
337382
#endif
338-
/* Configure SPI GPIO pins based on device mode and duplex setting */
339-
if (obj->mode == SPI_MODE_MASTER) {
340-
/* Master mode: configure MOSI for output */
341-
pinmap_pinout(obj->pin_mosi, PinMap_SPI_MOSI);
342-
/* Configure MISO for input if duplex is enabled */
343-
if (obj->duplex) {
383+
/* Configure SPI GPIO pins based on device mode and direction */
384+
if (obj->direction == SPI_DIRECTION_1LINE) {
385+
/* Half-duplex mode: single bidirectional data line */
386+
if (obj->mode == SPI_MODE_MASTER) {
387+
/* Master uses MOSI as bidirectional line */
388+
pinmap_pinout(obj->pin_mosi, PinMap_SPI_MOSI);
389+
} else {
390+
/* Slave uses MISO as bidirectional line */
344391
pinmap_pinout(obj->pin_miso, PinMap_SPI_MISO);
345392
}
393+
} else if (obj->direction == SPI_DIRECTION_2LINES_RXONLY) {
394+
/* RX-only mode: only receive pin is configured */
395+
if (obj->mode == SPI_MODE_MASTER) {
396+
/* Master RX-only: only configure MISO (receives from slave) */
397+
pinmap_pinout(obj->pin_miso, PinMap_SPI_MISO);
398+
} else {
399+
/* Slave RX-only: only configure MOSI (receives from master) */
400+
pinmap_pinout(obj->pin_mosi, PinMap_SPI_MOSI);
401+
}
346402
} else {
347-
/* Slave mode: configure MISO for output */
348-
pinmap_pinout(obj->pin_miso, PinMap_SPI_MISO);
349-
/* Configure MOSI for input if duplex is enabled */
350-
if (obj->duplex) {
403+
/* Full duplex mode (SPI_DIRECTION_2LINES): configure both pins */
404+
if (obj->mode == SPI_MODE_MASTER) {
405+
/* Master mode: configure MOSI for output and MISO for input */
406+
pinmap_pinout(obj->pin_mosi, PinMap_SPI_MOSI);
407+
pinmap_pinout(obj->pin_miso, PinMap_SPI_MISO);
408+
} else {
409+
/* Slave mode: configure MISO for output and MOSI for input */
410+
pinmap_pinout(obj->pin_miso, PinMap_SPI_MISO);
351411
pinmap_pinout(obj->pin_mosi, PinMap_SPI_MOSI);
352412
}
353413
}

0 commit comments

Comments
 (0)