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:无法在具有 CC2640R2L 的定制硬件上使用32kHz 无晶振模式

Guru**** 2387080 points
Other Parts Discussed in Thread: LAUNCHXL-CC2640R2, CC2640R2L
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1021305/cc2640r2f-unable-to-use-32-khz-crystal-less-mode-on-custom-hardware-with-cc2640r2l

器件型号:CC2640R2L
主题中讨论的其他器件: LAUNCHXL-CC2640R2

您好!

我正在使用 Simplelink SDK 在定制硬件上开发 BLE 应用、直到现在、我的用例有一个周期性的1ms 中断。 这就是我的硬件从不进入睡眠模式的原因。

现在、我在 simple_peripheral 示例代码上测试睡眠模式定制硬件无法进入睡眠模式。 我知道这是因为器件能够完美地广播数据、但一旦我尝试通过 Android 手机上的 NRF 连接应用程序进行连接、器件就会停止响应、并收到 GATT 错误。 此外、一旦我禁用 power_saving define、在编译之前、在预定义符号列表中、它就会完美连接。

我根据以下链接实现了无晶振模式: 开发低功耗蓝牙应用-低功耗蓝牙软件开发人员指南3.00.01文档 、该文档位于简单外设示例代码上。 我使用 CC2640R2L MCU (Simplelink SDK v4.40和 TI 编译器 v20.2.3)将同一文件烧录到 LAUNCHXL-CC2640R2评估板的任何定制硬件。 基本 simple_peripheral 示例代码不使用任何 GPIO,因此我在 Board_init()函数中禁用它们以删除任何特定于硬件的自定义可靠性。

结果:在我复位电路板后、评估板正常工作、但定制硬件无法连接。

我参考 了 TI 的 CC13xx/CC26xx 硬件配置和 PCB 设计注意事项文档、其中指出:

"错误的 RTC 频率将导致器件丢失连接事件、从而断开与中央器件的链路。"

但是、我正在尝试将内部 RCOSC 用于相同的目的、因此它不应依赖于外部硬件是否正确?

我可以验证我实际上使用的是内部 RCOSC (并且它已正确配置)、因为我使用了 OSCClockSourceGet 函数来获取 HF、MF 和 LF 时钟源。 我在 SimplePeripheral_performPeriodicTask (void)中添加了以下代码

/*********************************************************************
 * @fn      SimplePeripheral_performPeriodicTask
 *
 * @brief   Perform a periodic application task. This function gets called
 *          every five seconds (SBP_PERIODIC_EVT_PERIOD). In this example,
 *          the value of the third characteristic in the SimpleGATTProfile
 *          service is retrieved from the profile, and then copied into the
 *          value of the the fourth characteristic.
 *
 * @param   None.
 *
 * @return  None.
 */
static void SimplePeripheral_performPeriodicTask(void)
{
  uint8_t valueToCopy;
  volatile uint32_t hf = 5, lf = 5, mf = 5, test = 6;

//#define OSC_RCOSC_HF            0x00000000
//#define OSC_XOSC_HF             0x00000001
//#define OSC_RCOSC_LF            0x00000002
//#define OSC_XOSC_LF             0x00000003

   hf = OSCClockSourceGet(OSC_SRC_CLK_HF);
   lf = OSCClockSourceGet(OSC_SRC_CLK_LF);
   mf = OSCClockSourceGet(OSC_SRC_CLK_MF);
   test = OSCClockSourceGet(OSC_SRC_CLK_HF);
  // Call to retrieve the value of the third characteristic in the profile
  if (SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR3, &valueToCopy) == SUCCESS)
  {
    // Call to set that value of the fourth characteristic in the profile.
    // Note that if notifications of the fourth characteristic have been
    // enabled by a GATT client device, then a notification will be sent
    // every time this function is called.
    SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR4, sizeof(uint8_t),
                               &valueToCopy);
  }
}

在调试期间、我在"Expressions"窗口中获得了以下输出:

HF   无符号 int   1   0x200004D8    
mf  无符号 int   1   0x200004E0    
LF    unsigned int   2   0x200004DC    

因此、LF 源实际上是内部 RC 振荡器 OSC_RCOSC_LF。

我假设如果我使用的是内部 RCOSC、而不是板载32.768晶体、睡眠时钟应该工作正常。 请告诉我如何调试此问题。 在我们的射频定制板上、我们还使用具有内部偏置的差分模式、就像评估板一样。 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我指派了一名专家来帮助您的查询。

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您对您的设置的全面解释。 除了引用之外,您是否还调用 了 HCI_EXT_SetSCACmd() 来设置时钟精度? 这可能有助于改进工作、是一个良好的起点。 我会将其设置为 500ppm、然后查看是否有任何变化。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是的、我已经调用了函数 HCI_EXT_SetSCACmd (500);在 RCOSC_enableCalibration (void)函数中。 我还验证了在调试期间执行此函数。

    我想再分享一个观察结果。 我向 SimplePeripheral_init (void)函数添加了以下代码。 我在另一个 e2e 线程上读出、该线程可用于轻松探测进入 MCU 的32kHz LF 信号。

    IOCPortConfigureSet(IOID_9, IOC_PORT_AON_CLK32K,IOC_STD_OUTPUT);
    AONIOC32kHzOutputEnable();

    并通过添加#include 来包含 aON_IOC 库 开始时。

    以上是正确的32kHz 信号。 我已经验证了频率值。 在以下情况下、我会获得该输出:
    1.我将探针连接到评估板的 IOID_9。 它始终在评估板上显示正确的32kHz 信号。
    2.我正在调试模式下将探针连接到定制硬件的 IOID_9 (刷写后未复位电路板)。 如果我复位电路板、它将退出调试模式、这意味着现在它可以进入睡眠模式、那么它没有适当的32kHz 波形。 它显示了频率的下降。 我附上了下图。
    3.我已从预定义符号列表中删除 power_saving。 现在、如果我探测自定义硬件的 IOID_9引脚、无论它是处于调试模式还是已复位、它都会显示如上所示的正确32kHz 正弦波。

    这也是32kHz 信号、但正如您看到的、频率有下降、我不明白为什么会下降。 我在以下情况下获得该输出:
    当我的定制硬件退出调试模式时、即我已刷写程序并至少按一次复位按钮、并且 power_saving 包含在预定义符号列表中。

    我非常确定上图中的频率骤降是由于 SDK 中的某个位置所致、因为一旦我确保我的器件不会进入睡眠状态(通过确保其处于调试模式或删除 POWER_SAVE_PRETER定义)、我就会看到适当的32kHz 频率。 此时、我还能够通过蓝牙连接到器件、而不会出现任何问题。 我只是不知道 SDK 中导致此问题的原因。

    为了回答您的问题、我调用了 HCI_EXT_SetSCACmd (500);此函数。 另外、请告诉我导致上述问题的原因是什么?

    此致、

    Sarthak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sarthak、您能否分享定制板的详细信息? 由于此问题在我们的 Simplelink Launchpad 套件上不可重现、我认为此问题可能与硬件设置有关。

    作为完整性检查、请查看 我们的用户指南中的"在定制硬件上运行 SDK"部分。  请在您的其他相关帖子中继续此对话、以验证硬件。