打印
[技术问答]

PDMA 启动通道0与1发生冲突?

[复制链接]
1525|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2024-3-2 12:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AB, pd, DMA, DM
使用 M031FC1AE 晶片
通道0使用 SPI输出(无输入控制)
通道1使用 ADC输入

按照官方 PDMA_ADC_1882ksps_ContinuousScanMode 范例修改成双通道模式PDMA

每次运行跑5~10秒后,其中1个通到会自动停止运行?
我把 ABTIF 中断判断程式删除后,可正常运行为什么?

是否有完整的双通道运行的范例可参考?

-----------------------------------------------------------------------------------
void PDMA_IRQHandler(void)
   {
    int32_t Intstatus;
    Intstatus = PDMA_GET_INT_STATUS(PDMA);

   if(Intstatus & PDMA_INTSTS_ABTIF_Msk)    /* 检查通道ABTIF是否有错误 */
      {
       if (PDMA_GET_ABORT_STS(PDMA) & PDMA_ABTSTS_ABTIF0_Msk)
          {
          /* 停用 SPI 主控 DMA 功能 Disable SPI master DMA function */
           SPI_DISABLE_TX_PDMA(SPI0);                     
           SPI_PDMA_Done = 0;
           PDMA_CLR_ABORT_FLAG(PDMA, PDMA_ABTSTS_ABTIF0_Msk);       // 清除ABTIF0   
          }
       else if (PDMA_GET_ABORT_STS(PDMA) & PDMA_ABTSTS_ABTIF1_Msk)
               {
                ADC_STOP_CONV(ADC);   
               
                ADC_DISABLE_PDMA(ADC);
                ADC_PDMA_Done=0;                                    
                PDMA_CLR_ABORT_FLAG(PDMA, PDMA_ABTSTS_ABTIF1_Msk);  // 清除ABTIF1
               }
      }

// 判断是否有中断  
    else if (Intstatus & PDMA_INTSTS_TDIF_Msk)  
            {
//-SPI中断----------------------------------------------------------
             if (PDMA_GET_TD_STS(PDMA) & PDMA_TDSTS_TDIF0_Msk)  // 通道"0"
                {
                 PDMA_CLR_TD_FLAGx(PDMA, PDMA_TDSTS_TDIF0_Msk); // 清除TDIF0               
                 SPI_DISABLE_TX_PDMA(SPI0);                    
                 SPI_PDMA_Done = 0;  // SPI传送完成
                }
//-ADC中断------------------------------------------------------------------------------
             else if (PDMA_GET_TD_STS(PDMA) & PDMA_TDSTS_TDIF1_Msk)  // 通道"1"
                     {
                      PDMA_CLR_TD_FLAGx(PDMA, PDMA_TDSTS_TDIF1_Msk); // 清除TDIF1
                      ADC_STOP_CONV(ADC);
                  
                      ADC_DISABLE_PDMA(ADC);
                      ADC_PDMA_Done=0;         // ADC_PDMA读取完成
                     }
            }
      }


使用特权

评论回复
沙发
ClarkLLOTP| | 2024-3-5 15:28 | 只看该作者
中断处理有问题吗

使用特权

评论回复
板凳
光辉梦境| | 2024-3-21 09:50 | 只看该作者
PDMA是一种用于外设和内存之间数据传输的机制。当你提到PDMA启动通道0与1发生冲突时可能是数据冲突了吧

使用特权

评论回复
地板
暖了夏天蓝了海| | 2024-3-21 12:00 | 只看该作者
PDMA通道0和1可能共享某些硬件资源,比如总线、寄存器等。如果同时启动通道0和1的数据传输,可能会导致资源冲突,从而影响数据传输的正常进行。

使用特权

评论回复
5
冰春彩落下| | 2024-3-21 14:00 | 只看该作者
一般来说,PDMA通道0和1的寄存器设置可能存在冲突,比如配置寄存器、状态寄存器等。如果两个通道的寄存器设置冲突,可能会导致数据传输的异常行为。

使用特权

评论回复
6
一秒落纱| | 2024-3-21 16:00 | 只看该作者
在软件层面,可能存在对PDMA通道0和1同时进行启动或配置的情况,从而导致冲突。这可能是由于软件编程错误或者配置不当引起的。

使用特权

评论回复
7
淡漠安然| | 2024-3-21 18:00 | 只看该作者
查阅芯片手册或者相关资料,确认PDMA通道0和1是否共享某些硬件资源,如果是的话,需要合理规划数据传输的时序,避免资源冲突。

使用特权

评论回复
8
别乱了阵脚| | 2024-3-21 20:00 | 只看该作者
在软件层面,可以通过合理的软件控制逻辑,避免同时启动通道0和1的数据传输,从而避免冲突

使用特权

评论回复
9
夜阑风雨| | 2024-3-22 02:00 | 只看该作者
一般就是按照官方的开发板,提供的demo去运行,看看是否正常

使用特权

评论回复
10
远山寻你| | 2024-3-22 05:00 | 只看该作者
正常应该不会冲突的吧,可能互不干扰呢

使用特权

评论回复
11
三生万物| | 2024-3-22 09:00 | 只看该作者
我觉得可以直接针对资源冲突方面进行查看

使用特权

评论回复
12
jasontu| | 2024-3-22 09:24 | 只看该作者
原因是BUS ERROR时,是2个PMDA在抢BUS, 可以调整PDMA的优先权。

使用特权

评论回复
13
江河千里| | 2024-3-22 11:00 | 只看该作者
是不是你初始化就配置错了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1327

主题

3832

帖子

0

粉丝