在我们自己开发的板子上出现标题所述现象,于是换6657开发板尝试,发现出现了同样的现象。
问题描述:
0、使用McBSP发送数据(暂时未连接接收数据的DSP),通过控制开发板上的LED灯来指示BOOT后McBSP是否在不停的发送数据。main()函数如下所示:
void main()
{
int i, c = 0, d = 3, v;
(void) platform_led(0, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);
(void) platform_led(1, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);
(void) platform_led(2, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);
(void) platform_led(3, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);
while(1)
{
// Initial the McBSP registers
EDMAInit_McBSP();
McBSP_intc_setup();
mcbsp_init(McBSP_TO_DSP2,199,1);
RESET_BIT(McBSP_SPCR(McBSP_TO_DSP2), FRST);
RESET_BIT(McBSP_SPCR(McBSP_TO_DSP2), GRST);
RESET_BIT(McBSP_SPCR(McBSP_TO_DSP2), XRST);
for(i = 0; i < BUFFER_SIZE; ++i)
McBSP_src[i] = i;
/* add algorithm here */
for(i = 0; i < 500000; ++i);
SET_BIT(McBSP_SPCR(McBSP_TO_DSP2), FRST);
SET_BIT(McBSP_SPCR(McBSP_TO_DSP2), GRST);
SET_BIT(McBSP_SPCR(McBSP_TO_DSP2), XRST);
while(!(SendFlag == 1));
SendFlag = 0;
RESET_BIT(McBSP_SPCR(McBSP_TO_DSP2), XRST);
v = c;
(void) platform_led(v, PLATFORM_LED_ON, PLATFORM_USER_LED_CLASS);
for(i = 0; i < 500000; ++i);
(void) platform_led(v, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);
++c;
--d;
if(c == 4)
c = 0;
if(d == -1)
d = 3;
}
}
1、上电后第一次在线调试LED灯正常,McBSP不停的发送数据,程序正常运行;
2、CCS中停止程序,重新debug,重复2到3次后程序卡死在循环等待发送成功标志的语句(经测试,可以进入EDMA中断,即无法读取到IPRH发送成功标志位处),代码如下所示:
void EDMA_isr()
{
......
if(GET_BIT(IPRH,McBSPx_EDMA_Ch[McBSP_TO_DSP2]-32)) //发送给DSP2的处理结果
{
REG_WRITE(ICRH,1<<5);
SendFlag = 1;
}
......
}
3、使用SPI直接BOOT,无法看到LED闪烁,链接板子,可以看到代码停止到循环等待发送成功标志的语句,与2中所述现象相同;
4、BOOT程序停止在循环等待发送成功标志的语句后,重新对程序进行在线调试,程序仍然停止在循环等待发送成功标志的语句,与上述现象相同;
5、每次程序停止在循环等待发送成功标志的语句后,再次在线debug工程,McBSP均无法发送数据,与上述程序相同,使用CCS的SYSTEM RESET后,重新Load Program,首次在线调试LED灯正常,McBSP不停的发送数据,程序正常运行,后续现象同2。
希望论坛的高手和工作人员可以指点迷津。。谢谢了!
附,McBSP的发送通道EDMA配置:
myParamSetupMcBSP0Trans.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \ CSL_EDMA3_TCCH_DIS, \ CSL_EDMA3_ITCINT_EN, \ CSL_EDMA3_TCINT_EN,\ CSL_EDMA3CC2_XEVT0_MCBSP_A,\ CSL_EDMA3_TCC_NORMAL,\ CSL_EDMA3_FIFOWIDTH_NONE, \ CSL_EDMA3_STATIC_DIS, \ CSL_EDMA3_SYNC_A, \ CSL_EDMA3_ADDRMODE_INCR, \ CSL_EDMA3_ADDRMODE_INCR);