[技术问答] PDMA 启动通道0与1发生冲突?

[复制链接]
1998|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的数据传输,可能会导致资源冲突,从而影响数据传输的正常进行。
冰春彩落下 发表于 2024-3-21 14:00 | 显示全部楼层
一般来说,PDMA通道0和1的寄存器设置可能存在冲突,比如配置寄存器、状态寄存器等。如果两个通道的寄存器设置冲突,可能会导致数据传输的异常行为。
一秒落纱 发表于 2024-3-21 16:00 | 显示全部楼层
在软件层面,可能存在对PDMA通道0和1同时进行启动或配置的情况,从而导致冲突。这可能是由于软件编程错误或者配置不当引起的。
淡漠安然 发表于 2024-3-21 18:00 | 显示全部楼层
查阅芯片手册或者相关资料,确认PDMA通道0和1是否共享某些硬件资源,如果是的话,需要合理规划数据传输的时序,避免资源冲突。
别乱了阵脚 发表于 2024-3-21 20:00 | 显示全部楼层
在软件层面,可以通过合理的软件控制逻辑,避免同时启动通道0和1的数据传输,从而避免冲突
夜阑风雨 发表于 2024-3-22 02:00 | 显示全部楼层
一般就是按照官方的开发板,提供的demo去运行,看看是否正常
远山寻你 发表于 2024-3-22 05:00 | 显示全部楼层
正常应该不会冲突的吧,可能互不干扰呢
三生万物 发表于 2024-3-22 09:00 | 显示全部楼层
我觉得可以直接针对资源冲突方面进行查看
jasontu 发表于 2024-3-22 09:24 | 显示全部楼层
原因是BUS ERROR时,是2个PMDA在抢BUS, 可以调整PDMA的优先权。
江河千里 发表于 2024-3-22 11:00 | 显示全部楼层
是不是你初始化就配置错了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1466

主题

4964

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部