由于国庆节假期,帖子审批以及工程师回复将会有所延迟,敬请谅解

This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2640R2F: 在5x5芯片装的自定义板上使用芯片内部32kHz RCOSC后,调试simple_peripheral进入死循环

Part Number: CC2640R2F

TI工程师们好!我这边使用的是CC2640R2F 5X5 RHB封装的芯片、自己设计的板子,板子上没有32kHz外部晶振,准备使用芯片内部32kHz振荡器。

我使用的IDE是IAR,程序为simple_peripheral。根据板子的原理图,已经修改了board file。

由于没有32kHz外部晶振,我根据TI官方手册,预定义了USE_RCOSC,将ccfg_app_ble.c exclude后,include了ccfg_app_ble_rcosc.c、rcosc_calibration.c与rcosc_calibration.h,同时将rcosc的目录添加到了include目录中。

具体见下:

随后在debug中进入了死循环,定位在PowerCC26XX_RCOSC_clockFunc函数中

CTL0寄存器的最低四位是1011,根据TRM手册查阅寄存器定义,板子已经启用了Low frequency RCOSC。现在程序一直在这三行中不断循环,猜测可能是进入了error中的while(1),且猜测和RCOSC的校准有关。

请问一下如何解决这个问题,谢谢!

  • 您好我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 经过多方考虑和尝试,现在已经解决了问题,板子可以正常进行例程以及外设相关的测试,手机端BLE notify接收也正常。

    先说结论:24M晶振旁的电容取值过大、导致24M晶振的起振不正常,继而影响了RCOSC的校准。

    首先更换了IDE,采用CCS单步调试查看问题。在调试的过程中,定位到是在PowerCC26XX_RCOSC_clockFunc()函数的case STEP_TDC_INIT_2中的while()进入死循环,由注释的提示翻阅Technical Reference Manual查找AUX_WUC: TDCCLKCTL.ACK相关的寄存器,定位到时钟相关的问题;

    其次,参考了TI E2E论坛上的诸多问答内容,其中这两篇问答和TI工程师的回复给了我提示。在此先感谢TA12012和Christin Lee。

    https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/547752/configuring-project-zero-for-cc2640-series-without-32khz-crystal

    https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/750953/cc2640r2f-rtc-reliability-in-cc2640r2f

    在第一篇问答中,可以得到RCOSC_LF的校准会引起AON_RTC寄存器中SUBSECINC的变化,变为默认值0x00800000之外的其他值、表示对32768Hz偏移的补偿(SWCU117I, Technical Reference Manual, 14.4.1.5)。而在调试中,板子的这个寄存器始终为默认值,可以确定是RCOSC校准发生了问题;

    在第二篇问答中,可以得到RCOSC是根据外部高速时钟(在板子这里是24M XTAL)进行校准的。如果24M晶振不正常,肯定会影响RCOSC的校准。

    随后,用示波器查看了24M晶振的波形,确实没有成功起振。在程序无误的前提下,开始对照晶振选择指南(SWRA495I)、硬件设置和PCB设计参考(SWRA640F)进行硬件方面问题的排查。最后排查到是在24M晶振旁采用了过大的电容,继而影响了起振。在参考指南、去掉电容之后,晶振波形正常、例程调试正常、BLE通信正常,问题得到了解决。

    希望这个问题的解决过程对其他人有所帮助。再次感谢TI的工程师们!