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.

[参考译文] CC3220SF-LAUNCHXL:Wi-Fi 论坛

Guru**** 2483385 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1275885/cc3220sf-launchxl-wi-fi-forum

器件型号:CC3220SF-LAUNCHXL

您好!

我一直在尝试通过将 FIFO 读取到 RAM 缓冲区来实现 ADC 读数的 DMA 传输。

我在这方面没有取得任何成功。 请帮帮我。

以下是我尝试用于实现目的的代码。

#define ADC_BUFFER_SIZE 128
#define MY_BUFF_SIZE 64

static uint16_t adc_samples [ADC_BUFFER_SIZE] = {};
static uint16_t my_buff [MY_BUFF_SIZE] = {};

void adc_dma_init(void);
void adc_start_dma_sampling(void);
void adc_dma_reenable(void);
void ADCIntHandler(void);


void main(void)
{
	adc_dma_init();
    adc_start_dma_sampling();

    while(1)
	{
		// the flag is set in the interrupt handler
		if (g_AdcDmaTfrDone)
		{
			g_AdcDmaTfrDone = false;
			memcpy(my_buff, adc_samples, MY_BUFF_SIZE);
			sleep(2);
			
			// trigger the next set of adc data transfer
			adc_dma_reenable();
		}
	}
    return;
}


void adc_dma_init(void)
{
  UDMACC32XX_init();
  udma = UDMACC32XX_open();
  uDMAChannelAssign(UDMA_CH15_ADC_CH1);
  uDMAChannelControlSet(
		UDMA_CH15_ADC_CH1|UDMA_PRI_SELECT, 
		UDMA_SIZE_16|UDMA_SRC_INC_NONE|UDMA_DST_INC_16|UDMA_ARB_1);
  uDMAChannelTransferSet(
		UDMA_CH15_ADC_CH1|UDMA_PRI_SELECT, 
		UDMA_MODE_BASIC, 
		(void*)(ADC_BASE+ADC_O_channel2FIFODATA), 
		adc_samples, 
		ADC_BUFFER_SIZE);
  uDMAChannelEnable(UDMA_CH15_ADC_CH1);
  uDMAEnable();


  // Initialize the ADC
  ADC_init();
  ADC_Params adc_params;
  ADC_Params_init(&adc_params);
  adc_handle = ADC_open(CONFIG_ADC_0, &adc_params);
}


void adc_start_dma_sampling(void)
{
    ADCChannelDisable(ADC_BASE, ADC_CH_1);
    ADCDMAEnable(ADC_BASE, ADC_CH_1);
    ADCIntRegister(ADC_BASE, ADC_CH_1, ADCIntHandler);
    ADCIntClear(ADC_BASE, ADC_CH_1, ADC_DMA_DONE);
    ADCIntEnable(ADC_BASE, ADC_CH_1, ADC_DMA_DONE);
    ADCChannelEnable(ADC_BASE, ADC_CH_1);
    uDMAChannelRequest(UDMA_CH15_ADC_CH1);
    ADCEnable(ADC_BASE);
}


void adc_dma_reenable(void)
{
    ADCIntEnable(ADC_BASE, ADC_CH_1, ADC_DMA_DONE);
    uDMAChannelEnable(UDMA_CH15_ADC_CH1);
    uDMAChannelRequest(UDMA_CH15_ADC_CH1);
    ADCEnable(ADC_BASE);
}


void ADCIntHandler(void)
{
    uint32_t ui32Mode;
    uint32_t ui32Stat;

    ui32Stat = ADCIntStatus(ADC_BASE, ADC_CH_1);
    ADCIntClear(ADC_BASE, ADC_CH_1, ui32Stat);

    ui32Mode = uDMAChannelModeGet(UDMA_CH15_ADC_CH1|UDMA_PRI_SELECT);
	
    if(!uDMAChannelIsEnabled(UDMA_CH15_ADC_CH1))
    {
        // Turn off ADC and clear IRQ-Bit
        ADCDisable(ADC_BASE);
        ADCIntClear(ADC_BASE, ADC_CH_1, ADC_DMA_DONE);
        ADCIntDisable(ADC_BASE, ADC_CH_1, ADC_DMA_DONE);
        uDMAChannelTransferSet(
				UDMA_CH15_ADC_CH1|UDMA_PRI_SELECT, 
				UDMA_MODE_BASIC, 
				(void*)(ADC_BASE+ADC_O_channel2FIFODATA), 
				adc_samples, 
				ADC_BUFFER_SIZE);
        uDMAChannelEnable(UDMA_CH15_ADC_CH1);

        g_AdcDmaTfrDone = true;
    }
}

e2e.ti.com/.../adc_5F00_dma.c

谢谢。

瓦萨夫

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

    您好、Vasav、

    我不建议尝试为 ADC 创建您自己的库。 相反、我建议使用作为 simplelink 库一部分的 ADC 驱动程序。 有关文档、您可以阅读"TI 驱动程序 API 文档"。 我们还有一个 ADC 示例。  

    您是否尝试过示例或 ADC 驱动程序?

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

    我不是在尝试创建新的 ADC 驱动程序、而是在他们的 SDK 中使用 TI 提供的驱动程序。 我没有看到任何将 DMA 与 ADC 结合使用的示例、如果您有任何建议、请告诉我这一点吗? 此外、我阅读了该文档、对于使用 ADC 实现 DMA 非常有限。

    如果您有任何建议、请链接至这些建议。

    谢谢!

    瓦萨夫

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

    您好、Vasav、

    感谢您更正;我现在知道您要将 DMA 与 ADC 一起使用。 由于我们没有 ADC 和 DMA 的示例、因此我会向您推荐 CC3220 TRM。  https://www.ti.com/lit/ug/swru465/swru465.pdf 

    似乎其他海报也有一些工作: https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/680229/rtos-cc3220sf-launchxl-adc-with-dma-transfer 

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

    您好、Sabeeh:

    感谢您提供这些信息。 我已详细阅读 TRM、但仍然无法使该 DMA 按预期运行。 但是、为了说明这一点、我已经能够使用 DMA 进行采样、在其中失败的地方是采样在缓冲器末尾附近完成。 我的当前设置是使用函数生成器并生成一个正弦波、该正弦波连接到 ADC 线路。 当我开始采样时、我看到大约900个0、然后我在缓冲器中看到一些数据。 您是否知道这可能发生的原因?

    另外、如果您能够提供一些适用于此场景的示例代码、我会非常感激! 我的代码最初基于另一个帖子中链接的代码。

    感谢您的帮助!

    瓦萨夫