@@ -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