在我们自己开发的板子上出现标题所述现象,于是换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);
Jane Lu:
Xu,
出问题时候,能在EDMA中断中看一下IPRH和IPR的值吗?看一下是否是其他事件触发了EDMA 中断? 另外,EDMA,MCBSP, Int的初始化代码中有没有先把事件寄存器,错误寄存器等清零? 论坛上K1 STK软件包的KeyStone_common.c文件中有EDMA的初始化例子可以参考。 您可以把串口的初始化代码发上来我们检查一下。
skysteed:
你好 能否分享下你的mcbsp例程?谢了!邮箱43854061@qq.com