STM32
直播中

王磊

8年用户 1637经验值
私信 关注
[问答]

请问STM32G070的SPI DMA配置传输数据总数为奇数的功能怎么实现?

有人用过这个功能吗?按照示例修改配置,结果通信不对
spi配置

hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  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_DISABLE;
  if (HAL_SPI_Init( hspi1) != HAL_OK)
  {
    Error_Handler();
  }

DMA配置

hdma_spi1_tx.Instance = DMA1_Channel1;
    hdma_spi1_tx.Init.Request = DMA_REQUEST_SPI1_TX;
    hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_
HALFWORD;
    hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;//DMA_MDATAALIGN_BYTE;//
    hdma_spi1_tx.Init.Mode = DMA_NORMAL;
    hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
    if (HAL_DMA_Init( hdma_spi1_tx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(hspi,hdmatx,hdma_spi1_tx);

    /* SPI1_RX Init */
    hdma_spi1_rx.Instance = DMA1_Channel2;
    hdma_spi1_rx.Init.Request = DMA_REQUEST_SPI1_RX;
    hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_
HALFWORD;
    hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;//DMA_MDATAALIGN_BYTE;//
    hdma_spi1_rx.Init.Mode = DMA_NORMAL;
    hdma_spi1_rx.Init.Priority = DMA_PRIORITY_HIGH;
    if (HAL_DMA_Init( hdma_spi1_rx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(hspi,hdmarx,hdma_spi1_rx);

主函数调用:

if (HAL_SPI_TransmitReceive_DMA( hspi1, (uint8_t *)spimater_send_array, (uint8_t *)spimater_receive_array, 11) != HAL_OK)
            {
                /* Transfer error in transmission process */
                Error_Handler();
            }


回帖(1)

张亮

2024-4-2 16:56:25
对于STM32G070的SPI DMA配置传输数据总数为奇数的功能,可以通过以下步骤来实现:

1. 配置SPI:
   将SPI模式设置为主模式:
   ```c
   hspi1.Init.Mode = SPI_MODE_MASTER;
   ```
   将数据传输方向设置为双线全双工:
   ```c
   hspi1.Init.Direction = SPI_DIRECTION_2LINES;
   ```
   数据大小设置为8位:
   ```c
   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
   ```
   将时钟极性设置为低电平有效:
   ```c
   hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
   ```
   将时钟相位设置为第一个边沿:
   ```c
   hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
   ```
   使用软件NSS信号:
   ```c
   hspi1.Init.NSS = SPI_NSS_SOFT;
   ```
   设置波特率预分频系数为256:
   ```c
   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
   ```

2. 配置DMA:
   使用DMA进行SPI数据传输时,可以选择使用循环模式和非循环模式。对于数据总数为奇数的情况,可以选择使用非循环模式,来使得最后一个数据仅被传输一次。这可以通过设置`DMA_CIRCULAR`宏定义为0来实现。

3. 设置数据传输总数:
   设置SPI DMA数据传输总数为奇数,需要针对DMA的传输长度进行特殊处理。

   ```c
   /* 传输总数为奇数时,将传输长度减1,并设置传输方向为从外设读取 */
   hspi1.hdmatx->Init.Direction = DMA_MEMORY_TO_PERIPH;
   hspi1.hdmatx->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
   hspi1.hdmatx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
   hspi1.hdmatx->Init.Mode = DMA_NORMAL;
   hspi1.hdmatx->Init.Priority = DMA_PRIORITY_HIGH;
   hspi1.hdmatx->Instance->CNDTR = (uint16_t)(dataSize - 1);
   ```

其中,`dataSize`为要传输的数据总数。

以上是一种实现方法,但具体实现需要根据你的应用需求进行适当调整。希望对你有帮助!
举报

更多回帖

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