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.

[参考译文] TMS320C6746:用于扫描 ADC 数据的 EDMA

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1059379/tms320c6746-edma-for-scaning-data-from-adc

器件型号:TMS320C6746
主题中讨论的其他器件: ADS8588H

尊敬的 TI:

我使用 tms320c6746通过 SPI 从 ads8588h 获取数据、我确实获取了一些数据 、但我看到 EDMA 无法根据我的需要工作、

我需要 DSP 来扫描一些固定数量的样本、例如来自 ads8588h 的256个50Hz 波形样本、来自的50Hz 波形样本数量不应变化、

我已经验证并读出 ADC 能够提供更高数量的样本、我仅使用了不带 DMA 的 SPI、并准确地将超过1500个50Hz 波形样本应用于 adc8588h、

 但是,使用 tms320c6746中的 EDMA,我只得到50Hz 波形的4-5个样本,我确定 ADC 正在转换并生成它可以转换的尽可能多的样本,但控制器无法从 ADC 中提取这些样本,

我看到代码会进入 Edma3CCErrHandlerIsr (void)、看起来 DSP 长时间停留在 EDMA 处理程序中、因此从 ADC 获取数据需要更多的时间、 对这一点的任何见解都很有帮助、因为我已经用2-3天的时间来寻找问题的代码  

这是我的代码、如果需要、我将在开始对话后再分享一些代码

int main (空)

/*峰化 SPI0实例。 *
PSCModuleControl (SOC_PSC_0_regs、HW_PSC_SPI0、PSC_POWERDOMAIN_AYS_ON、
PSC_MDCTL_NEW_ENABLE);

PSCModuleControl (SOC_PSC_1_regs、HW_PSC_GPIO、PSC_POWERDOMAIN_AYST_ON、
PSC_MDCTL_NEW_ENABLE);


/*表示 DMA */
/*为 EDMA3CC_0启用 PSC)。*/
PSCModuleControl (SOC_PSC_0_regs、HW_PSC_cC0、PSC_POWERDOMAIN_AYS_ON、
PSC_MDCTL_NEW_ENABLE);

/*为 EDMA3TC_0启用 PSC。*/
PSCModuleControl (SOC_PSC_0_regs、HW_PSC_TC0、PSC_POWERDOMAIN_AYST_ON、
PSC_MDCTL_NEW_ENABLE);

GPIOADCPinsSetup();
ifdef DMA
StartADCConversion (0);
#endif
/******** /
SPIPinMuxSetup (0);

/*配置和启用 SPI1实例。 *
SetUpSPI();
ifdef DMA
/*SPI with DMA 18nov21*/
/*初始化 EDMA3实例。 *
EDMA3初始化();
//#ifndef DMA_LOOP
ConfigureADCBusyInterrupt();
//#endif

对于 SPI1、//请求针对 Tx 和 Rx 通道的 EDMA3CC。 *
RequestEDMA3通道();

/*请求 DMA 通道和 TCC 以进行 SPI 接收*/
#endif
/*启用 SPI 通信*/
SPIEnable (SOC_SPI_0_regs);

// SetDMATransfer();

ResetADC();
CSADC (0);

ifdef DMA
while (1)

StartADCConversion (1);//它设置一个连接到 ADC 的 GPIO、ADC 在检测到低电平到高电平时开始转换(转换数据最多需要18us、在3.8us 内转换)
BUSY = 1;
while (BUSY);// ADC 提供中断并且我在 GPIO 上捕获中断并清除 BUSY 标志  

DataTransferUsingDMA();


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//我通过 SPI 发送16个虚拟字节到 ADC 以获得16个数据字节作为返回(ADC 有8个通道,发送每个通道有2个字节的数据,因此8x2个数据字节)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*
**此函数启用 SPI 闪存进行写入。
*

静态空 DataTransferUsingDMA (空)

无符号 buffint 长度= 0;
int j;
对于(j = 0;j < 16;j++)

TxDummyData[j]= 0xAA;

buffLength = j;

/*在 EDMA 中配置参数寄存器以进行传输。 *
SpiTxEdmaParamSet (EDMA3_CHA_SPI0_TX、EDMA3_CHA_SPI0_TX、TxDummyData、buffLength);

/*为传输注册回叫功能。 *
CB_Fxn[EDMA3_CHA_SPI0_TX]=回调(&B);

/*在 EDMA 中为接收配置参数寄存器。 *
SpiRxEdmaParamSet (EDMA3_CHA_SPI0_RX、EDMA3_CHA_SPI0_RX、RxData、buffLength、TRUE);

/*为接收注册回叫功能。 *
CB_Fxn[EDMA3_CHA_SPI0_RX]=回调(&B);

/*将与 SPI 闪存相对应的 CSHOLD 线路置为有效。 *
/CSHoldAssert();

// CSADC (0);

/*启用 SPI 控制器以生成 DMA 事件*/
SPIIntEnable (SOC_SPI_0_regs、SPI_DMA_Request_ENA_INT);

/*等待回调函数中的两个标志都设置为1。 *
while ((0 = flagTx)||(0 = flagRx);

flagTx = 0;
flagRx = 0;

/*取消与 SPI 闪存相对应的 CSHOLD 线路的置位。 *
//CSHoldDeassert();

// CSADC (1);
StartADCConversion (0);
/*等待 SPI 闪存被启用进行写入。 *
// while (IsWriteEnabled()!= true);

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

    您好、TI、  

    更具体地说、我针对 EDMA 通道的每个传输完成事件进入错误处理程序2次、

    我在 EMR 的 EDMA 错误处理程序中看到的错误适用于用于 SPI 传输的通道15  

    可能导致此问题的原因、请提出任何建议  

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

    您好!  

    您使用的是哪个 SDK 版本?

    此致、

    Dillon