STM32
直播中

陈伟

7年用户 1523经验值
私信 关注
[问答]

请问如何减小HAL_SPI_Receive函数的等待时间?

我想用STM32f303的两路SPI在4µs内各接收1个16bit 的数据,SPI SCK 18MHz 没毛病,但是两个HAL_SPI_RECEIVE 函数之间的等待时间却为惊人的8µs,竟然远大于<1µs 的信号传送时间,我的问题是,如何减小这个等待时间? 必须自己写底层函数吗?
SPI configuration:
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;[url=]Url[/url]
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init( hspi1) != HAL_OK)
  {
    Error_Handler();
  }


测试放到main中的循环中
while(1)

{

uint16_t data_in;


HAL_SPI_Receive( hspi1,(uint8_t *) data_in,1,1);

}

回帖(2)

李煜启

2024-4-10 10:42:31
不建议用同一片上的两路SPI互收发测试,最好用两块板一主一从测试,这样各干各的活。
不过单字节/单字收发的话,效率是很低,一个HAL_SPI_Receive函数,里面代码不少。
举报

马占云

2024-4-10 17:41:32
要减小HAL_SPI_Receive函数的等待时间,可以使用DMA来接收SPI数据。使用DMA可以减少CPU的负担,同时提高数据传输的效率。

要使用DMA接收SPI数据,可以按照以下步骤进行配置:

1. 配置SPI的DMA模式:
   ```c
   hspi1.Init.Mode = SPI_MODE_MASTER;
   hspi1.Init.Direction = SPI_DIRECTION_2LINES;
   hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
   hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
   ...
   ```

2. 配置DMA通道:
   ```c
   hdma_spi_rx.Instance = DMAx_Channely;
   hdma_spi_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
   hdma_spi_rx.Init.PeriphInc = DMA_PINC_DISABLE;
   hdma_spi_rx.Init.MemInc = DMA_MINC_ENABLE;
   hdma_spi_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
   hdma_spi_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
   hdma_spi_rx.Init.Mode = DMA_NORMAL;
   hdma_spi_rx.Init.Priority = DMA_PRIORITY_HIGH;
   hdma_spi_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
   ...
   ```

3. 配置DMA的传输长度和地址:
   ```c
   HAL_DMA_Start(&hdma_spi_rx, (uint32_t)&hspi1.Instance->DR, (uint32_t)receiveBuffer, dataLength);
   ```

4. 启用SPI DMA接收模式:
   ```c
    hspi1.Instance->CR2 |= SPI_CR2_RXDMAEN;
   ```

5. 等待DMA传输完成:
   ```c
   HAL_DMA_PollForTransfer(&hdma_spi_rx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
   ```

6. 关闭SPI DMA接收模式:
   ```c
   hspi1.Instance->CR2 &= ~SPI_CR2_RXDMAEN;
   ```

通过使用DMA接收SPI数据,可以显著减少等待时间,从而实现在更短的时间内接收到数据。

另外,为了进一步优化SPI数据传输的速度,还可以考虑使用FIFO以及合适的DMA传输模式。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分