@@ -248,6 +248,10 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur
248248static 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