TI工程师,您好!
最近在调试c6747的板子,使用McASP0接口与codec芯片(AD73311)进行通信。
codec芯片需要一个外部时钟源,由AHCLKX提供,频率为3M。收发通信时的串口时钟均由codec芯片提供,因此ACLKR及ACLKX均设置为外部时钟。通信模式设置为burst,利用中断对传输数据进行处理。
目前仅调试数据发送功能,根据手册编制的McASP初始化程序如下:
// 1. Reset McASP to default values
mcasp->regs->GBLCTL = 0; // reset
mcasp->regs->RGBLCTL = 0; // reset RX
mcasp->regs->XGBLCTL = 0; // reset TX
// 2. Configure McASP Audio FIFO
// MCASP0_WFIFOCTL = 0x00001008; //8 transmiter, 8 words FIFO
// MCASP0_WFIFOCTL = 0x00011008; //enable it
// MCASP0_RFIFOCTL = 0x00001008; //8 receiver, 8 words FIFO
// MCASP0_RFIFOCTL = 0x00011008; //enable it
// 3. Configure all McASP registers except GBLCTL
// (a) Receive registers
// (b) Transmit registers
mcasp->regs->XMASK = 0xFFFFFFFF; // no padding used
mcasp->regs->XFMT = 0x00018078; // 1-bit delay, MSB, 16-bits slot, Reads on the peripheral configuration port
mcasp->regs->AFSXCTL = 0x00000000; // burst, 1-bit frame sync width, external frame sync, rising edge
mcasp->regs->ACLKXCTL = 0x000000C0; // falling edge, external CLK, asynchronous clk
mcasp->regs->AHCLKXCTL = 0x00008007; // int CLK, 24MHz AUXCLK div by 8
mcasp->regs->XTDM = 0x00000001; // slots0 active
mcasp->regs->XINTCTL = 0x00000020; // set interrupt
mcasp->regs->XCLKCHK = 0x00FF0003;
// (c) Serializer registers
MCASP0_SRCTL0 = 0x0001; // MCASP0.AXR0[0] --> SDI1
// (d) Global registers
mcasp->regs->PFUNC = 0x00000000; // all McASP;
mcasp->regs->PDIR = 0x08000001; // input: AFSR, AFSX, ACLKR, ACLKX, AXR1
// output: AHCLKX, AXR0
mcasp->regs->DLBCTL = 0x00000000; // loop back not used
// 4. Start AHCLKX
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
// 5. Start ACLKX and ACLKR
Led3(0);
// 6. Setup data acquisition as required
mcasp_interrupt_init();
// 7. Activate serializers
mcasp->regs->XSTAT = 0x0000FFFF; // Clear all
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; // transmitter
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
// 8. Verify that all transmit buffers are serviced
// 9. Release state machines from reset
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
// 10. Release frame sync generators from reset.
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; // transmitter
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
中断函数如下:
void mcasp_interrupt_init()
{
CSL_FINS(intcRegs->INTMUX2, INTC_INTMUX2_INTSEL8, MCASP_INT); // map event McASP_INT to int8
ISTP = (unsigned int)intcVectorTable; // set ISTP to point to the vector table address
ICR = 0xFFFF; // clear all interrupts, bits 4 thru 15
IER = 0x00000102; // Enable interrupt 8
_enable_interrupts();
}
interrupt void mcasp_interrupt()
{
int i;
int_num += 1;
mcasp->regs->XBUF0 = 0xFFFF;
mcasp->regs->XSTAT = 0xFFFF;
for(i=0;i<100;i++) {;}
}
在McASP初始化中第5步是为了使用GPIO给codec使能信号,该信号发出后,codec的串口时钟(375kHz)、帧同步信号(23.43kHz)均正常。
但程序运行时仅能在第7步完成后进入1次中断服务程序,后面均无法进入中断,请问这可能是什么问题?
非常感谢!