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!