主题中讨论的其他器件:TLV320AIC29、 OMAPL138
您好!
我正在使用 OMAPL138-C6748处理器通过 外设配置总线通过 EDMA 完成数据传输。 McASP 以 tlv320aic29作为主器件完成数据传输、EDMA 使用 AB 同步传输。 系统 在开始时正常运行、但随着时间的增加(可能在两天之后)、系统运行异常、在 XSTAT 寄存 器中出现欠运转错误(XUNDRn 位= 1、而 XDATA 位= 1)。 此时 EDMA 不再传输数据、CCNT 寄存器既不是最大计数也不是零。 MCASP 的接收部分仍然正常工作。 MCASP 的初始配置如下所示: 是否有人可以提供帮助?
//重置 McASP。
mcasp0regs->GBLCTL = 0;
//配置接收寄存器。
mcasp0regs->RMASK = 0x0000FFFF;
mcasp0regs->RFMT = 0x00018078;
mcasp0regs->AFSRCTL = 0x00000102;
mcasp0regs->ACLKRCTL=0x00000029 ;
mcasp0regs->AHCLKRCTL = 0x00008004;
mcasp0regs->RTDM = 0x00000001;
mcasp0regs->RCLKCHK = 0x00FF0008;
mcasp0regs->REVTCTL = 0x00000000;
//配置发送寄存器。
mcasp0regs->XMASK = 0x0000FFFF;
mcasp0regs->XFMT = 0x0001807C;//1位延迟;MSB 优先;时隙大小为16位;向右旋转16位位置。
mcasp0regs->AFSXCTL = 0x00000102;/2槽 TDM (I2S 模式)、单位、内部生成的发送帧同步、发送帧同步的上升沿(AFSX)指示帧的开始
mcasp0regs->ACLKXCTL = 0x00000029;//上升沿、单个位、来自可编程位时钟分频器输出的内部发送时钟源(CLKXDIV=0x09)
mcasp0regs->AHCLKXCTL = 0x00008004;//内部发送高频时钟源(HCLKXDIV=0x04)
mcasp0regs->XTDM = 0x00000003;//时隙0、1
mcasp0regs->RCLKCHK = 0x00FF0008;
mcasp0regs->XEVTCTL = 0x00000000;//发送数据 DMA 请求被启用。
//配置串行器(14= xmit、15= rcv)。
mcasp0regs->SRCTL14 = 0x00000001;
mcasp0regs->SRCTL15 = 0x00000002;
//配置引脚功能和方向。
mcasp0regs->PFUNC = 0;
mcasp0regs->Pdir = 0x1C004000;
mcasp0regs->DITCTL = 0x00000000;
mcasp0regs->DLBCTL = 0x00000000;
mcasp0regs->AMUTE = 0x00000000;
while ((0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_XHCLKRST_MASK)||(0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_RHCLKRST_MASK)))))
{
mcasp0regs->GBLCTL ||((CSL_MCASP_GBLCTL_XHCLKRST_ACTIVE)<CSL_MCASP_GBLCTL_XHCLKRST_SHIFT) | (CSL_MCASP_GBLCTL_RHCLKRST_ACTIVE<<CSL_MCASP_GBLCTL_RHCLKRST_SHIFT));
}
while ((0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_XCLKRST_MASK)||(0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_RCLKRST_MASK)))))
{
mcasp0regs->GBLCTL |=((CSL_MCASP_GBLCTL_XCLKRST_ACTIVE)<<CSL_MCASP_GBLCTL_XCLKRST_SHIFT) | (CSL_MCASP_GBLCTL_RCLKRST_ACTIVE<<CSL_MCASP_GBLCTL_RCLKRST_SHIFT));
}
//启用发送和/或接收中断
IER |= 0x4000;
edma_mcasp0rx_set();
eDMA_mcasp0tx_set();
//清除相应的发送器和接收器状态寄存器
mcasp0regs->RSTAT=0x0000FFFF;
Task_delay();
mcasp0regs->XSTAT=0x0000FFFF;
//使各自的串行器脱离复位状态
while ((0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_XSRCLR_MASK)||(0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_RSRCLR_MASK))))
{
mcasp0regs->GBLCTL |=((CSL_MCASP_GBLCTL_XSRCLR_ACTIVE)<<CSL_MCASP_GBLCTL_XSRCLR_SHIFT) | (CSL_MCASP_GBLCTL_RSRCLR_ACTIVE<<CSL_MCASP_GBLCTL_RSRCLR_SHIFT));
}
while ((0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_XSMRST_MASK)||(0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_RSMRST_MASK)))))
{
mcasp0regs->GBLCTL |=((CSL_MCASP_GBLCTL_XSMRST_ACTIVE)<<CSL_MCASP_GBLCTL_XSMRST_SHIFT) | (CSL_MCASP_GBLCTL_RSMRST_ACTIVE<<CSL_MCASP_GBLCTL_RSMRST_SHIFT));
}
//使相应的帧同步发生器脱离复位状态
while ((0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_XFRST_MASK)||(0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_RFRST_MASK))))
{
mcasp0regs->GBLCTL |=((CSL_MCASP_GBLCTL_XFRST_ACTIVE)<<CSL_MCASP_GBLCTL_XFRST_SHIFT) | (CSL_MCASP_GBLCTL_RFRST_ACTIVE<<CSL_MCASP_GBLCTL_RFRST_SHIFT));
}
