Skip to content

Commit d8a1219

Browse files
committed
[STM32][SPI]根据频率计算收发超时时间
1 parent 1ff2bf1 commit d8a1219

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed

bsp/stm32/libraries/HAL_Drivers/drivers/drv_spi.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur
195195
spi_handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
196196
}
197197

198+
cfg->usage_freq = SPI_CLOCK / (rt_size_t)pow(2,(spi_handle->Init.BaudRatePrescaler >> 28) + 1);
199+
198200
LOG_D("sys freq: %d, pclk freq: %d, SPI limiting freq: %d, SPI usage freq: %d",
199201
#if defined(SOC_SERIES_STM32MP1)
200202
HAL_RCC_GetSystemCoreClockFreq(),
@@ -203,7 +205,7 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur
203205
#endif
204206
SPI_CLOCK,
205207
cfg->max_hz,
206-
SPI_CLOCK / (rt_size_t)pow(2,(spi_handle->Init.BaudRatePrescaler >> 28) + 1));
208+
cfg->usage_freq);
207209

208210
if (cfg->mode & RT_SPI_MSB)
209211
{
@@ -280,7 +282,7 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur
280282

281283
static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *message)
282284
{
283-
#define DMA_TRANS_MIN_LEN 10 /* only buffer length >= DMA_TRANS_MIN_LEN will use DMA mode */
285+
#define DMA_TRANS_MIN_LEN 10 /* only buffer length >= DMA_TRANS_MIN_LEN will use DMA mode */
284286

285287
HAL_StatusTypeDef state = HAL_OK;
286288
rt_size_t message_length, already_send_length;
@@ -294,6 +296,8 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *m
294296

295297
struct stm32_spi *spi_drv = rt_container_of(device->bus, struct stm32_spi, spi_bus);
296298
SPI_HandleTypeDef *spi_handle = &spi_drv->handle;
299+
rt_uint32_t timeout = message->length / (1000 * spi_drv->cfg->usage_freq) + 5;
300+
297301

298302
if (message->cs_take && !(device->config.mode & RT_SPI_NO_CS) && (device->cs_pin != PIN_NONE))
299303
{
@@ -424,7 +428,7 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *m
424428
}
425429
else
426430
{
427-
state = HAL_SPI_TransmitReceive(spi_handle, (uint8_t *)send_buf, (uint8_t *)recv_buf, send_length, 1000);
431+
state = HAL_SPI_TransmitReceive(spi_handle, (uint8_t *)send_buf, (uint8_t *)recv_buf, send_length, timeout);
428432
}
429433
}
430434
else if (message->send_buf)
@@ -435,7 +439,7 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *m
435439
}
436440
else
437441
{
438-
state = HAL_SPI_Transmit(spi_handle, (uint8_t *)send_buf, send_length, 1000);
442+
state = HAL_SPI_Transmit(spi_handle, (uint8_t *)send_buf, send_length, timeout);
439443
}
440444

441445
if (message->cs_release && (device->config.mode & RT_SPI_3WIRE))
@@ -455,7 +459,7 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *m
455459
{
456460
/* clear the old error flag */
457461
__HAL_SPI_CLEAR_OVRFLAG(spi_handle);
458-
state = HAL_SPI_Receive(spi_handle, (uint8_t *)recv_buf, send_length, 1000);
462+
state = HAL_SPI_Receive(spi_handle, (uint8_t *)recv_buf, send_length, timeout);
459463
}
460464
}
461465
else
@@ -482,7 +486,7 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *m
482486
if ((spi_drv->spi_dma_flag & (SPI_USING_TX_DMA_FLAG | SPI_USING_RX_DMA_FLAG)) && (send_length >= DMA_TRANS_MIN_LEN))
483487
{
484488
/* blocking the thread,and the other tasks can run */
485-
if (rt_completion_wait(&spi_drv->cpt, 1000) != RT_EOK)
489+
if (rt_completion_wait(&spi_drv->cpt, timeout) != RT_EOK)
486490
{
487491
state = HAL_ERROR;
488492
LOG_E("wait for DMA interrupt overtime!");

components/drivers/include/drivers/spi_core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ struct rt_spi_configuration
8181
rt_uint16_t reserved;
8282

8383
rt_uint32_t max_hz;
84+
rt_uint32_t usage_freq;
8485
};
8586

8687
struct rt_spi_ops;

0 commit comments

Comments
 (0)