目前 EDMA3 传输完成中断已经使能,IER寄存器已经是0x00000004,中断初始化已经打开,在相同条件下定时器中断可以进行,EDMA3中断已经映射到INT4,添加到事件,当程序运行时EDMA3的IPR寄存器已经置位0x00000004,但是就是不能进入中断服务函数,求大神帮忙了,具体的配置如下:
int main(void)
{
// 外设使能配置
PSCInit();
// Set_Core_456MHz(); //调试ADC、DAC时将CPU始终屏蔽,因为仿真器仿真始终会出现错误
// Set_DDR_156MHz();
GPIOBankPinMuxSet(); // GPIO 管脚复用配置
GPIOBankPinInit(); // GPIO 管脚初始化
DEVICE_DDR_Init();
InterruptInit();
EventCombineInterruptInit();
McBSP0Init(); //CLKX0:4.8 MHZ FSX0:96KHZ
McBSP1Init(); //CLKX1:6.0 MHZ FSX1:80KHZ
MCBSP0_ReceiveData(tccNum, chNum, AUDIO_DATA0);
GPIOPinWrite(SOC_GPIO_0_REGS, LED1_ADC_Sample, GPIO_PIN_HIGH);
GPIOPinWrite(SOC_GPIO_0_REGS, DAC_LDAC, GPIO_PIN_HIGH);
GPIOPinWrite(SOC_GPIO_0_REGS, OPA334_ENABLE, GPIO_PIN_HIGH);
while(1);
}
void InterruptInit(void)
{
// 初始化 DSP 中断控制器
IntDSPINTCInit();
// 使能 DSP 全局中断
IntGlobalEnable();
}
void EventCombineInterruptInit(void)
{
// EDMA3DisableEvtIntr(SOC_EDMA30CC_0_REGS,chNum); //OK
EDMA3EnableEvtIntr(SOC_EDMA30CC_0_REGS,chNum); //OK
// 传输完成中断
IntEventCombineInit(C674X_MASK_INT4, C674X_MASK_INT15, ECM2_UNUSED, ECM3_UNUSED); //OK
// 注册中断服务函数
IntEventCombineRegister(SYS_INT_EDMA3_0_CC0_INT1,EDMA3_CHANNEL0_ISR);
IntEventCombineAdd(SYS_INT_EDMA3_0_CC0_INT1);
// 使能 定时器 / 计数器 中断
TimerIntEnable(SOC_TMR_1_REGS, TMR_INT_TMR34_NON_CAPT_MODE);
IntEventCombineRegister(SYS_INT_T64P1_TINT34, TimerIsr);
IntEventCombineAdd(SYS_INT_T64P1_TINT34);
}
void EDMA3_CHANNEL0_ISR()
{
EDMA3ClrIntr(SOC_EDMA30CC_0_REGS, chNum);
// IntEventClear(SYS_INT_EDMA3_0_CC0_INT1);
GPIOPinWrite(SOC_GPIO_0_REGS, LED1_ADC_Sample, GPIO_PIN_LOW);
// MCBSP0_ReceiveData(tccNum, chNum, AUDIO_DATA1);
}
void MCBSP0_ReceiveData(unsigned int tccNum, unsigned int chNum, unsigned long *dest_buffer)
{
EDMA3CCPaRAMEntry paramSet;
unsigned int acnt = 4; // 一维 DRR 4:32位数据 2:16位数据
unsigned int bcnt = AMOUNT_DATA_FRAME; // 二维 AMOUNT_DATA_FRAME=24552 采样 点的个数
unsigned int ccnt = 1; // 三维
// 申请 EDMA3 通道
EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, chType, chNum, tccNum, evtQ);
// 配置参数 RAM
// paramSet.srcAddr = (unsigned int)src_buffer; // SOC_MCBSP_0_CTRL_REGS+0;
paramSet.srcAddr = SOC_MCBSP_0_CTRL_REGS+0;
paramSet.destAddr = (unsigned int)dest_buffer;
paramSet.aCnt = (unsigned short)acnt;
paramSet.bCnt = (unsigned short)bcnt;
paramSet.cCnt = (unsigned short)ccnt;
// 设置 SRC / DES 索引
paramSet.srcBIdx = (short)0u; // DRR不动
paramSet.destBIdx = (short)4u; //4: 4个字节=1个long
// A Sync 传输模式(一维传输模式)
paramSet.srcCIdx = (short)0u;
paramSet.destCIdx = (short)0u; //待定AMOUNT_DATA_FRAME
paramSet.linkAddr = (unsigned short)0xFFFFu; //链接到当前Param集
paramSet.bCntReload = (unsigned short)0u;
paramSet.opt = 0u;
// Src 及 Dest 使用自增(INCR)模式
paramSet.opt &= 0xFFFFFFFCu;
// 配置 TCC
paramSet.opt |= ((tccNum << EDMA3CC_OPT_TCC_SHIFT)|EDMA3CC_OPT_ITCINTEN|EDMA3CC_OPT_TCINTEN);
// 写参数 RAM
EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, chNum, ¶mSet);
// 使能传输
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, chNum, trigMode);
}
Tony Tang:
检查一下EDMA的region的配置。
HUI PEI:
请问您的问题解决了吗?是在哪里没设置好么,我现在遇到差不多同样的问题
Tong xie:
回复 Tony Tang:
请问有关于region 配置的详细问题吗,我也遇到了相似的问题。中断函数进不去,但是IPR相关位却置1
Tony Tang:
回复 Tong xie:
Tong xie中断函数进不去,但是IPR相关位却置1
这就是region的配置不对。请阅读TRM里的EDMA章节。
Tong xie:
回复 Tony Tang:
请问 region的配置是怎么回事。我也遇到了一样的问题,IPR置位,但是中断函数进不去。IPR置位是不是说明中断发生了
Tong xie:
请问您的问题怎么解决的。我也遇到了一样的问题
Tony Tang:
回复 Tong xie:
先看datasheet4的Table 6-6, C6748 DSP interrupts这个事件表, 8号和91号都是EDMA的中断事件。说明里写的是shadow Region1的完成中断,意思是说要在shadow region配置这个EDMA才能产生这个中断事件,从global region产生的中断是没有中断事件号的。
如果要产生中断,必须是shadow region的IPR置位才会产生下面8或91号中断事件。
8 EDMA3_0_CC0_INT1 EDMA3_0 Channel Controller 0 Shadow Region 1 Transfer Completion Interrupt
91 EDMA3_1_CC0_INT1 EDMA3_1 Channel Controller 0 Shadow Region 1 Transfer Completion Interrupt
再看TRM手册的EDMA章节16,寄存器分为Global channel Register和Shadow Region Channel,寄存器名都是一样的。下图是截取了一部分示意。
至于Shadow region是什么意思,先看看16.2.7.1和16.2.7.2,有具体的疑问再讨论。
Tong xie:
回复 Tony Tang:
datasheet4,C6748 DSP interrupts事件表。没找到这个文档,求下载链接
Tony Tang:
回复 Tong xie:
你在用C6748,没有看过C6748的手册?
实在不知道怎么找TI的文档资料的话就上www.ti.com,搜索相应的芯片型号,比如C6748.
Tony Tang:
回复 Tong xie:
然后选择相应的器件进入产品网页,所有与该芯片相关的资料都在这了: