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.

TMS320C6748: MCASP使用EDMA3传输音频, 无法产生EDMA中断

Part Number: TMS320C6748


Hi:

     当我使用C6748处理音频时, 遇到edma无法产生中断的问题。

问题1: 外围设备到DDR, 是否只能用A同步方式传输?

问题2: 依据手册, 已经对了很多次, 没有发现问题, EDMA3 如何进行调试 ?

硬件连接

外围ADC 以8slots TDM格式传输音频到C6748 。

C6748输出8slots TDM 给到外围DAC 。

MCASP设置

主时钟, FS 48K, bit clock12.288 M, 32bits位宽。

AXR1 作为TDM输入, AXR5作为TDM输出。

实际测量时钟正确。

EDMA配置: edma从MCASP 读写数据   , 尝试过两种传输方式, 都不能成功

acount = 4Bytes per sample  ,

bcount = 8 Slots, 

ccount = 192 samples per frame

A同步传输方式 :无法产生EDMA中断

srcBIndex:0                  dstBIndex: cCount*aCount 

srcCIndex:   0                 dstCIndex: aCount

AB同步传输方式:可以产生接收中断, 但是频类不正确, 无法产生发送中断

srcBIndex:0                  dstBIndex: cCount*aCount 

srcCIndex:   0                 dstCIndex: aCount-(bCount-1)*aCount*cCount

接收DMA

static void setup_edma_pingpong_rcv(void *src,
void *dst_ping, void *dst_pong,
uint32_t bytesPerSample,
uint32_t chanNum,
uint32_t samplePerFrame)
{
CSL_Edma3ccParamSetRegs param;
//DstBIDX ACount*CCount
uint32_t aCount = bytesPerSample;
uint32_t bCount = chanNum;
uint32_t cCount = samplePerFrame;

uint32_t srcBIdx = 0;//aCount;
uint32_t dstBIdx = cCount*aCount;
uint32_t srcCIdx = 0;//bCount*aCount;
uint32_t dstCIdx = aCount-(bCount-1)*aCount*cCount;

printf("[EDMA SET RCV]: a:%d b:%d c:%d \r\n", aCount, bCount, cCount);
param.OPT = (EDMA_RCV_PING_TCC << 12) | (1 << 20) | (1<<2) ; // transfer complete interrupt enabled
printf("[EDMA XMT]: opt:%x\r\n", param.OPT);
param.SRC = EDMA_MCASP_ADDR;//(Uint32)src;//
param.A_B_CNT = (bCount << 16) | (aCount); // actual format: BCNT|ACNT
param.DST = (uint32_t)dst_ping;
param.SRC_DST_BIDX = (dstBIdx << 16) | srcBIdx; // actual format: DSTBIDX|SCRBIDX
param.LINK_BCNTRLD = (bCount << 16) | (EDMA_RCVPONG * 0x20); // actual format: BCNTRLD|LINK
param.SRC_DST_CIDX = ((dstCIdx << 16) & 0xFFFF0000) | dstCIdx; // actual format: DSTCIDX|SRCCIDX
param.CCNT = cCount;
drvEdma_writePaRAM(EDMA_MCASPRXCH, &param);

// 2. setup ping PaRAM set (to be reloaded later)
drvEdma_writePaRAM(EDMA_RCVPING, &param);

// 3. setup pong PaRAM set (to be loaded and reloaded later)
param.OPT = (EDMA_RCV_PONG_TCC << 12) | (1 << 20) ; // transfer complete interrupt enabled
param.SRC_DST_BIDX = (dstBIdx << 16) | srcBIdx; // actual format: DSTBIDX|SCRBIDX
param.LINK_BCNTRLD = (bCount << 16) | (EDMA_RCVPING * 0x20); // actual format: BCNTRLD|LINK
param.SRC_DST_CIDX = ((dstCIdx << 16) & 0xFFFF0000) | 0;//srcCIdx; // actual format: DSTCIDX|SRCCIDX
param.DST = (uint32_t)dst_pong;
drvEdma_writePaRAM(EDMA_RCVPONG, &param);
}

发送DMA: 

static void setup_edma_pingpong_xmt(void *src_ping, void *src_pong,
void *dst,
uint32_t bytesPerSample,
uint32_t chanNum,
uint32_t samplePerFrame)
{
CSL_Edma3ccParamSetRegs param;

uint32_t aCount = bytesPerSample;
uint32_t bCount = samplePerFrame;
uint32_t cCount = chanNum;

uint32_t srcBIdx = bCount*aCount;
uint32_t dstBIdx = 0;//aCount;
uint32_t srcCIdx = aCount-(cCount-1)*srcBIdx;
uint32_t dstCIdx = 0;//bCount*aCount;

printf("[EDMA SET XMT]: a:%d b:%d c:%d \r\n", aCount, bCount, cCount);

// 1. setup channel PaRAM slot
param.OPT = (EDMA_XMT_PING_TCC << 12) | (1 << 20) ; // transfer complete interrupt enabled
printf("[EDMA XMT]: opt:%x\r\n", param.OPT);
param.SRC = (uint32_t)src_ping;
param.A_B_CNT = (bCount << 16) | aCount; // actual format: BCNT|ACNT
param.DST = EDMA_MCASP_ADDR;//(Uint32)dst;//
param.SRC_DST_BIDX = (dstBIdx << 16) | srcBIdx; // actual format: DSTBIDX|SCRBIDX
param.LINK_BCNTRLD = (bCount << 16) | (EDMA_XMTPONG * 0x20); // actual format: BCNTRLD|LINK
param.SRC_DST_CIDX = (dstCIdx << 16) | (srcCIdx & 0x0000FFFF); // actual format: DSTCIDX|SRCCIDX
param.CCNT = cCount;
drvEdma_writePaRAM(EDMA_MCASPTXCH, &param);

// 2. setup ping PaRAM set (to be reloaded later)
drvEdma_writePaRAM(EDMA_XMTPING, &param);

// 3. setup pong PaRAM set (to be loaded and reloaded later)
param.OPT = (EDMA_XMT_PONG_TCC << 12) | (1 << 20) ; // transfer complete interrupt enabled
param.SRC_DST_BIDX = (dstBIdx << 16) | srcBIdx; // actual format: DSTBIDX|SCRBIDX
param.LINK_BCNTRLD = (bCount << 16) | (EDMA_XMTPING * 0x20); // actual format: BCNTRLD|LINK
param.SRC_DST_CIDX = (dstCIdx << 16) | (srcCIdx & 0x0000FFFF); // actual format: DSTCIDX|SRCCIDX
param.SRC = (uint32_t)src_pong;
drvEdma_writePaRAM(EDMA_XMTPONG, &param);
}