This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5869:ADC有时会在重复信号通道模式下停止转换

Guru**** 2381460 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/660227/msp430fr5869-adc-sometimes-stop-convert-in-repeat-signal-channel-mode

部件号:MSP430FR5869

您好:

我在重复信号通道模式下使用ADC12,ADC12SHSx为0,时钟源为SMCLK,为8MHz,ADC时钟分频器为1MHz。

我使用DMA传输ADC结果,低功耗模式是LPM3。  

大多数时候MCU工作正常,但有时会停止。

在调试模式下,我发现ADC12停止转换具有ADC12SC Keep 1 (数据表显示ADC12SC自动重置),ADC12BUSY Keep 1,

DMA不传输任何数据。

有人能帮我解决这个问题吗? 非常感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    您是手动触发ADC还是使用定时器触发模式? 无论采用哪种方式,听起来都可能是ADC42勘误表。 请参阅产品页面上的错误表,了解完整的说明和解决方法,并告诉我这是否解决了问题。

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在使用手动触发模式,我已经看到了错误表,但我不认为它是ADC42勘误表,

    因为每次ADC转换完成后 ,我都会重置ADC12ENC, 然后轮询ADC12BUSY直到它重置,之后我会禁用ADC12。

    下次使用ADC时,我会重新启用ADC模块并重新启用转换。

    	ADC12_B_DisableConversions (ADC12_B_BASE,ADC12_B_COMPLETECONVERSION);
    
    	While (ADC12_B_isBusy (ADC12_B_B_B_B_BASE)
    	){
    	vTaskDelay (1);
    	}
    	ADC12_B_DISABLE (ADC12_B_base); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    您还能否提供重新启用ADC和转换的代码(假设是ANS开始转换)? 任何与ADC相关的代码都有助于尝试找出此处出现的问题。

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    有一个好消息,自从将低功耗模式从LPM3更改为LPM2后,该设备在2.5 天内工作正常。

    但我不确定问题是否完全解决了,我会继续测试。

    下面是我的初始化代码:

    common_initADC (通道,refSource);
    common_initDMA ();
    
    ADC12_B_startConversion (ADC12_B_BASE,ADC12_B_START_AT_ADC12MEM0, ADC12_B_REALITED_SINGLECHANNEL); 


    函数common_initADC:

    静态	void	common_initADC (uint8_t channel,uint16_t refSource)
    {ADC12_B_initParam_initParam_b_configureParam参数
    
    		
    		;
    
    		initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSURCE_SC;initParam.B_initParam_SourceSelect_ADC12_CD_CAMP12
    					
    		
    						
    		initParam.internalChannelMap
    		= ADC12
    
    		
    
    
    		
    									ADC12_B_CYCLEHOLD_384_CYC12_B_CYCLEHOLD_384_CYCLES
    									,
    									ADC12_B_MULTIPLESAMPLESENABLE);
    
    
    		configParam.memoryBufferControlIndex = ADC12_B_MEMORY_0;
    		configParam.inputSourceSelect =通道;
    		configParam.refVoltageSourceSelect = refSource;
    		configParam.endOfSequence = ADC12_B_NOTENDOFSEQUENCER;
    		configParam.windowComparatorSelect = ADC12_B_window_Comporer_disable;
    		configParam.DifferalModeSelect = ADC12_B_Different_mode_disable;
    		ADC12_B_configureMemory (ADC12_B_BASE,B_B_B_B_DISAB_DIBLE) &configParam);
    
    } 

    函数common_initDMA:

    静态	void	common_initDMA (void)
    {
    		DMA_initParam	dmaParam;
    
    		dmaParam.channelSelect = DMA_channel_2;
    		dmaParam.transferModeSelect = DMA_transfer_single;
    		dmaParam.transferSize = oversample_buffer_size;
    		dmaParam.trigerSourceSelect = DMA_IGGERSOURCE_26; 	// ADC12转换结束
    		dmaParam.transferUnitSelect = dma_size_SRCWORD_DSTWORD;
    		dmaParam.triggerTypeSelect = dma_trigger_high;
    		dma_init (&dmaParam);
    		dma_setSrcAddress (dma_channel_2,ADC12_B_getMemoryAddressForDMA (ADC12_B_BASE, ADC12_B_MEMORY_0),DMA_DIRECT_NACHANGED);
    		DMA_setDstAddress (DMA_CHANGE_2,(UINT32_t)&测量OversampleBuffer[0],DMA_DIRECT_INCREMENT);
    
    		DMA_clearInterrupt (DMA_channel_2);
    		DMA_enableInterrupt (DMA_channel_2);
    
    
    		ADC12_B_getResults (ADC12_B_base, ADC12_B_memory_0);
    		DMA_enableTransfers (DMA_channel_2);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    在LPM3中,除非有请求,否则SMCLK将关闭。 您使用SMCLK作为ADC的源,因此这可能是您在LPM2中不再看到此问题的原因。 如果您想使用LPM3,我建议您考虑使用ACLK,尽管这将是一个速度慢得多的时钟。

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    我不理解的是为什么在ADC请求SMCLK时关闭它?

    除了时钟源和触发源不匹配之外,它看起来与ADC41勘误表类似。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    我同意,如果ADC请求SMCLK,则应该将其打开,尽管这不是理想的,并且可能会导致问题(尽管不是已知的问题)。 如果您使用的是ADC41勘误表中列出的其中一个计时器,则可能是问题所在。 我意识到您使用的是SMCLK,而不是ADC12OSC。 您能否发布您的时钟初始化代码,以便我了解SMCLK的来源?

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    我只是发现我正在使用DCOCLK而不是HFXTCLK作为时钟源,但我应该使用HFXTCLK,这是一个错误。

    尽管这是ADC停止的原因吗?

    /*
    时钟系统初始化
    */
    void Clock_init(void)
    {
    FRAMCtl_configureWaitStateControl (FRAMCTL_ACCESS_Time_Cycles_0);
    
    //将DCO频率设置为默认值8MHz
    CS_setDCOFreq (CS_DCORSEL_0,CS_DCOFSEL_6);
    
    cs_setExternalClockSource (3.2768万,8000000L);
    
    #IF 0
    CS_TRENONHFXT (HFXTDRIVE_3);
    
    // 将MCLK配置为8 MHz,将SMCLK配置为8 MHz
    cs_initClockSignal (CS_MCLK,CS_HFXTCLK_SELECT,CS_Clock_diver_1);
    cs_initClockSignal (CS_SMCLK,CS_HFXTCLK_SELECT,CS_Clock_diver_1);
    
    #else //将MCLK配置为8 MHz,将SMCLK配置为8 MHz
    cs_initClockSignal (CS_MCLK,CS_DCOCLK_SELECT,CS_Clock_diver_1);
    cs_initClockSignal (CS_SMCLK,CS_DCOCLK_SELECT,CS_Clock_diver_1);
    #endif
    
    //初始化XT1晶体振荡器
    cs_turnOnLFXT (CS_LFXT_DRIVE_3);
    
    cs_initClockSignal (CS_ACLK,CS_LFxTCLK_SELECT,CS_Clock_diver_1);
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    如果您使用的是DCOCLK,则表明这不是ADC41勘误表。 但是,使用DCO可能会导致问题,因为它的一致性不如外部晶体,尤其是因为您只是偶尔看到它。 假设您连接了高频晶体,请尝试使用HFXTCLK并查看是否仍然存在问题。

    此致,
    Nathan