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.

DMA数据传输问题

Dear TI:

本项目I2S2 做Master RX,采集来自digital mic的音频信号,通过DAM传输到memory中,在DSP中对音频信号处理后,I2S0做Master TX,通过DAM传输到I2S0的Transmit Left/Right Data Register

目前碰到的问题是DMA从I2S2 Receive Left/Right Data Register传输到memory的buff拿到的数据全是0,示波器测量I2S2 RX管脚是有波形的;

我的设置如下,请帮忙看看:

/* Configure DMA channel for I2S0 Left write */
#if (defined(CHIP_C5505_C5515) || defined(CHIP_C5504_C5514) || defined (CHIP_C5517) || defined(CHIP_C5535) || defined(CHIP_C5545))
dmaConfig.pingPongMode = CSL_DMA_PING_PONG_DISABLE;
#endif
dmaConfig.autoMode = CSL_DMA_AUTORELOAD_DISABLE;
dmaConfig.burstLen = CSL_DMA_TXBURST_1WORD;
dmaConfig.trigger = CSL_DMA_EVENT_TRIGGER;
dmaConfig.dmaEvt = CSL_DMA_EVT_I2S0_TX;
dmaConfig.dmaInt = CSL_DMA_INTERRUPT_DISABLE;
dmaConfig.chanDir = CSL_DMA_WRITE;
dmaConfig.trfType = CSL_DMA_TRANSFER_IO_MEMORY;
dmaConfig.dataLen = 4;
dmaConfig.srcAddr = (Uint32)i2sDmaWriteLeftBuff;
dmaConfig.destAddr = (Uint32)(0x2808);
dmaLeftTxHandle = CSL_configDmaForI2s(CSL_DMA_CHAN0);
if(dmaLeftTxHandle == NULL)
{
printf("DMA Config for I2S Write Failed!\n!");
return(CSL_TEST_FAILED);
}

I2S_transEnable(hI2s, TRUE);

status = DMA_start(dmaLeftTxHandle);
if(status != CSL_SOK)
{
printf("I2S Dma Write Failed!!\n");
return(result);
}
while(DMA_getStatus(dmaLeftTxHandle));

/* Configure DMA channel for I2S0 Right write */
#if (defined(CHIP_C5505_C5515) || defined(CHIP_C5504_C5514) || defined(CHIP_C5517) || defined(CHIP_C5535) || defined(CHIP_C5545))
dmaConfig.pingPongMode = CSL_DMA_PING_PONG_DISABLE;
#endif
dmaConfig.autoMode = CSL_DMA_AUTORELOAD_DISABLE;
dmaConfig.burstLen = CSL_DMA_TXBURST_1WORD;
dmaConfig.trigger = CSL_DMA_EVENT_TRIGGER;
dmaConfig.dmaEvt = CSL_DMA_EVT_I2S0_TX;
dmaConfig.dmaInt = CSL_DMA_INTERRUPT_DISABLE;
dmaConfig.chanDir = CSL_DMA_WRITE;
dmaConfig.trfType = CSL_DMA_TRANSFER_IO_MEMORY;
dmaConfig.dataLen = 4;
dmaConfig.srcAddr = (Uint32)i2sDmaWriteRightBuff;
dmaConfig.destAddr = (Uint32)(0x280C);
dmaRightTxHandle = CSL_configDmaForI2s(CSL_DMA_CHAN1);
if(dmaRightTxHandle == NULL)
{
printf("DMA Config for I2S Write Failed!\n!");
return(CSL_TEST_FAILED);
}

I2S_transEnable(hI2s, TRUE);

status = DMA_start(dmaRightTxHandle);
if(status != CSL_SOK)
{
printf("I2S Dma Write Failed!!\n");
return(result);
}
while(DMA_getStatus(dmaRightTxHandle));

/* Configure DMA channel for I2S2 Left Read */
#if (defined(CHIP_C5505_C5515) || defined(CHIP_C5504_C5514) || defined(CHIP_C5517) || defined(CHIP_C5535) || defined(CHIP_C5545))
dmaConfig.pingPongMode = CSL_DMA_PING_PONG_DISABLE;
#endif
dmaConfig.autoMode = CSL_DMA_AUTORELOAD_DISABLE;
dmaConfig.burstLen = CSL_DMA_TXBURST_1WORD;
dmaConfig.trigger = CSL_DMA_EVENT_TRIGGER;
dmaConfig.dmaEvt = CSL_DMA_EVT_I2S2_RX;
dmaConfig.dmaInt = CSL_DMA_INTERRUPT_DISABLE;
dmaConfig.chanDir = CSL_DMA_READ;
dmaConfig.trfType = CSL_DMA_TRANSFER_IO_MEMORY;
dmaConfig.dataLen = 4;
dmaConfig.srcAddr = (Uint32)(0x2A28);
dmaConfig.destAddr = (Uint32)i2sDmaWriteLeftBuff;
dmaLeftRxHandle = CSL_configDmaForI2s(CSL_DMA_CHAN4);
if(dmaLeftRxHandle == NULL)
{
printf("DMA Config for I2S Read Failed!\n!");
return(CSL_TEST_FAILED);
}

