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

YunTu Forum

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

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

已定时 已固定 已锁定 已移动 已解决 YTM32B1M系列
12 帖子 5 发布者 4.3k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 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
      在 回复了 FarleyHuang 最后由 编辑
      #4

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

      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 番茄+两个蛋番 2 条回复 最后回复
              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 在 中 引用了 这个主题
                        • 番茄+两个蛋番 离线
                          番茄+两个蛋番 离线
                          番茄+两个蛋
                          在 回复了 FarleyHuang 最后由 编辑
                          #11

                          FarleyHuang 你好,初始化的时候已经开启了ADC_DRV_Start,后续获取后还需要再次调用吗?这是为什么啊?

                          YTCQ_shejiwangY 1 条回复 最后回复
                          0
                          • YTCQ_shejiwangY 离线
                            YTCQ_shejiwangY 离线
                            YTCQ_shejiwang YunTu
                            在 回复了 番茄+两个蛋 最后由 编辑
                            #12

                            番茄+两个蛋
                            软件触发,触发模式不为Countinous,是需要再次触发的(Start)。

                            1 条回复 最后回复
                            0
                            • ,FrankieF Frankie 将这个主题转为问答主题
                            • ,FrankieF Frankie 将这个主题标记为已解决

                          • 云途开发生态介绍

                            快速上手云途开发生态

                          • 云途论坛规则/Yuntu Forum Rules

                            发帖前请查看

                          • YT CONFIG TOOL调查问卷

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

                          • can
                            25
                            demo
                            22
                            lin stack
                            13
                            uds
                            13
                            md14
                            6
                            yt-link
                            6
                            fbl
                            5
                            adc模块
                            4
                            Online Users
                            • 登录

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