找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

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

[复制链接]
跳转到指定楼层
楼主
keyway 发表于 2024-1-29 21:45:00 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 keyway 于 2024-1-29 21:52 编辑

使用 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读取完成
                     }
            }
      }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

9#
 楼主| keyway 发表于 2024-2-22 23:27:53 | 只看该作者
本帖最后由 keyway 于 2024-2-22 23:31 编辑


PDMA_IRQHandler () 这样改是否可以?

回复 支持 反对

使用道具 举报

8#
chrishu 发表于 2024-2-21 11:35:01 | 只看该作者
keyway 发表于 2024-2-21 00:02
今天测试,ADC PDMA仍然传送5~6次后停止中断,导致ADC传送永远无法完成?
M031FC1AE 晶片是否能同时开起2个 ...

你要debug看一下,是PDMA还是ADC停了?在哪里停的?
如果如你第一次说的: 把 ABTIF 中断判断程式删除后,可正常运行
那应该是传输过程出错,中断里停止的ADC 和PDMA触发。
可以将能在开发板上复现问题的代码发给我们试一下。
回复 支持 反对

使用道具 举报

7#
 楼主| keyway 发表于 2024-2-21 00:02:58 | 只看该作者
本帖最后由 keyway 于 2024-2-21 00:29 编辑

今天测试,ADC PDMA仍然传送5~6次后停止中断,导致ADC传送永远无法完成?
M031FC1AE 晶片是否能同时开起2个通道传输?
回复 支持 反对

使用道具 举报

6#
chrishu 发表于 2024-1-31 08:54:45 | 只看该作者
keyway 发表于 2024-1-30 22:53
~发送PDMA时,CNT已经归零(速度很快)~

规格书...

通道传完后,传输模式会自动回到IDEL状态。也就是说进传完中断时,传输模式已经是IDEL了。
AHB总线错误,应该是PDMA传输出错,那么传输的数据也可能是错误的,这时可以停止传输丢掉数据。这个错误发生的概率太低,所以基本都没添加相关处理代码。
回复 支持 反对

使用道具 举报

5#
 楼主| keyway 发表于 2024-1-30 22:53:08 | 只看该作者
本帖最后由 keyway 于 2024-1-30 22:57 编辑
chrishu 发表于 2024-1-30 16:43
ABTIF中断:发生AHB总线错误。没有进ABORT中断说明没有发生AHB总线错误。
TDIF中断:通道传完中断。
你在 ...

~发送PDMA时,CNT已经归零(速度很快)~

规格书...
If software configures the operation mode to idle state, the PDMA controller will not
perform any transfer and then clear this operation request. Finishing this task will also generate an
interrupt to CPU if corresponding PDMA interrupt bit is enabled
如果软件配置操作模式为空闲状态,PDMA控制器不会执行任何传输,并清除
这个操作请求。如果相应的PDMA中断位被使能,完成这个任务后也会给CPU产生中断。


疑问1~设置PDMA传输时,是否还要判断是否为IDEL模式?(目前中断只判断PDMA传送完成,主程式再启动PDMA)
疑问2~AHB总线错误不处理是否会影响中断?(官方范例USB与SPI通讯也没处理AHB错误)
回复 支持 反对

使用道具 举报

地板
chrishu 发表于 2024-1-30 16:43:57 | 只看该作者
游客 60.248.240.x 发表于 2024-1-30 11:56
ABORT中断已经提示传送"违"完成( SPI_PDMA_Done = 0;  ADC_PDMA_Done=0;)
所以主程式可判断重传,没问题!!! ...

ABTIF中断:发生AHB总线错误。没有进ABORT中断说明没有发生AHB总线错误。
TDIF中断:通道传完中断。
你在AHB错误和传完中断里都设置传完标志=0。在主程序里怎么区分是传完还是发生了错误?
你在主函数里等不到传完标志可能的原因:
一:没有开始传输
二:已传输数据的个数< 设定的个数。
可以debug看一下PDMA的寄存器里CNT的值,就知道是没开始传输还是传输的数据不够。
也可以开启超时中断,如果已经开始传输超时了数据还未传完,就会进超时中断。如果没开始传输或者传完不会进超时中断。
回复 支持 反对

使用道具 举报

板凳
匿名  发表于 2024-1-30 11:56:35

ABORT中断已经提示传送"违"完成( SPI_PDMA_Done = 0;  ADC_PDMA_Done=0;)
所以主程式可判断重传,没问题!!!
但Debug时, SPI_PDMA_Done 及 ADC_PDMA_Done永远等于"1",代表没进入ABORT中断程序!!

回复 支持 反对

使用道具

沙发
chrishu 发表于 2024-1-30 11:33:45 | 只看该作者
本帖最后由 chrishu 于 2024-1-30 11:39 编辑

SPI_PDMA_LoopTest例程使用的双通道你在PDMA_INTSTS_ABTIF_Msk中断里关闭了外设触发PDMA,那肯定不会再传输了
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU