跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1M系列
  4. YTM32B1ME0 读取ADC FIFO数据的通道号与配置通道不一致

YTM32B1ME0 读取ADC FIFO数据的通道号与配置通道不一致

已定时 已固定 已锁定 已移动 YTM32B1M系列
10 帖子 3 发布者 257 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • FarleyHuangF 离线
    FarleyHuangF 离线
    FarleyHuang
    写于 最后由 编辑
    #1

    问题现象描述:
    1.我配置ADC的一组为: 通道 0,1,12,13;当我读取ADC->FIFO时,有缺少的还有重复的channel-ID;
    2.使用库函数读取ADC->FIFO时,存放寄存器变量的uint32 regValue的值 与寄存器视图 的值 不一致;

    260ea2b5-f576-41cc-bf73-bfe4d0496c46-image.png

    19c3b12a-ea72-4958-bca9-48a62739efbd-image.png

    下面是我ADC的工具配置信息:
    9d72f96a-fcb4-4acd-9c46-75eca83ac482-image.png

    411a28e4-f1cb-44a5-9d89-ecb820500d49-image.png

    d29bfdeb-d0ad-4dad-8c89-424c46896588-image.png

    
    /* adc_config0 */
    const adc_converter_config_t adc_config0={
        .clockDivider=0,
        .startTime=12,
        .sampleTime=2,
        .overrunMode=false,
        .autoOffEnable=false,
        .waitEnable=false,
        .trigger=ADC_TRIGGER_SOFTWARE,
        .align=ADC_ALIGN_RIGHT,
        .resolution=ADC_RESOLUTION_12BIT,
        .dmaWaterMark=0,
        .dmaEnable=false,
        .sequenceConfig={
            .sequenceMode=ADC_CONV_LOOP,
            .sequenceIntEnable=false,
            .convIntEnable=false,
            .readyIntEnable=false,
            .ovrunIntEnable=false,
            .sampIntEnable=false,
            .channels={
                ADC_INPUTCHAN_EXT0,
                ADC_INPUTCHAN_EXT1,
                ADC_INPUTCHAN_EXT12,
                ADC_INPUTCHAN_EXT13,
            },
            .totalChannels=4,
        },
        .compareConfig={
            .compareEnable=false,
            .compareAllChannelEnable=false,
    
            .compHigh=4095,
            .compLow=0,
            .compIntEnable=false,
        },
    };
    
    #define ADC_INST 0U
    
    adc_converter_config_t get_adc_config0;
    
    uint8_t set_adc_sequence_cnt = 2; 
    uint8_t get_adc_sequence_cnt = 2; 
    
    void ADC_Init(void)
    {
        ADC_DRV_ConfigConverter(ADC_INST,&adc_config0);
        ADC_DRV_Start(ADC_INST);
    
        //get adc sequence length
        set_adc_sequence_cnt = adc_config0.sequenceConfig.totalChannels;
        ADC_DRV_GetConverterConfig(ADC_INST, &get_adc_config0);
        get_adc_sequence_cnt = get_adc_config0.sequenceConfig.totalChannels;
    }
    
    void ADC_Get_Value_10ms(void)
    {
        uint32 reg_value = 0;
        for (uint8_t i = 0; i < set_adc_sequence_cnt; i++)
        {
            reg_value = ADC_DRV_ReadSeqtagAndData(ADC_INST);
            // uint8_t channel_id = reg_value>>16;
            uint8_t channel_id = (reg_value>>16)&0x1f;
            uint16_t chan_raw_data = (reg_value&0x0000ffff);
            if(channel_id == 0)//ADC0_SE0
            {
                uint16 ADC_mV_IntPackVolt = 0;
                ADC_mV_IntPackVolt = (reg_value&0x0000ffff)*3300/4096;
                //test code to view the convert result of ADC
                ADC_mV_IntPackVolt = 1100;
            }
        }
        ADC_DRV_Start(ADC_INST);
    }
    
    1 条回复 最后回复
    0
    • DigaD 离线
      DigaD 离线
      Diga
      写于 最后由 编辑
      #2

      ADC 的 FIFO 是读一个结果,出去一个结果。你用 debugger 去读寄存器,会把 ADC FIFO 里的数据取出,这时候软件再去读,读到的是另一个结果,而且调试器是会不停的刷新寄存器,也就是在一直读取ADC FIFO。
      不要用调试器去展开 ADC FIFO,除非你已经在代码中把所有数据都读出来了

      1 条回复 最后回复
      0
      • FarleyHuangF 离线
        FarleyHuangF 离线
        FarleyHuang
        写于 最后由 编辑
        #3

        Diga 请问下问题1出现的原因是什么:
        1.我配置ADC的一组为: 通道 0,1,12,13;当我读取ADC->FIFO时,读出的通道是0, 12, 9, 9;

        DigaD 1 条回复 最后回复
        0
        • DigaD 离线
          DigaD 离线
          Diga
          在 回复了 FarleyHuang 最后由 编辑
          #4

          FarlyHuang 大抵是因为你下面打开了 Memory 窗口,0x4004004C 正好是 ADC->FIFO 寄存器的地址,跟读左侧的寄存器窗口效果是一样的

          1 条回复 最后回复
          0
          • FarleyHuangF 离线
            FarleyHuangF 离线
            FarleyHuang
            写于 最后由 FarleyHuang 编辑
            #5

            Diga 我现在把memory读取ADC-> FIFO的视图关闭了,现在读取通道号仍然与配置不一样
            3fbd7a66-f8f0-4a09-bdc0-137b02b0fa5c-image.png

            下次是我调试的配置:

            /* adc_config0 */
            const adc_converter_config_t adc_config0={
                .clockDivider=0,
                .startTime=12,
                .sampleTime=2,
                .overrunMode=false,
                .autoOffEnable=false,
                .waitEnable=false,
                .trigger=ADC_TRIGGER_SOFTWARE,
                .align=ADC_ALIGN_RIGHT,
                .resolution=ADC_RESOLUTION_12BIT,
                .dmaWaterMark=0,
                .dmaEnable=false,
                .sequenceConfig={
                    .sequenceMode=ADC_CONV_LOOP,
                    .sequenceIntEnable=false,
                    .convIntEnable=false,
                    .readyIntEnable=false,
                    .ovrunIntEnable=false,
                    .sampIntEnable=false,
                    .channels={
                        ADC_INPUTCHAN_EXT0,
                        ADC_INPUTCHAN_EXT1,
                        ADC_INPUTCHAN_EXT12,
                        ADC_INPUTCHAN_EXT13,
                    },
                    .totalChannels=4,
                },
                .compareConfig={
                    .compareEnable=false,
                    .compareAllChannelEnable=false,
            
                    .compHigh=4095,
                    .compLow=0,
                    .compIntEnable=false,
                },
            };
            
            #include "adc.h"
            
            #define ADC_INST 0U
            
            adc_converter_config_t get_adc_config0;
            
            uint8_t set_adc_sequence_cnt = 2; 
            uint8_t get_adc_sequence_cnt = 2; 
            
            void ADC_Init(void)
            {
                ADC_DRV_ConfigConverter(ADC_INST,&adc_config0);
                ADC_DRV_Start(ADC_INST);
            
                //get adc sequence length
                set_adc_sequence_cnt = adc_config0.sequenceConfig.totalChannels;
                ADC_DRV_GetConverterConfig(ADC_INST, &get_adc_config0);
                get_adc_sequence_cnt = get_adc_config0.sequenceConfig.totalChannels;
            }
            
            
            uint32_t adc_FIFO_values[] = {0,0,0,0};
            uint16_t adc_channels_values[] = {0,0,0,0};
            
            void ADC_Get_Value_10ms(void)
            {
                uint32 reg_value = 0;
                for (uint8_t i = 0; i < set_adc_sequence_cnt; i++)
                {
                    reg_value = ADC_DRV_ReadSeqtagAndData(ADC_INST);
                    uint8_t channel_id = reg_value>>16;
                    // uint8_t channel_id = (reg_value>>16)&0x1f;
                    uint16_t chan_raw_data = (reg_value&0x0000ffff);
            
                    adc_FIFO_values[i] = reg_value;
                    adc_channels_values[i] = channel_id;
                    if(channel_id == 0)//ADC0_SE0
                    {
                        uint16 ADC_mV_IntPackVolt = 0;
                        ADC_mV_IntPackVolt = (reg_value&0x0000ffff)*3300/4096;
                        //test code to view the convert result of ADC
                        ADC_mV_IntPackVolt = 1100;
                    }
                }
                ADC_DRV_Start(ADC_INST);
            }
            
            DigaD 1 条回复 最后回复
            0
            • DigaD 离线
              DigaD 离线
              Diga
              在 回复了 FarleyHuang 最后由 编辑
              #6

              FarlyHuang 看起来还是有个什么东西在读取 ADC->FIFO ,你读到的第三个值 0x9094C,应该就是 FIFO 空了之后的值。也就是你软件读了两个值之后,ADC->FIFO 已经空了。
              可以再 check 一下你的调试环境,如果可以的话,尽量换别的 IDE 再试试(KEIL,IAR,OZone)

              1 条回复 最后回复
              0
              • FarleyHuangF 离线
                FarleyHuangF 离线
                FarleyHuang
                写于 最后由 编辑
                #7

                Diga 好的, 我用OZone尝试一下

                1 条回复 最后回复
                0
                • FarleyHuangF 离线
                  FarleyHuangF 离线
                  FarleyHuang
                  写于 最后由 编辑
                  #8

                  Diga 感谢指导, 使用OZone 尝试后,读取的通道ID与配置项一致了;

                  顺便请教一下,如果使用vs code debug情况下,怎么排查问题是哪里引起的乱序呢? 因为使用vs code是比较方便的

                  image.png

                  FrankieF 1 条回复 最后回复
                  0
                  • FrankieF 离线
                    FrankieF 离线
                    Frankie YunTu
                    在 回复了 FarleyHuang 最后由 编辑
                    #9

                    FarlyHuang 关于vscode debug,你可以在这个地方问题:https://github.com/Marus/cortex-debug

                    1 条回复 最后回复
                    0
                    • FarleyHuangF 离线
                      FarleyHuangF 离线
                      FarleyHuang
                      写于 最后由 编辑
                      #10

                      Frankie 好的,感谢

                      1 条回复 最后回复
                      0
                      • DigaD Diga 在 中 引用了 这个主题

                    • 云途论坛规则/Yuntu Forum Rules

                      发帖前请查看

                    • YCT离线License申请流程

                      帮助没办法联网的电脑使用YCT

                    • YT CONFIG TOOL调查问卷

                      帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                    • demo
                      11
                      can
                      8
                      lin stack
                      5
                      yt-link
                      5
                      vscode
                      3
                      adc模块
                      2
                      i2c
                      2
                      uuid
                      2
                      Online Users
                      xingliangli-thewayX
                      xingliangli-theway
                      MrYangM
                      MrYang
                      menggaolingM
                      menggaoling
                      yxydoctorY
                      yxydoctor
                      mzwM
                      mzw
                      lmsL
                      lms
                      徐一徐
                      徐一
                      sqwS
                      sqw
                      qq970555603Q
                      qq970555603
                      • 登录

                      • 登录或注册以进行搜索。
                      • 第一个帖子
                        最后一个帖子
                      0
                      • 版块
                      • 最新
                      • 标签
                      • 热门