硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2539|回复: 8
收起左侧

[技术讨论] STM32G0的SPI DMA配置传输数据总数为奇数

[复制链接]

56

主题

131

回帖

299

积分

高级会员

积分
299
发表于 2021-8-2 09:27:13 | 显示全部楼层 |阅读模式
有人用过这个功能吗?



无标题.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107023
QQ
发表于 2021-8-2 09:53:22 | 显示全部楼层
帮顶。
回复

使用道具 举报

56

主题

131

回帖

299

积分

高级会员

积分
299
 楼主| 发表于 2021-8-2 10:49:10 | 显示全部楼层
本帖最后由 lindahnu 于 2021-8-4 11:56 编辑

代码如下,通信就是不对

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)
{         
   Error_Handler();
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107023
QQ
发表于 2021-8-3 08:31:43 | 显示全部楼层
lindahnu 发表于 2021-8-2 10:49
代码如下,通信就是不对

spi配置

仅看你楼主位的描述,貌似你的配置不对。

楼主位的意思是SPI DR寄存器采用16bit访问模式时,即hdma_spi1_tx.Init.PeriphDataAlignment 的访问是16bit。

回复

使用道具 举报

56

主题

131

回帖

299

积分

高级会员

积分
299
 楼主| 发表于 2021-8-3 16:36:59 | 显示全部楼层
eric2013 发表于 2021-8-3 08:31
仅看你楼主位的描述,貌似你的配置不对。

楼主位的意思是SPI DR寄存器采用16bit访问模式时,即hdma_sp ...

改了PSIZE为16位的,一样接收不对
固定发0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA,0xAB
接收到 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA,0xAB,0xA8
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107023
QQ
发表于 2021-8-4 09:21:16 | 显示全部楼层
lindahnu 发表于 2021-8-3 16:36
改了PSIZE为16位的,一样接收不对
固定发0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, ...

DMA FIFO开了吗,这种收发不对齐,必须开DMA FIFO,不知道G0有没有这个选项。
回复

使用道具 举报

56

主题

131

回帖

299

积分

高级会员

积分
299
 楼主| 发表于 2021-8-4 13:11:27 | 显示全部楼层
eric2013 发表于 2021-8-4 09:21
DMA FIFO开了吗,这种收发不对齐,必须开DMA FIFO,不知道G0有没有这个选项。

已经找到问题了,虽然是奇数,但是DMA传输写到接收buffer时仍然是多写一个字节,所以接收buffer大小要额外多一个字节,否则就越界溢出了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107023
QQ
发表于 2021-8-5 08:22:22 | 显示全部楼层
lindahnu 发表于 2021-8-4 13:11
已经找到问题了,虽然是奇数,但是DMA传输写到接收buffer时仍然是多写一个字节,所以接收buffer大小要额 ...

谢谢告知最终原因。
回复

使用道具 举报

56

主题

131

回帖

299

积分

高级会员

积分
299
 楼主| 发表于 2021-8-6 09:17:14 | 显示全部楼层
观察了MISO上的波形是正确的,正好是11个数据,最终原因是因为定义的接收BUFFER的sram地址不是4字节对齐,刚好是奇数,造成接收数据出错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 10:22 , Processed in 0.241401 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表