查看: 6057|回复: 14

[其他] 触发ADC通道切换疑问

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

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
    发表于 2017-10-17 16:47:57 | 显示全部楼层 |阅读模式
    本帖最后由 萱蘇2015 于 2017-10-19 09:20 编辑

    1.我用DMA搬数组CHSwitch进而软件触发ADC0_A通道。
    DMA的源地址:

    volatile uint32 CHSwitch[] =
    {
        ADC_SC1_ADCH(6),   
        ADC_SC1_ADCH(7)
    };

    DMA的目标地址:

    &(ADC0_SC1A)

    但是在线调试发现:当SC1A寄存器有值时,但是ADC结构寄存器没有值。
    没有触发ADC,为什么呢?
    搜狗截图_2017-10-17_16-33-12.png
    发现ADACT寄存器一直是1,没有转换完成?很是奇怪
    搜狗截图_2017-10-18_10-20-54.png
    2.我如果手动触发就可以,按道理触发原理一样,都是软件触发
    ADC0_SC1A = ADC_SC1_ADCH(6);   
    ADC0_SC1A = ADC_SC1_ADCH(7);

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

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24879
    最后登录
    2025-7-20
    发表于 2017-10-18 10:33:45 | 显示全部楼层
    请楼主同时告知使用芯片,这样我们好帮你查看。
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
     楼主| 发表于 2017-10-18 10:35:04 | 显示全部楼层
    小恩GG 发表于 2017-10-18 10:33
    请楼主同时告知使用芯片,这样我们好帮你查看。

    哦哦  不好意思啊
    是Freescale MK10FN1M0xxx12
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24879
    最后登录
    2025-7-20
    发表于 2017-10-18 10:46:27 | 显示全部楼层
    楼主你好!
    我觉得还是你配置有问题,建议你先参考下我们的官方K64 ADC例程。
    下载代码:
    http://mcuxpresso.nxp.com/
    下载K64的SDK代码,参考SDK_2.2_FRDM-K64F\boards\frdmk64f\driver_examples\adc16\polling
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
     楼主| 发表于 2017-10-18 10:50:31 | 显示全部楼层
    小恩GG 发表于 2017-10-18 10:46
    楼主你好!
    我觉得还是你配置有问题,建议你先参考下我们的官方K64 ADC例程。
    下载代码:

    好吧  谢谢
    我就是奇怪:我如果手动触发就可以,用DMA只是赋值而已。
    按道理触发原理一样,都是软件触发
    ADC0_SC1A = ADC_SC1_ADCH(6);   
    ADC0_SC1A = ADC_SC1_ADCH(7);
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
     楼主| 发表于 2017-10-19 09:20:00 | 显示全部楼层
    小恩GG 发表于 2017-10-18 10:46
    楼主你好!
    我觉得还是你配置有问题,建议你先参考下我们的官方K64 ADC例程。
    下载代码:

    您好,我对比例程发现我的配置也没有错误的地方好像。我在线调试发现如果我在DMA中断将DMA通道使能关掉,那么ADC就可以转换完成,ADACT寄存器也变成0了。我感觉PIT触发DMA以后,DMA在一直触发ADC,进而使ADC没有来得及进行转换就又被触发了,所以一直ADACT=1;附上我的程序帮看一下吧?
    /***********初始化***************/
    volatile uint32 CHSwitch[] =
    {
        ADC_SC1_ADCH(6),   
        ADC_SC1_ADCH(7)
    };


    DMA1ADC0Init(DMA_CH21, (void *)(&(ADC0_R(0))), (void *)BUFF0_U, DMA_BYTE2);     //ADC结果的搬运
    enable_irq(5);      

    ADC0SoftwareInit();

    PIT0DMA0Init(DMA_CH0, (void *)CHSwitch ,(void *)(&(ADC0_SC1A)), DMA_BYTE4);     //配合PIT触发ADC
    pit_init(PIT0, (60*1000000));  //nU秒
    DMA_EN(DMA_CH0);

    /***********ADC配置***************/   
      void ADC0SoftwareInit(void)
    {

      SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;                       

      ADC0_CFG1 = ADC_CFG1_ADIV(0x03) |
                  ADC_CFG1_MODE(0x03) |
                  ADC_CFG1_ADICLK(0x00);
      ADC0_CFG2 &= (uint32_t)~0xFFFFFFEFUL;

      ADC0_SC2  = ( //ADC_SC2_ADTRG_MASK |
                    ADC_SC2_DMAEN_MASK |
                    ADC_SC2_REFSEL(0x00));

      ADC0_CV1 = (uint32_t)0x00UL;                  
      ADC0_CV2 = (uint32_t)0x00UL;                                 
      ADC0_SC3 = (uint32_t)0x00UL;                  

    }
    /***********PIT配置***************/   
      void pit_init(PITn_e pitn, uint32 cnt)
    {
        SIM_SCGC6       |= SIM_SCGC6_PIT_MASK;          //使能PIT时钟

        PIT_MCR         = (0
                           //| PIT_MCR_MDIS_MASK       //禁用PIT定时器时钟选择(0表示使能PIT,1表示禁止PIT)
                           //| PIT_MCR_FRZ_MASK        //调试模式下停止运行(0表示继续运行,1表示停止运行)
                          );

        PIT_LDVAL(pitn)  = cnt - 1 ;                    //设置溢出中断时间

        PIT_Flag_Clear(pitn);                           //清中断标志位

        PIT_TCTRL(pitn) &= ~ PIT_TCTRL_TEN_MASK;        //禁止PITn定时器(用于清空计数值)

        PIT_TCTRL(pitn)  = ( 0
                             | PIT_TCTRL_TEN_MASK        //使能 PITn定时器
                             //| PIT_TCTRL_TIE_MASK        //开PITn中断
                           );
    }                     
      /***********DMA0配置***************/  

    void PIT0DMA0Init(DMA_CHn CHn, void *SADDR, void *DADDR,  DMA_BYTEn byten)
    {
        uint8 BYTEs = (byten == DMA_BYTE1 ? 1 : (byten == DMA_BYTE2 ? 2 : (byten == DMA_BYTE4 ? 4 : 16 ) ) ); //计算每次传输字节数


        SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;                                    
        SIM_SCGC6 |= SIM_SCGC6_DMAMUX0_MASK;                     

        /* 配置 DMA 通道 的 传输控制块 TCD */
        DMA_SADDR(CHn) =    (uint32)SADDR;                  
        DMA_DADDR(CHn) =    (uint32)DADDR;                    
        DMA_SOFF(CHn)  =    BYTEs;       // 字节
        DMA_DOFF(CHn)  =    0;         

        DMA_ATTR(CHn)  =    (0
                             | DMA_ATTR_SMOD(0x0)            
                             | DMA_ATTR_SSIZE(byten)         
                             | DMA_ATTR_DMOD(0x0)              
                             | DMA_ATTR_DSIZE(byten)        
                            );

        DMA_CITER_ELINKNO(CHn)  = DMA_CITER_ELINKNO_CITER(2);   
        DMA_BITER_ELINKNO(CHn)  = DMA_BITER_ELINKNO_BITER(2);  


        DMA_CR &= ~DMA_CR_EMLM_MASK;                                // CR[EMLM] = 0

        //当CR[EMLM] = 0 时:
        DMA_NBYTES_MLNO(CHn) =   DMA_NBYTES_MLNO_NBYTES((BYTEs));

        /* 配置 DMA 传输结束后的操作 */
        DMA_SLAST(CHn)      =   -(BYTEs*2);               
        DMA_DLAST_SGA(CHn)  =   0;                           
        DMA_CSR(CHn)        =   (0
                                 | DMA_CSR_BWC(3)            
                               //  | DMA_CSR_DREQ_MASK            //主循环结束后停止硬件请求
    //                             | DMA_CSR_INTHALF_MASK
                                 | DMA_CSR_INTMAJOR_MASK        //主循环结束后产生中断
                                );

        /* 配置 DMA 触发源 P455 */
        DMAMUX_CHCFG_REG(DMAMUX0_BASE_PTR,CHn) = (0   
                | DMAMUX_CHCFG_ENBL_MASK      
                | DMAMUX_CHCFG_TRIG_MASK       //PIT 周期性触发DMA  
                | DMAMUX_CHCFG_SOURCE(54)                 /* Always enabled   */
                                         );


        DMA_DIS(CHn);                                    
        DMA_IRQ_CLEAN(CHn);                  //清除中断标志位

    }


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

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24879
    最后登录
    2025-7-20
    发表于 2017-10-19 10:12:30 | 显示全部楼层
    你好!
    ADC的转换时间是有规定的,如果一直触发会有问题。你把触发时间改大些,或者只做一次触发试试。
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
     楼主| 发表于 2017-10-19 10:48:53 | 显示全部楼层
    本帖最后由 萱蘇2015 于 2017-10-19 13:08 编辑
    小恩GG 发表于 2017-10-19 10:12
    你好!
    ADC的转换时间是有规定的,如果一直触发会有问题。你把触发时间改大些,或者只做一次触发试试。 ...

    您好,我测试发现还是不行的。
    1)发现PIT只要触发一次DMA,DMA就一直运行,根本停不下来了。为什么呢?
    如果有时间帮我看一下6楼的模块配置吧,是不是有问题呢?

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

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    130

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    401
    最后登录
    2020-11-3
     楼主| 发表于 2017-10-19 10:48:35 | 显示全部楼层
    本帖最后由 萱蘇2015 于 2017-10-19 11:12 编辑
    小恩GG 发表于 2017-10-19 10:12
    你好!
    ADC的转换时间是有规定的,如果一直触发会有问题。你把触发时间改大些,或者只做一次触发试试。 ...

    不好意思  刚才网页出问题了   所以就多发了一次
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24879
    最后登录
    2025-7-20
    发表于 2017-10-20 13:49:09 | 显示全部楼层
    萱蘇2015 发表于 2017-10-19 10:48
    您好,我测试发现还是不行的。
    1)发现PIT只要触发一次DMA,DMA就一直运行,根本停不下来了。为什么呢?
    ...

    楼主你好!
    如果用PIT触发DMA一次,然后你把PIT关闭,有没有把TIF标志也清掉呢?你把PIT的TIF也清掉试试,看看是DMA是否还运行。另外,DMA 的前4个通道支持周期触发,如果周期停掉,标志清掉,应该不会再触发了。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

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

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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