跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1M系列
  4. CAN的DMA 是否会在 SPI DMA运行时有概率出现无法进入DMA中断现象,无法进入CAN DMA接收完成中断

CAN的DMA 是否会在 SPI DMA运行时有概率出现无法进入DMA中断现象,无法进入CAN DMA接收完成中断

已定时 已固定 已锁定 已移动 已解决 YTM32B1M系列
7 帖子 2 发布者 1.6k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 曹文勋曹 离线
    曹文勋曹 离线
    曹文勋
    写于 最后由 编辑
    #1

    4512be64-a76b-4e22-a762-8ade34f82762-image.png
    b78b3339-0ffa-449c-939f-3eaebe13d338-image.png
    ced32c4a-b405-45e3-9334-26297dc638f0-image.png
    02c65d28-eb9f-4251-8a01-df38db7a498f-image.png
    08ad434e-8e3d-4633-9756-a539d2713443-image.png

    1 条回复 最后回复
    0
    • runR 离线
      runR 离线
      run YunTu
      写于 最后由 编辑
      #3

      可以修改一下下面这个函数试试
      platform\drivers\src\dma\dma_hw_access.c:

      void DMA_SetDmaRequestCmd(DMA_Type *base, uint8_t channel, bool enable)
      {
          /* Halt DMA before changing the REQEN register */
          SDK_ENTER_CRITICAL();
          base->CTRL |= 1 << 17u;
          int32_t timeout = 50;
          /* Wait DMA active done */
          while ((base->CTRL & DMA_CTRL_ACTIVE_MASK) != 0)
          {
              timeout--;
              if (timeout <= 0)
              {
                  break;
              }
          }
          if (enable)
          {
              base->REQEN |= (0x01UL << channel);
          } else
          {
              base->REQEN &= ~(0x01UL << channel);
          }
          /* Resume DMA */
          base->CTRL &= ~(1 << 17u);
          SDK_EXIT_CRITICAL();
      }
      
      1 条回复 最后回复
      0
      • 曹文勋曹 离线
        曹文勋曹 离线
        曹文勋
        写于 最后由 编辑
        #2

        在spi 的 dma传输前后需要关闭全局中断 这个现象才会消失,这个是必须的嘛,SDK 的demo中没有需要关闭全局中断

        1 条回复 最后回复
        0
        • runR 离线
          runR 离线
          run YunTu
          写于 最后由 编辑
          #3

          可以修改一下下面这个函数试试
          platform\drivers\src\dma\dma_hw_access.c:

          void DMA_SetDmaRequestCmd(DMA_Type *base, uint8_t channel, bool enable)
          {
              /* Halt DMA before changing the REQEN register */
              SDK_ENTER_CRITICAL();
              base->CTRL |= 1 << 17u;
              int32_t timeout = 50;
              /* Wait DMA active done */
              while ((base->CTRL & DMA_CTRL_ACTIVE_MASK) != 0)
              {
                  timeout--;
                  if (timeout <= 0)
                  {
                      break;
                  }
              }
              if (enable)
              {
                  base->REQEN |= (0x01UL << channel);
              } else
              {
                  base->REQEN &= ~(0x01UL << channel);
              }
              /* Resume DMA */
              base->CTRL &= ~(1 << 17u);
              SDK_EXIT_CRITICAL();
          }
          
          1 条回复 最后回复
          0
          • 曹文勋曹 离线
            曹文勋曹 离线
            曹文勋
            写于 最后由 编辑
            #4

            好的,这个改动是关于什么的呢,可以麻烦解释一下吗

            1 条回复 最后回复
            0
            • 曹文勋曹 离线
              曹文勋曹 离线
              曹文勋
              写于 最后由 编辑
              #5

              我看你也是做了临界区的判断,这个是新的patch嘛,
              请教一下下面的操作是做什么用处?
              while ((base->CTRL & DMA_CTRL_ACTIVE_MASK) != 0)
              {
              timeout--;
              if (timeout <= 0)
              {
              break;
              }
              }

              runR 1 条回复 最后回复
              0
              • runR 离线
                runR 离线
                run YunTu
                在 回复了 曹文勋 最后由 编辑
                #6

                曹文勋 在 CAN的DMA 是否会在 SPI DMA运行时有概率出现无法进入DMA中断现象,无法进入CAN DMA接收完成中断 中说:

                我看你也是做了临界区的判断,这个是新的patch嘛,
                请教一下下面的操作是做什么用处?
                while ((base->CTRL & DMA_CTRL_ACTIVE_MASK) != 0)
                {
                timeout--;
                if (timeout <= 0)
                {
                break;
                }
                }

                看描述的现象确实像临界区设置被重入出的问题。

                这个修改主要是DMA REQEN 可以硬件清除,所以读 / 更改 / 写操作可能会导致错误地再次启用DMA通道。
                如果是CAN的接收的话,可能会再次启动接收。
                SDK 1_3_1 HOTFIX 版本中有做修复。

                如果不是这里的问题,可以再看看是不是其他地方临界区被重入了。

                曹文勋曹 1 条回复 最后回复
                0
                • 曹文勋曹 离线
                  曹文勋曹 离线
                  曹文勋
                  在 回复了 run 最后由 编辑
                  #7

                  run 在 CAN的DMA 是否会在 SPI DMA运行时有概率出现无法进入DMA中断现象,无法进入CAN DMA接收完成中断 中说:

                  曹文勋 在 CAN的DMA 是否会在 SPI DMA运行时有概率出现无法进入DMA中断现象,无法进入CAN DMA接收完成中断 中说:

                  我看你也是做了临界区的判断,这个是新的patch嘛,
                  请教一下下面的操作是做什么用处?
                  while ((base->CTRL & DMA_CTRL_ACTIVE_MASK) != 0)
                  {
                  timeout--;
                  if (timeout <= 0)
                  {
                  break;
                  }
                  }

                  看描述的现象确实像临界区设置被重入出的问题。

                  这个修改主要是DMA REQEN 可以硬件清除,所以读 / 更改 / 写操作可能会导致错误地再次启用DMA通道。
                  如果是CAN的接收的话,可能会再次启动接收。
                  SDK 1_3_1 HOTFIX 版本中有做修复。

                  如果不是这里的问题,可以再看看是不是其他地方临界区被重入了。

                  收到,感谢

                  1 条回复 最后回复
                  0
                  • ,FrankieF Frankie 将这个主题转为问答主题
                  • ,FrankieF Frankie 将这个主题标记为已解决

                • 云途开发生态介绍

                  快速上手云途开发生态

                • 云途论坛规则/Yuntu Forum Rules

                  发帖前请查看

                • YT CONFIG TOOL调查问卷

                  帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                • can
                  25
                  demo
                  22
                  lin stack
                  13
                  uds
                  13
                  md14
                  6
                  yt-link
                  6
                  fbl
                  5
                  adc模块
                  4
                  Online Users
                  • 登录

                  • 登录或注册以进行搜索。
                  • 第一个帖子
                    最后一个帖子
                  0
                  • 版块
                  • 最新
                  • 标签
                  • 热门