| 
在线时间69 小时
UID3399501
注册时间2020-7-31
NXP金币0 
 TA的每日心情|  | 无聊 2021-1-15 10:56
 | 
|---|
 签到天数: 39 天 连续签到: 1 天 [LV.5]常住居民I 中级会员  
 
 
	积分436 
最后登录2021-10-9 | 
 
| 结合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转移,最后再使用差分。分三步一步一步来。
        | 
 |