查看: 12402|回复: 25

[其他] PDB0触发ADC0 ADC2 ADC3同时采样,利用DMA1的其中6个通道搬运

[复制链接]
  • TA的每日心情
    开心
    2017-9-7 09:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
    发表于 2017-9-13 17:02:24 | 显示全部楼层 |阅读模式
                  芯片:K10     模块:PDB0    ADCO    ADC2   ADC3     DMA1
    功能描述:PDB0的0 2  3通道同时触发ADC0  ADC2   ADC3同时采样,利用DMA1的其中6个通道进行分别搬运ADC0_A  ADC0_B   ADC2_A  ADC2_B  ADC3_A  ADC3_B结果寄存器数据。

    PDB设置如下:【设置每个通道预触发时间一样,想进行ADC0  ADC2   ADC3三个通道同时采样】
        /*****************CH0预触发初始化************/
        PDB0_CH0C1 = PDB_C1_EN(0x03)      
                   | PDB_C1_TOS(0x03);                                    

        PDB0_CH0DLY0 = (60*15);                                       
        PDB0_CH0DLY1 = (60*25);                                             
        /******************CH2预触发初始化***********/
        PDB0_CH2C1 = PDB_C1_EN(0x03)         
                   | PDB_C1_TOS(0x03);                                    

        PDB0_CH2DLY0 = (60*15);                                         
        PDB0_CH2DLY1 = (60*25);                                          
        /******************CH3预触发初始化**********/
        PDB0_CH3C1 = PDB_C1_EN(0x03)         
                   | PDB_C1_TOS(0x03);                                    

        PDB0_CH3DLY0 = (60*15);                                         
        PDB0_CH3DLY1 = (60*25);   
    目前PDB 与ADC ,ADC与DMA都是没有问题的。但是都结合在一起时,在线调试发现会触发PDB Channel Sequence Error Flags          PDB.png
    问题1)我的理解是否正确:PDB的0  2  3通道预触发A 同时分别触发ADC0   ADC2   ADC3的A通道, 进而同时触发DMA的三个通道,导致DMA三个通道               无法确定应该先处理那个通道的数据,导致ADC结果寄存器数据不能被搬运,进而导致PDB预触发B延时时间到时便触发了PDB Channel Sequence             Error Flags。【参考了K10的例程】
    2)顺着这样的思路进行DMA优先级的配置,例如:
          DMA_DCHPRI16 = (uint8_t)((DMA_DCHPRI16 & (uint8_t)~(uint8_t)(                  DMA_DCHPRI16_DPA_MASK
                     )) | (uint8_t)(
                      DMA_DCHPRI16_ECP_MASK |
                      DMA_DCHPRI16_CHPRI(0x0)
                     ));
           DMA_DCHPRI17 = (uint8_t)((DMA_DCHPRI17 & (uint8_t)~(uint8_t)(
                      DMA_DCHPRI17_DPA_MASK
                     )) | (uint8_t)(
                      DMA_DCHPRI17_ECP_MASK |
                      DMA_DCHPRI17_CHPRI(0x1)
                     ));
          DMA_DCHPRI18 = (uint8_t)((DMA_DCHPRI18 & (uint8_t)~(uint8_t)(
                      DMA_DCHPRI18_DPA_MASK
                     )) | (uint8_t)(
                      DMA_DCHPRI18_ECP_MASK |
                      DMA_DCHPRI18_CHPRI(0x2)
                     ));
    但是还是没有解决问题,如果不是我认为的这样,应该是啥原因呢???


    我知道答案 目前已有25人回答
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24879
    最后登录
    2025-7-20
    发表于 2017-9-14 15:04:48 | 显示全部楼层
    你可以只用PDB0的两个预触发通道来触发ADC0_A 和ADC0_B转换,跟DMA结合试试,确保预触发之间的间隔尽量大一些,保证间隔时间能完成ADC采样过程,一组成功后,再慢慢增加功能
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-9-7 09:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
     楼主| 发表于 2017-9-14 16:55:15 | 显示全部楼层
    小恩GG 发表于 2017-9-14 15:04
    你可以只用PDB0的两个预触发通道来触发ADC0_A 和ADC0_B转换,跟DMA结合试试,确保预触发之间的间隔尽量大一 ...

    我只修改了DMA1的通道号,就可以采样了,如下图:
    不可以采样:  ADC  DMA通道对应关系       【16就是DMA1的0通道】
    FAN.png
    可以采样:  ADC  DMA通道对应关系
    ZHENG.png
    虽然可以采样了,但是还是有个问题不解:
    1)如上【不可以采样】图,我把PDB预触发间隔  调试特别大也还是会触发PDB Channel Sequence Erro
         我还是怀疑DMA通道优先级的问题,并且手册提到有默认优先级【因为我没有对优先级进行任何寄存器配置】,如下图:
          优先级.png
        并且默认通道号越小 优先级越低。您觉得呢???

    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-9-7 09:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
     楼主| 发表于 2017-9-14 17:08:41 | 显示全部楼层
    我采用的是PIT周期性触发PDB触发ADC进而触发DMA
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24879
    最后登录
    2025-7-20
    发表于 2017-9-14 18:09:41 | 显示全部楼层
    萱蘇2015 发表于 2017-9-14 17:08
    我采用的是PIT周期性触发PDB触发ADC进而触发DMA

    我还有个怀疑,PDB0第二次循环的时候,第一个预触发通道触发ADC产生的DMA request,但是上一个循环的第二个预触发触发ADC产生的DMA request还处于pending状态,所以导致报错呢?!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-9-7 09:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
     楼主| 发表于 2017-9-15 08:30:18 | 显示全部楼层
    小恩GG 发表于 2017-9-14 18:09
    我还有个怀疑,PDB0第二次循环的时候,第一个预触发通道触发ADC产生的DMA request,但是上一个循环的第二 ...

    确实也有这种可能,但是我的应该不是这种原因吧?
    1)就上面提到的,我只修改了通道号就可以采样了,并没有对时间进行处理。
    2)我测试发现2个通道预触发延时时间间隔 >=5us即可。
        PDB0_CH3DLY0 = (60*15);    //15us                                    
        PDB0_CH3DLY1 = (60*20);   //20us
        /*
         * 设置PDB计数器溢出值   
         */
        PDB0_MOD  = (60*50);        //50us
        我这样设置,就应该不存在您说的现象吧?
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24879
    最后登录
    2025-7-20
    发表于 2017-9-15 09:31:30 | 显示全部楼层
    萱蘇2015 发表于 2017-9-15 08:30
    确实也有这种可能,但是我的应该不是这种原因吧?
    1)就上面提到的,我只修改了通道号就可以采样了,并没 ...

    那应该不会啊,增加的预触发通道间的相隔时间的测试,你有做了吗?结果如何?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-9-7 09:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
     楼主| 发表于 2017-9-15 09:52:48 | 显示全部楼层
    小恩GG 发表于 2017-9-15 09:31
    那应该不会啊,增加的预触发通道间的相隔时间的测试,你有做了吗?结果如何?
    ...

    1)测试了,如果通道号不修改还是无法采集
        PDB0_CH3DLY0 = (60*15);                                         
        PDB0_CH3DLY1 = (60*500);   
       
        PDB0_CH2DLY0 = (60*15);                                         
        PDB0_CH2DLY1 = (60*500);

        PDB0_CH0DLY0 = (60*15);                                       
        PDB0_CH0DLY1 = (60*500);  
        /*
         * 设置PDB计数器溢出值   
         */
        PDB0_MOD  = (60*1000);
    2)当然只有PDBO的其中一个通道触发一个ADC通道是不存在问题的。我目前是一个PIT周期性触发PDB的三个通道同时出发ADC0     ADC2   ADC3就存在问题
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-9-7 09:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
     楼主| 发表于 2017-9-15 11:44:21 | 显示全部楼层
    小恩GG 发表于 2017-9-15 09:31
    那应该不会啊,增加的预触发通道间的相隔时间的测试,你有做了吗?结果如何?
    ...

    我测试发现这很奇怪的问题:如下图仅仅修改通道顺序,其他的没有修改。

    对比.jpg


    您觉得是哪里原因呢?
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24879
    最后登录
    2025-7-20
    发表于 2017-9-15 18:12:47 | 显示全部楼层
    萱蘇2015 发表于 2017-9-15 11:44
    我测试发现这很奇怪的问题:如下图仅仅修改通道顺序,其他的没有修改。

    暂时不好判断,你可以创建一个简单的demo,可以复现你的问题的,然后通过以下链接创建一个技术申请,会有工程师来处理的。
    http://www.nxp.com/cn/support/sa ... =sbmenu&lang=cn
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 16:17 , Processed in 0.117830 second(s), 33 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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