Skip to content

Commit e9a6050

Browse files
committed
[bsp][stm32] Fixed an error when SPI transfers data larger than 65535
1 parent 3b98ff1 commit e9a6050

File tree

1 file changed

+32
-8
lines changed

1 file changed

+32
-8
lines changed

bsp/stm32/libraries/HAL_Drivers/drv_spi.c

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,10 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur
248248
static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message *message)
249249
{
250250
HAL_StatusTypeDef state;
251+
rt_size_t message_length, already_send_length;
252+
rt_uint16_t send_length;
253+
rt_uint8_t *recv_buf;
254+
const rt_uint8_t *send_buf;
251255

252256
RT_ASSERT(device != RT_NULL);
253257
RT_ASSERT(device->bus != RT_NULL);
@@ -269,41 +273,61 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message *
269273
(uint32_t)message->send_buf,
270274
(uint32_t)message->recv_buf, message->length);
271275

272-
if (message->length)
276+
message_length = message->length;
277+
recv_buf = message->recv_buf;
278+
send_buf = message->send_buf;
279+
while (message_length)
273280
{
281+
/* the HAL library use uint16 to save the data length */
282+
if (message_length > 65535)
283+
{
284+
send_length = 65535;
285+
message_length = message_length - 65535;
286+
}
287+
else
288+
{
289+
send_length = message_length;
290+
message_length = 0;
291+
}
292+
293+
/* calculate the start address */
294+
already_send_length = message->length - send_length - message_length;
295+
send_buf = (rt_uint8_t *)message->send_buf + already_send_length;
296+
recv_buf = (rt_uint8_t *)message->recv_buf + already_send_length;
297+
274298
/* start once data exchange in DMA mode */
275299
if (message->send_buf && message->recv_buf)
276300
{
277301
if ((spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) && (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG))
278302
{
279-
state = HAL_SPI_TransmitReceive_DMA(spi_handle, (uint8_t *)message->send_buf, (uint8_t *)message->recv_buf, message->length);
303+
state = HAL_SPI_TransmitReceive_DMA(spi_handle, (uint8_t *)send_buf, (uint8_t *)recv_buf, send_length);
280304
}
281305
else
282306
{
283-
state = HAL_SPI_TransmitReceive(spi_handle, (uint8_t *)message->send_buf, (uint8_t *)message->recv_buf, message->length, 1000);
307+
state = HAL_SPI_TransmitReceive(spi_handle, (uint8_t *)send_buf, (uint8_t *)recv_buf, send_length, 1000);
284308
}
285309
}
286310
else if (message->send_buf)
287311
{
288312
if (spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG)
289313
{
290-
state = HAL_SPI_Transmit_DMA(spi_handle, (uint8_t *)message->send_buf, message->length);
314+
state = HAL_SPI_Transmit_DMA(spi_handle, (uint8_t *)send_buf, send_length);
291315
}
292316
else
293317
{
294-
state = HAL_SPI_Transmit(spi_handle, (uint8_t *)message->send_buf, message->length, 1000);
318+
state = HAL_SPI_Transmit(spi_handle, (uint8_t *)send_buf, send_length, 1000);
295319
}
296320
}
297321
else
298322
{
299-
memset(message->recv_buf, 0xff, message->length);
323+
memset((uint8_t *)recv_buf, 0xff, send_length);
300324
if (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG)
301325
{
302-
state = HAL_SPI_Receive_DMA(spi_handle, (uint8_t *)message->recv_buf, message->length);
326+
state = HAL_SPI_Receive_DMA(spi_handle, (uint8_t *)recv_buf, send_length);
303327
}
304328
else
305329
{
306-
state = HAL_SPI_Receive(spi_handle, (uint8_t *)message->recv_buf, message->length, 1000);
330+
state = HAL_SPI_Receive(spi_handle, (uint8_t *)recv_buf, send_length, 1000);
307331
}
308332
}
309333

0 commit comments

Comments
 (0)