查看: 5472|回复: 4

[求助] 有没有大佬做过MKV30的ADC的DMA差分输入,卡了几天了

[复制链接]
  • TA的每日心情
    无聊
    2021-1-15 10:56
  • 签到天数: 39 天

    连续签到: 1 天

    [LV.5]常住居民I

    21

    主题

    116

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    436
    最后登录
    2021-10-9
    发表于 2020-11-16 14:38:38 | 显示全部楼层 |阅读模式
    结合SDK以及论坛的帖子写了一个MKV30的ADC的DMA差分输入,debug时候发现可以采集到电压,但是DMA的接收缓存数组g_adc16SampleDataArray[16]只有第一个有数据,后面都是空的。我在主函数循环void DifferentialSample_DC(void)这个函数,ADC_Value是有值的。
    小恩GG可以帮一下吗?或者哪里有这个驱动,可以有偿。卡了好几天,最后一步走不下去了



    #include "ADC.h"
    /***********************************************************************************************************************
    * BOARD_InitPeripherals functional group
    **********************************************************************************************************************/
    #define ADC16_RESULT_REG_ADDR    0x4003b010U
    #define DEMO_ADC16_SAMPLE_COUNT 16U /* The ADC16 sample count. */

    volatile bool g_Transfer_Done = false; /* DMA transfer completion flag. */
    edma_transfer_config_t g_transferConfig;
    uint32_t g_adc16SampleDataArray[DEMO_ADC16_SAMPLE_COUNT];
    /***********************************************************************************************************************
    * DMA initialization code
    **********************************************************************************************************************/

    static void Edma_Callback(edma_handle_t *handle, void *userData, bool transferDone, uint32_t tcds)
    {
        /* Clear Edma interrupt flag. */
        EDMA_ClearChannelStatusFlags(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, kEDMA_InterruptFlag);
        /* Setup transfer */
        EDMA_PrepareTransfer(&g_transferConfig, (void *)ADC16_RESULT_REG_ADDR, sizeof(uint32_t),
                             (void *)g_adc16SampleDataArray, sizeof(uint32_t), sizeof(uint32_t),
                             sizeof(g_adc16SampleDataArray), kEDMA_PeripheralToMemory);
        EDMA_SetTransferConfig(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, &g_transferConfig, NULL);
        /* Enable transfer. */
        EDMA_StartTransfer(&DMA_CH1_Handle);
        g_Transfer_Done = true;
    }

    const edma_config_t DMA_config = {
      .enableContinuousLinkMode = false,
      .enableHaltOnError = false,
      .enableRoundRobinArbitration = false,
      .enableDebugMode = false
    };
    edma_handle_t DMA_CH1_Handle;
    edma_handle_t DMA_CH2_Handle;

    void ADC_DMA_init(void) {

      /* Channel CH1 initialization */
            DMAMUX_Init(DMAMUX);
      /* Set the source kDmaRequestMux0ADC0 request in the DMAMUX */
      DMAMUX_SetSource(DMA_DMAMUX_BASEADDR, DMA_CH1_DMA_CHANNEL, 40);
      /* Enable the channel 1 in the DMAMUX */
      DMAMUX_EnableChannel(DMA_DMAMUX_BASEADDR, DMA_CH1_DMA_CHANNEL);
      /* Create the eDMA DMA_CH1_Handle handle */
      EDMA_CreateHandle(&DMA_CH1_Handle, DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL);

    }
    void EDMA_Configuration(void)
    {
            edma_config_t userConfig;

        EDMA_GetDefaultConfig(&userConfig);
        EDMA_Init(DMA_DMA_BASEADDR, &userConfig);
        EDMA_CreateHandle(&DMA_CH1_Handle, DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL);
        EDMA_SetCallback(&DMA_CH1_Handle, Edma_Callback, NULL);
        EDMA_PrepareTransfer(&g_transferConfig, (void *)ADC16_RESULT_REG_ADDR, sizeof(uint32_t),
                             (void *)g_adc16SampleDataArray, sizeof(uint32_t), sizeof(uint32_t),
                             sizeof(g_adc16SampleDataArray), kEDMA_PeripheralToMemory);
        EDMA_SubmitTransfer(&DMA_CH1_Handle, &g_transferConfig);
        /* Enable interrupt when transfer is done. */
        EDMA_EnableChannelInterrupts(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, kEDMA_MajorInterruptEnable);
    #if defined(FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT) && FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT
        /* Enable async DMA request. */
        EDMA_EnableAsyncRequest(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, true);
    #endif /* FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT */
        /* Enable transfer. */
        EDMA_StartTransfer(&DMA_CH1_Handle);
    }
    /***********************************************************************************************************************
    * ADC0 initialization code
    **********************************************************************************************************************/

    adc16_channel_config_t ADC0_channelsConfig[1] = {
      {
        .channelNumber = 1U,
        .enableDifferentialConversion = true,
        .enableInterruptOnConversionCompleted = true,
      }
    };
    const adc16_config_t ADC0_config = {
      .referenceVoltageSource = kADC16_ReferenceVoltageSourceVref,
      .clockSource = kADC16_ClockSourceAsynchronousClock,
      .enableAsynchronousClock = true,
      .clockDivider = kADC16_ClockDivider8,
      .resolution = kADC16_ResolutionSE16Bit,
      .longSampleMode = kADC16_LongSampleDisabled,
      .enableHighSpeed = true,
      .enableLowPower = false,
      .enableContinuousConversion = true
    };
    const adc16_channel_mux_mode_t ADC0_muxMode = kADC16_ChannelMuxA;
    const adc16_hardware_average_mode_t ADC0_hardwareAverageMode = kADC16_HardwareAverageCount8;

    void ADC0_init(void) {
      /* Initialize ADC16 converter */
      ADC16_Init(ADC0_PERIPHERAL, &ADC0_config);
      /* Make sure, that software trigger is used */
      ADC16_EnableHardwareTrigger(ADC0_PERIPHERAL, false);
      /* Configure hardware average mode */
      ADC16_SetHardwareAverage(ADC0_PERIPHERAL, ADC0_hardwareAverageMode);
      /* Configure channel multiplexing mode */
      ADC16_SetChannelMuxMode(ADC0_PERIPHERAL, ADC0_muxMode);
      /* Initialize channel */
      ADC16_SetChannelConfig(ADC0_PERIPHERAL, 0U, &ADC0_channelsConfig[0]);
      /* Enable DMA. */
      ADC16_EnableDMA(ADC0_PERIPHERAL, true);
    }

    void ADC_Differential_DC_Channel_Config(void)
    {
            ADC0_channelsConfig[0].channelNumber = 0;
            ADC0_channelsConfig[0].enableDifferentialConversion =true;
            ADC0_channelsConfig[0].enableInterruptOnConversionCompleted = true;
    }
    uint32_t ADC_Value = 0;

    void DifferentialSample_DC(void)
    {
           ADC_Differential_DC_Channel_Config();
          ADC16_SetChannelConfig(ADC0_PERIPHERAL, 0U, &ADC0_channelsConfig[0]);
    //        while (0U == (kADC16_ChannelConversionDoneFlag & ADC16_GetChannelStatusFlags(ADC0, 0)))
    //        {
    //        }
            ADC_Value = ADC16_GetChannelConversionValue(ADC0, 0);
            ADC_Value = ADC_Value*3000/4095;
    }
    /***********************************************************************************************************************
    * Initialization functions
    **********************************************************************************************************************/
    void ADC_InitPeripherals(void)
    {
            ADC_DMA_init();
      EDMA_Configuration();
      ADC0_init();

    }

    /***********************************************************************************************************************
    * BOARD_InitBootPeripherals function
    **********************************************************************************************************************/
    void ADC_InitBootPeripherals(void)
    {
      ADC_InitPeripherals();
    }



    最佳答案

    先测试你的edma,能否将一个内存数据转移到另一个内存,用memorytomemory. 然后正常的adc能不能实现dma转移,最后再使用差分。分三步一步一步来。
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24948
    最后登录
    2025-7-25
    发表于 2020-11-17 09:15:01 | 显示全部楼层
    先测试你的edma,能否将一个内存数据转移到另一个内存,用memorytomemory. 然后正常的adc能不能实现dma转移,最后再使用差分。分三步一步一步来。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2021-1-15 10:56
  • 签到天数: 39 天

    连续签到: 1 天

    [LV.5]常住居民I

    21

    主题

    116

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    436
    最后登录
    2021-10-9
     楼主| 发表于 2020-11-17 14:03:42 | 显示全部楼层
    小恩GG 发表于 2020-11-17 09:15
    先测试你的edma,能否将一个内存数据转移到另一个内存,用memorytomemory. 然后正常的adc能不能实现dma转移 ...

    今天一直在调,一直是只有数组的第一个有数据,刚才使用SDK里面的eDMA例程移植了一下,结果还是一样,应该打印01 02 03 04,但是串口只打印出来03.在debug模式下能看到接收数组只有destAddr[0]有一个数据04。到底是什么原因呢?
    微信图片_20201117135851.png 微信图片_20201117140011.png 微信图片_20201117135933.png
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2021-1-15 10:56
  • 签到天数: 39 天

    连续签到: 1 天

    [LV.5]常住居民I

    21

    主题

    116

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    436
    最后登录
    2021-10-9
     楼主| 发表于 2020-11-17 16:48:51 | 显示全部楼层
    此问题已解决,原因是我在写串口DMA的时候因为需要最大速度的串口响应,我将库函数里面的一些代码做了删减。有点呆了
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    6

    帖子

    0

    新手上路

    Rank: 1

    积分
    14
    最后登录
    2021-12-24
    发表于 2021-12-21 18:23:45 | 显示全部楼层
    鹰宫璞爱惟 发表于 2020-11-17 16:48
    此问题已解决,原因是我在写串口DMA的时候因为需要最大速度的串口响应,我将库函数里面的一些代码做了删减 ...

    兄弟!你是人才!别动库啊   不用的话 直接寄存器,要不然以后出问题都不知道哪里出的
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-26 19:15 , Processed in 0.097044 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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