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.

[参考译文] MSP430F6736A:SD24,ADC10和DMA -重复-通道序列

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/661769/msp430f6736a-sd24-adc10-and-dma---repeated---sequence-of-channels

部件号:MSP430F6736A

您好,

我们有一个应用程序应该同步使用3个SD24信道和15个ADC10信道。  

我们使用的MSP430具有一个特殊的触发器模块,用于在每个 SD24转换结束时触发ADC10。  

我在“信道重复序列- ADC10CONSEQ_3”模式下配置了ADC10,并使用 自动下一个连接(MSC集)

最后,我将DMA配置为重复单传输模式。

我希望:

1. SD24将触发ADC10。

2.使用此单触发器,ADC10应自动扫描所有15个通道

3. DMA会自动将所有ADC10MEM0结果放入我的阵列[15]。

所有这些操作都应在没有任何中断和自动的情况下完成。 下一个SD24触发器将在1毫秒后出现,ADC10应再次扫描15个信道。 (扫描15个信道只需50us)

我启用了DMA中断以查看正在发生的情况。 我意识到中断只发生一次。

在通道的重复序列中使用ADC10的正确方式是什么- ADC10CONSEQ_3?

TI未提供 任何用于信道模式重复序列的示例代码。

void init(void)
{
	ADC10CTL0 &=~ADC10ENC;	
	ADC10IE = 0x00;
	ADC10IFG =0;
	ADC10CTL0 = ADC10C10SHT0| ADC10ON | ADC10MSC;// ADC开,ADC10等待SD24的触发器,采样时间2us (CT8xADCclk),自动下一个控制器ADC1030
	= ADSE3 | ADSEEL_ADSE3 ///*由SD24触发,SMCLK = 4MHz,重复-通道序列

	ADC10CTL2 = ADC10RES | ADC10DF;
	ADCMCT0 = ADC10SREF_1 | ADC10INCH_15;

	// 10位ADC
	的DMA设置DMACTL0 = DMA1TSL__ADDATIFG0;__ADC10SREF_1 | ADC10INCH_15 AD1016
	
	(AD10DA_16) ADDR_DA_DA_1U16 (AD1016) ADDR_DA_DA_DA_AD1U16 (AD1016)
	DMA1SZ =16;//通道15至0
	DMA1CTL = DMADT_4 | DMADSTINCR_2 | DMAEN | DMAIE;//启用,目标地址递减,重复单次传输ADMAC10CTL0

	|= ADC10ENC;//启动ADC并等待SD24
的触发器{_interrupt


{ DMA_void_isr_NOW_DIF_DIV_NOW_: DMA_DIV_NOW_(
	DMA_NOW_)
	
		
		{

			Break;
		}

		CASE DMAIV_DMA0IFG://		DMA0IFG = DMA通道0
		{
			Break;
		}

		CASE DMAIV_DMA1IFG://		DMA1IFG = DMA通道1
		{
			PROCESS_DATA();
			break;
		

				
		
			
		

				
		
			
		
	} CASE DMAIV_DMA2IFG:// DMA2IFG = DMA通道2 { Break;}缺省值:}
	
	

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [我没有使用SD24触发器,但我希望它与计时器触发器相同。]

    这里有两件事:
    1)第一次突发(16次传输)完成后,DMA将停止。 您需要重新布防(DMAEN=1),大概是在ISR中。
    2)[请参阅SLAU208P Figure 27-9]在CONSEQ=3和MSC=1的情况下,一旦ADC10获得触发器,它将持续转换,而不是等待另一个触发器。 按照当前的编码,这最终是无害的,因为DMA已停止,但它并不是您真正想要的(尤其是在您修复(1)之后)。

    我建议您改用CONSEQ=1。 [请参阅SLAU208P Figure 27-7]要获得每个触发器的脉冲,您需要MSC=1,但您需要为每个脉冲切换ENC (先低后高)以重新布防ADC。 在DMA ISR中执行此操作的好时机是重新布防DMA的同时。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    在进一步研究“信道模式重复序列”的含义后,我意识到这其实根本不是我想要的。
    我的结论是,不可能在没有CPU开销的情况下同步所有SD24和ADC10通道数据。
    我必须在DMA中断内重新设置一些寄存器。

    因此,我将ADC10配置为"通道序列(自动扫描)"模式,而不是像您建议的那样重复一个,即ADC10CONSEQx = 01。
    然后将DMA更改为在"单传输"模式下工作。


    每次DMA中断时,我都会重新配置ADC10和DMA。 这种方式按预期工作。

    我在这里有一个问题。 用户手册说明了这一点
    使用任何其他触发源(如我的情况)时,必须在每个序列之间切换ADC10ENC。

    但是他们没有提到我在切换时应该保持低电平多长时间。

    ADC10CTL0 &=~ADC10ENC;
    //这里我需要一些延迟吗? 这似乎是肯定的。
    ADC10CTL0 |= ADC10ENC;


    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的经验:不是。我总是毫不拖延地背靠背地做。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在该线程中;

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/62.6461万?tisearch=e2e-sitesearch&keymatch=Repeated%20-%20Sequence%20of%20channels

    他们说您应该至少等待3个ADC时钟。 这适用于ADC14,而不适用于ADC10。 但我怀疑他们使用相同的设计。

    在我的案例中,MCU时钟MCLK = 8 MHz,而ADC10时钟仅为1 MHz。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    MSP432 TRM [SLAU356H sec 22.2 ADC.ADC14] 8.2 部分特别提到了这一要求。

    MSP430 F5/F6 UG [SLAU208O sec 27.2 .7.2 ]未提及此类要求。 ADC12部分[SLAU208O sec 28.2 .7.2 也没有。 我想这可能与不同的巴士结构有关。

    我对一个症状的第一个猜测是ENC切换根本无法识别,ADC将停止。 我在使用ADC10的10年中没有见过这种症状。

    除此之外,我还要听从这里的威世智。