主题中讨论的其他器件: 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);
}