I2S_transEnable(hI2s2, TRUE);

status = DMA_start(dmaLeftRxHandle);
if(status != CSL_SOK)
{
printf("I2S Dma Read Failed!!\n");
return(result);
}
while(DMA_getStatus(dmaLeftRxHandle));

/* Configure DMA channel for I2S Right Read */
#if (defined(CHIP_C5505_C5515) || defined(CHIP_C5504_C5514) || defined(CHIP_C5517) || defined(CHIP_C5535) || defined(CHIP_C5545))
dmaConfig.pingPongMode = CSL_DMA_PING_PONG_DISABLE;
#endif
dmaConfig.autoMode = CSL_DMA_AUTORELOAD_DISABLE;
dmaConfig.burstLen = CSL_DMA_TXBURST_1WORD;
dmaConfig.trigger = CSL_DMA_EVENT_TRIGGER;
dmaConfig.dmaEvt = CSL_DMA_EVT_I2S2_RX;
dmaConfig.dmaInt = CSL_DMA_INTERRUPT_DISABLE;
dmaConfig.chanDir = CSL_DMA_READ;
dmaConfig.trfType = CSL_DMA_TRANSFER_IO_MEMORY;
dmaConfig.dataLen = 4;
dmaConfig.srcAddr = (Uint32)(0x2A2C);
dmaConfig.destAddr = (Uint32)i2sDmaWriteRightBuff;
dmaRightRxHandle = CSL_configDmaForI2s(CSL_DMA_CHAN5);
if(dmaRightRxHandle == NULL)
{
printf("DMA Config for I2S Read Failed!\n!");
return(CSL_TEST_FAILED);
}

I2S_transEnable(hI2s2, TRUE);

status = DMA_start(dmaRightRxHandle);
if(status != CSL_SOK)
{
printf("I2S Dma Read Failed!!\n");
return(result);
}
while(DMA_getStatus(dmaRightRxHandle));

Thanks!

  • 请问不用dma传输时,I2S2 能正确读取digital mic的音频信号吗?
  • 如何确定能不能读取到digital mic的音频信号
  • 在dma搬数据之前,看一下I2S2 Receive Left/Right Data Register寄存器里的数据是否也为0?
  • I2S2 Receive Left/Right Data Register寄存器里面的数据确实为0,我的I2S2和I2S0设置是一样的,请帮忙看看,代码如下:

    /** Open the device with instance 0							*/
    	hI2s = I2S_open(I2S_INSTANCE0, DMA_POLLED, I2S_CHAN_STEREO);
    	if(NULL == hI2s)
    	{
    		status = CSL_TEST_FAILED;
    		return (status);
    	}
    	else
    	{
    		printf ("I2S Module Instance opened successfully\n");
    	}
    
    	hI2s2 = I2S_open(I2S_INSTANCE2, DMA_POLLED, I2S_CHAN_STEREO);
    	if(NULL == hI2s2)
    	{
    		status = CSL_TEST_FAILED;
    		return (status);
    	}
    	else
    	{
    		printf ("I2S Module Instance opened successfully\n");
    	}
    /** Set the value for the configure structure				*/
    	hwConfig.dataType 			= I2S_STEREO_ENABLE;
    	hwConfig.loopBackMode 		= I2S_LOOPBACK_ENABLE;
    	hwConfig.fsPol 				= I2S_FSPOL_LOW;
    	hwConfig.clkPol				= I2S_FALLING_EDGE;
    	hwConfig.datadelay			= I2S_DATADELAY_ONEBIT;
    	hwConfig.datapack			= I2S_DATAPACK_ENABLE;
    	hwConfig.signext			= I2S_SIGNEXT_DISABLE;
    	hwConfig.wordLen			= I2S_WORDLEN_16;
    	hwConfig.i2sMode			= I2S_MASTER;
    	hwConfig.clkDiv				= I2S_CLKDIV128;
    	hwConfig.fsDiv				= I2S_FSDIV32;
    	hwConfig.FError				= I2S_FSERROR_DISABLE;
    	hwConfig.OuError			= I2S_OUERROR_DISABLE;
    
    	/** Configure hardware registers							*/
    	result = I2S_setup(hI2s, &hwConfig);
    	if(result != CSL_SOK)
    	{
    		status = CSL_TEST_FAILED;
    		return (status);
    	}
    	else
    	{
    		printf ("I2S Module Configured successfully\n");
    	}
    
    	result = I2S_setup(hI2s2, &hwConfig);
    	if(result != CSL_SOK)
    	{
    		status = CSL_TEST_FAILED;
    		return (status);
    	}
    	else
    	{
    		printf ("I2S Module Configured successfully\n");
    	}

  • Dear TI:
    能看出设置哪里有问题吗

    Thanks!
  • Dear TI:
    我在传输mic数据的时候使用到4组DMA(0,1,4,5),仿真的时候我发现只在最后一组设置的DMA寄存器中有值,其余的仿真过程中有值之后就没有值了,4组DMA没法同时工作吗?或者轮询工作也可以;

    Thanks!
  • dma channel是独立的,可以同时工作。