Skip to content

Commit 6736626

Browse files
committed
[BSP][stm32] Add 3 wires SPI driver support.
1 parent 6a9e081 commit 6736626

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

bsp/stm32/libraries/HAL_Drivers/drv_spi.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
* 2020-01-15 whj4674672 Porting for stm32h7xx
1212
*/
1313

14+
#include <rtthread.h>
15+
#include <rtdevice.h>
1416
#include "board.h"
1517

1618
#ifdef RT_USING_SPI
1719

1820
#if defined(BSP_USING_SPI1) || defined(BSP_USING_SPI2) || defined(BSP_USING_SPI3) || defined(BSP_USING_SPI4) || defined(BSP_USING_SPI5) || defined(BSP_USING_SPI6)
19-
/* this driver can be disabled at menuconfig → RT-Thread Components → Device Drivers */
2021

2122
#include "drv_spi.h"
2223
#include "drv_config.h"
@@ -278,7 +279,7 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message *
278279
SPI_HandleTypeDef *spi_handle = &spi_drv->handle;
279280
struct stm32_hw_spi_cs *cs = device->parent.user_data;
280281

281-
if (message->cs_take)
282+
if (message->cs_take && !(device->config.mode & RT_SPI_NO_CS))
282283
{
283284
HAL_GPIO_WritePin(cs->GPIOx, cs->GPIO_Pin, GPIO_PIN_RESET);
284285
}
@@ -333,6 +334,12 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message *
333334
{
334335
state = HAL_SPI_Transmit(spi_handle, (uint8_t *)send_buf, send_length, 1000);
335336
}
337+
338+
if (message->cs_release && (device->config.mode & RT_SPI_3WIRE))
339+
{
340+
/* release the CS by disable SPI when using 3 wires SPI */
341+
__HAL_SPI_DISABLE(spi_handle);
342+
}
336343
}
337344
else
338345
{
@@ -343,6 +350,8 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message *
343350
}
344351
else
345352
{
353+
/* clear the old error flag */
354+
__HAL_SPI_CLEAR_OVRFLAG(spi_handle);
346355
state = HAL_SPI_Receive(spi_handle, (uint8_t *)recv_buf, send_length, 1000);
347356
}
348357
}
@@ -364,7 +373,7 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message *
364373
while (HAL_SPI_GetState(spi_handle) != HAL_SPI_STATE_READY);
365374
}
366375

367-
if (message->cs_release)
376+
if (message->cs_release && !(device->config.mode & RT_SPI_NO_CS))
368377
{
369378
HAL_GPIO_WritePin(cs->GPIOx, cs->GPIO_Pin, GPIO_PIN_SET);
370379
}

0 commit comments

Comments
 (0)