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, ¶m);
// 2. setup ping PaRAM set (to be reloaded later)
drvEdma_writePaRAM(EDMA_RCVPING, ¶m);
// 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, ¶m);
}
发送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, ¶m);
// 2. setup ping PaRAM set (to be reloaded later)
drvEdma_writePaRAM(EDMA_XMTPING, ¶m);
// 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, ¶m);
}
