TI工程师,你好:
我最近在调试c6748的板子,使用mcasp与编解码芯片wm8731进行通信。
wm8731设置成从设备,发送数据。c6748设置成主设备,接收数据。mcasp的配置如下:
void McASPInit(void)
{
//复位
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
HWREG(SOC_MCASP_0_CTRL_REGS + MCASP_GBLCTL) = 0;
//帧同步 0x02:2-slot(I2S)
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 0x02, MCASP_RX_FS_WIDTH_WORD,
MCASP_RX_FS_INT_BEGIN_ON_FALL_EDGE);
//设置时钟源以及分频。 7,表示ACLKRCTL的时钟分频;7,表示AHCLKRCTL的时钟分频
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_INTERNAL, 7, 0);
//设置时钟极性
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
McASPRxHFClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_HI_FREQ_CLK_NO_INVERT);
//AFSRCTL 设置2-slot(I2S),这里也设置2个slot
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, 0x3);
//AXR15做为接收。
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, 15);
//AFSR 接收帧同步,AFSX 发送帧同步; AXR15 接收数据线。7 发送数据线;ACLKR 发送时钟, ACLKX 接收时钟。
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSR | MCASP_PIN_AFSX |
MCASP_PIN_ACLKR | MCASP_PIN_ACLKX | MCASP_PIN_AXR(15) | MCASP_PIN_AXR(7));
//时钟,帧同步,发送数据线设置为输出
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSR | MCASP_PIN_AFSX |
MCASP_PIN_ACLKX | MCASP_PIN_AXR(7) | MCASP_PIN_ACLKR );
//接收数据线设置为输入
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AXR(15));
//中断:接收开始,接收时钟错误,接收同步错误,接收溢出
McASPRxIntDisable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_STARTOFFRAME | MCASP_RX_DATAREADY |
MCASP_RX_LASTSLOT | MCASP_RX_DMAERROR | MCASP_RX_CLKFAIL | MCASP_RX_SYNCERROR | MCASP_RX_OVERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DATAREADY);
//运行时钟,高频时钟
HWREG(SOC_MCASP_0_CTRL_REGS + MCASP_RGBLCTL) |= MCASP_RGBLCTL_RCLKRST | MCASP_RGBLCTL_RHCLKRST;
while((HWREG(SOC_MCASP_0_CTRL_REGS + MCASP_RGBLCTL) & (MCASP_RGBLCTL_RCLKRST | MCASP_RGBLCTL_RHCLKRST))
!= (MCASP_RGBLCTL_RCLKRST | MCASP_RGBLCTL_RHCLKRST)) ;
//激活serializers
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
HWREG(SOC_MCASP_0_CTRL_REGS + MCASP_RSTAT) = 0xFFFF;
HWREG(SOC_MCASP_0_CTRL_REGS + MCASP_RGBLCTL) |= MCASP_RGBLCTL_RSRCLR;
while((HWREG(SOC_MCASP_0_CTRL_REGS + MCASP_RGBLCTL) & MCASP_RGBLCTL_RSRCLR)
!= MCASP_RGBLCTL_RSRCLR);
//激活状态机
HWREG(SOC_MCASP_0_CTRL_REGS + MCASP_RGBLCTL) |= MCASP_GBLCTL_RSMRST;
while((HWREG(SOC_MCASP_0_CTRL_REGS + MCASP_RGBLCTL) & MCASP_GBLCTL_RSMRST)
!= MCASP_GBLCTL_RSMRST) ;
//激活帧同步产生器
HWREG(SOC_MCASP_0_CTRL_REGS + MCASP_RGBLCTL) |= MCASP_GBLCTL_RFRST;
while((HWREG(SOC_MCASP_0_CTRL_REGS + MCASP_RGBLCTL) & MCASP_GBLCTL_RFRST)
!= MCASP_GBLCTL_RFRST) ;
}
中断处理函数中读取状态寄存器,一直是0x179或者0x171,一直存在溢出错误。这可能是什么原因导致的?
非常感谢。
Shine:
请问digital loopback内部模式能成功接收吗?
feng li13:
回复 Shine:
lookback模式下,发送中断状态显示没有错误,接收中断状态还是不变。没有接收到数据。接收部分设置的不正确吗?
Shine:
回复 feng li13:
检查接收部分的配置。
Tony Tang:
用中断来做没多大意义,用EDMA+McASP FIFO来做吧。