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.

[参考译文] CC2650:在 I2C 通信期间、代码执行会冻结在低电平

Guru**** 2469920 points
Other Parts Discussed in Thread: CC2650, CC2650STK, CC2640, UNIFLASH

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/969655/cc2650-code-execution-freezes-at-a-low-level-during-i2c-communications

器件型号:CC2650
主题中讨论的其他器件:CC2640UNIFLASH

我有一个修改过的 Project Zero、我已将 I2C 功能添加到中。

我正在跟踪最近开始的低级代码执行冻结。

我怀疑这是因为我的 I2C 集成:

  1. 基本代码已在1000个器件中运行3年。
  2. 当此代码挂起时、I2C 总线会通电。  (我仅在使用数字输入打开 I2C 总线电力线后进行 I2C 通信、并在完成特定的 I2C 通信事件后立即关闭 I2C 总线电源。  我只会每5秒执行 I2C 通信事件、持续几毫秒)。

以下是汇编代码、其中在两行代码之间执行无限循环:

是否有人知道导致这种冻结的原因?

我怀疑我的某些阻塞模式 I2C 通信在主应用程序循环中运行所花费的时间过长。  这是可能的吗?

是否有有关如何在回调模式下使用 I2C 与 BLE 堆栈的示例代码(我似乎找不到任何)?

谢谢、

戴尔

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

    Dale、

    您能否提供有关您使用的 SDK 的一些信息? 您是否在 LaunchPad 上测试了代码以确保不存在硬件问题? 您是否使用 SDK 中的 I2C 驱动程序? 是否有任何修改?  

    查看其挂起区域周围的代码也会有所帮助。 您是否已尝试验证 I2C 驱动器/句柄是否已正确配置和打开? 是否有发生挂起的特定驱动器 API?

    谢谢、

    Daniel

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

    Daniel、您好!

    [引用 USER="Daniel o]]您能否提供有关您使用的 SDK 的一些信息? [/报价]

    我使用的是2.2.1 BLE 堆栈、这里是主项目的 CSS 常规选项卡(我不确定 SDK 会引用什么其他内容):

    [报价用户="Daniel o"]您是否在 LaunchPad 上测试了代码以确保不存在硬件问题?

    这是一个好主意、我会在某个时候尝试。

    [引用 user="Daniel o"]您是否使用 SDK 中的 I2C 驱动程序? [/报价]

    我正在使用此 include 文件将 I2C 添加到主项目中:

    #include 
    

    [引用 user="Daniel io"]查看其挂起区域周围的代码也会有所帮助。

    请参阅我修改后的 Project Zero 中此代码片段底部的注释:

    静态空 ProjectZero_taskFxn (UArg a0、UArg A1)
    {
    Halo_init ();//Dale
    
    //初始化应用
    ProjectZero_init ();
    
    //
    应用程序主循环(;)
    {
    //等待与调用线程关联的信号量。
    //请注意、当发出信号时、与线程关联的信号量会发出信号
    //消息在线程的消息接收队列中排队,或在何时排队
    // iCall_signal ()函数被调用到信号量上。
    iCall_errno errno = iCall_Wait (ICALL_TIMEOUT_FOREVAL);
    
    if (errno =ICALL_errno_Success)
    {
    iCall_EntityID dest;
    iCall_ServiceEnum src;
    iCall_HciExtEvt *pMsg =空;
    
    //检查我们是否由于堆栈消息而获得信号
    if (iCall_fetchServiceMsg (&src、&dest、
    (void **)&pMsg)=ICALL_errno_Success)
    {
    uint8 safeToDealloc = true;
    
    IF (((src =ICALL_SERVICE_CLASS_BLE)&&(dest =self Entity))
    {
    iCall_Stack_Event *pEvt =(iCall_Stack_Event *) pMsg;
    
    //检查接收到的事件标志(事件签名0xFFFF)
    if (pEvt->signature == 0xFFFF)
    {
    //完成连接事件时接收到的事件
    if (pEvt->EVENT_FLAG & PRZ_CONN_EVT_END_EVT)
    {
    //尝试重新发送待处理的 ATT 响应(如果有)
    ProjectZero_sendAttRsp();
    }
    }
    否则//它是来自堆栈的消息,而不是事件。
    {
    //处理任务间消息
    safeToDealloc = ProjectZero_processStackMsg ((iCall_HDR *) pMsg);
    }
    }
    
    if (pMsg && safeToDealloc)
    {
    iCall_freeMsg (pMsg);
    }
    }
    
    //处理从另一个任务或另一个上下文发送的消息。
    while (!Queue_empty (hApplicationMsgQ))
    {
    app_msg_t *pMsg = Queue_dequeue (hApplicationMsgQ);
    
    //处理可能从我们自己发送的应用层消息。
    USER_processApplicationMessage (pMsg);
    
    //释放收到的消息。
    iCall_free (pMsg);
    }
    }
    if (iamawake){//dale3-28 CC2640已唤醒且为 BLE 广播
    IF (事件和 Periode_Dale_cycle){//dalevecycle 1/4秒用于 I2C 测试
    事件&=~Period_Dale_cycle;//dalevecycle clear 事件
    Util_startClock (&Period_Dale_cycleClock);//生命周期
    
    如果添加了 if (justwokeup){//2020、以便插入电池完成初始化
    initI2CdevicesAndGetUID();//我认为程序执行在此函数中挂起
    //但是,如果此函数在“应用程序主循环”之外执行
    //在 Halo_init()函数中执行(请参阅上文),则它完成而不会挂起
    justwokeup=0;
    } 

    [引用 user="Daniel o"]您是否尝试验证 I2C 驱动程序/句柄是否已正确配置和打开?

    是的 I2C 可以正常工作,正如我在上面提到的那样,initI2CdevicesAndGetUID()函数在上述代码片段中的 Halo_init()函数内运行时会起作用,但在'Application main loop'中运行时会挂起。

    [报价用户="Daniel o"]是否有发生挂起的特定驱动器 API?

    如何分辨它所处的 API?

    我真的认为、我不应该在"应用主循环"中运行 I2C 通信、而是在阻断模式下运行 I2C 通信。  每次 Cc2650从睡眠状态唤醒时,都需要运行 long initI2CdevicesAndGetUID()函数,而在 C2650处于唤醒状态时,我需要每隔几秒执行一次短 I2C 突发。  这些周期性 I2C 突发不会挂起代码、BLE 通信可以通过这些短暂的周期性 I2C 突发正常工作。

    如果将 I2C 添加到 BLE 工作区的正确方法是在回调模式下使用 I2C、我真的想弄清楚如何操作、但我找不到任何示例代码来启动我、如果没有、 然后我必须弄清楚如何避免这种冻结。

    戴尔

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

    [报价用户="Daniel o"]您是否在 LaunchPad 上测试了代码以确保不存在硬件问题?

    我刚刚研究了这种可能性、但由于我的代码需要外部硬件才能运行(我对外部闪存进行读取和写入)、 我认为不值得更改我的代码或将外部组件添加到 launchpad 上、以使 I2C 和 BLE 通信在 launchpad 上正常工作。  即使我这么做、对于它是否在 Launchpad 上工作的答案是、我认为在这一点上没有意义。  我修改过的 Project Zero 已在现场执行了1000个 CC2640F128安装3年、没有 BLE 通信问题... 这些 BLE 通信问题仅会出现、因为我添加了 I2C 功能。

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

    更多信息:

    为了将 I2C 集成到我修改的 Project Zero 中、我使用了"i2ctmp007"示例项目。

    我从该示例代码 的 Board.h、 CC2650STK.c、 CC2650STK.h 和 i2ctmp007.c 文件中复制了 I2C 相关代码。  我还确保 SCA 和 SCL 引脚以代码形式定向到物理 I2C 总线连接到的输出引脚。

    在'Application main loop'内,我与三个总线器件的所有短 I2C 通信都可以正常工作,如果 long initI2CdevicesAndGetUID()函数在'Application main loop'之外,则它可以正常工作,而不会挂起。

    在所有情况下、问题似乎都是 I2C 干扰 BLE 通信、有时 BLE 握手会起作用、但 BLE 数据传输和按钮按压操作都无法处理已使用多年的 BLE 代码。

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

    Dale、

    感谢您提供更多信息和调试步骤。 我将联系 BLE 堆栈专家进行评论、因为它似乎与 BLE 堆栈相关、而不是与 I2C 相关。

    谢谢、

    Daniel

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

    谢谢 Daniel。。。

    更多信息:

    我不再认为这是 I2C 通信的阻塞与回调问题。

    我之所以这么认为、是因为此代码的结果和此代码片段中的注释:

    静态空 HALO_init (void){//Dale
    openPINs();//不是 I2C 引脚
    如果(使用 I2C){//如果使用 I2C = 0、则没有 I2C 被初始化、打开或尝试处理。
    //如果 useI2C = 0,则所有 BLE 通信均按预期工作,与过去3年一样。
    Board_initI2C();//这等效于 I2C_init ();
    I2C_Params_init (&I2Cparams);
    I2Cparams.bitrate = I2C_400kHz;
    //如果 useI2C = 1,则所有 I2C 通信正常,但 BLE 通信会出现以下消息
    } 否则{
    //设置 useI2C = 0并取消注释以下 Board_initI2C ();行原因:
    // 1. 间歇性 BLE 握手成功
    // 2. 开/关按钮事件不会发送到 BLE 上的 iPhone
    // 3. 在 BLE 上向 iPhone 发送数据停止工作
    //Board_initI2C();//this 等效于 I2C_init ();
    } 

    在我的第一个代码片段(上一个帖子)中,您可以看到 HALO_init ()在 ProjectZero_taskFxn ()的开头运行,但仍在'Application main loop'之外。

    注意:我已经将 long initI2CdevicesAndGetUID()函数移动到它在 CC2650从睡眠状态唤醒以及 BLE 在睡眠后被告知再次广播之前运行的位置。 这消除了我在本主题的第一篇文章中提到的低级别冻结、但仍存在无法正常工作的 BLE 通信问题。

    实际上、我在修改后的 Project Zero 中实现 TI I2C 库会导致 BLE 通信问题。

    是否还有另一个结论可以得出、但我却遗漏了这些结论?

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

    您好 Dale、

    我认为在这部分任务代码中初始化 I2C 不正确。

    添加了 f (justwokeup){//2020、以便插入电池完成初始化
    initI2CdevicesAndGetUID();//我认为程序执行在此函数中挂起
    //但如果此函数在这个'Application main loop'之外执行
    //在 Halo_init()函数中(见上文),它完成而不挂起
    justwokeup=0;

    应该位于 ProjectZero_init()中

    此外、您将 I2C 初始化两次、这可能会导致您的问题。

    另一个原因是、我不建议您使用 Project Zero 作为项目的基础、它是一个演示示示示例程序、具有自己的应用实现。 建议的项目库是 Simple Peripheral。

    此外、如果您不熟悉此方法、我建议您使用 Launchpad 并尝试通过蓝牙发送温度数据以熟悉此过程。

    -kel

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

    Markel Robregado 说:
    应位于 ProjectZero_init ()

    为什么? 如我所示,我的 Halo_init()在 ProjectZero_init()之前运行,这会导致什么问题?

    [引用 user="Markel Robregado"]此外,您还会初始化 I2C 两次,这可能会导致您的问题。

    我看不到我在哪里初始化 I2C 两次... 我的 I2C 初始化代码片段是为了方便我通过在良好的 BLE 通信和不良 BLE 通信之间切换来轻松调试此问题。  如果我想进行良好的 I2C 通信而没有 I2C、我初始化'useI2C = 0';如果我想将 I2C 功能(成功与三个 I2C 总线器件通信)添加到我的操作 BLE 代码中、我初始化'useI2C = 1'、这会导致 BLE com 问题。  然后、为了查看可能导致 BLE com 问题的原因、我初始化'useI2C = 0'并在  'else'后面添加第二个= I2C 初始化行的取消注释、只有这一个初始化 I2C 的过程才会导致 BLE com 问题。  为了隔离这个问题、我需要比这更接近多少、因为初始化 I2C 会导致我的 BLE COM 问题?

    [引用 user="Markel Robregado]*另一个原因是、我不建议您使用 Project Zero 作为项目的基础、它是一个演示示示示示例程序、具有自己的应用程序实现。 建议的项目库是简单外设

    使用 Project Zero 基本代码的决定是在2017年做出的、我花了数百小时的时间开发修改后的 Project Zero、iPhone 应用和 CC2640F128电路板。  我很不可能重新开始。  有1000个电路板和修改过的 Project Zero 已经使用了3年、没有 BLE 问题。  通过 BLE、我可以将数据传输到 iPhone、而按钮状态事件则会发送到我的 iPhone。  我还向 Project Zero 添加了代码、该代码使用 CC2640F128与外部闪存芯片之间传输数据。

    [引用 user="Markel Robregado"]此外,如果您不熟悉此操作,我建议您使用 Launchpad 并尝试通过蓝牙发送温度数据以熟悉此操作。

    除了冷静之外,我不知道如何对此作出回应。  很久以前、我就无法通过蓝牙发送数据了。

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

    [引用 user="Dale Kramer"]我无法查看在何处初始化 I2C 两次

    不是这里的第二个 I2C 初始化 initI2CdevicesAndGetUID();? 正如您在本部分提到的、导致此挂起的 C 函数的详细信息是什么?

    如您所述、原始基本代码起作用。 因此、您必须弄清从旧实现变为现在导致此问题的原因。

    如果您移植此 CCS 项目以使用最新的 BLE Stack、则可能会有一些更改、改进和错误修复。

    [引用 user="Dale Kramer"]使用 Project Zero 基础[/引用]的决定

    许多人都使用 Project Zero 作为基础、因为这是一个演示、用于 SimpleLink Academy 讲座。 但是、在这里、由于很多好的原因、他们会推荐简单外设、这是一个很长的解释。 因此、当您将 Project Zero 用作产品开发的基础时、它将成为一个陷阱。

    [引述 USER="Dale Kramer"]除了冷静之外,我不确定如何回答这个问题。  很久以前我就能通过蓝牙发送数据了。

    如果您将旧的 CCS 项目移植到使用最新的 BLE 堆栈、那么评估同时使用蓝牙通信所需的外设也不失为一个好主意。

    -kel

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

    ?initI2CdevicesAndGetUID()?  正如您在本部分提到的、导致此挂起的 C 函数的详细信息是什么?[/QUERP]

    我认为我的函数'initI2CdevicesAndGetUID()'的名称误导了您,使您以为我在其中有 I2C_init。  该名称指的是 I2C 总线器件的初始化、这些器件在我通过在 I2C 电源线上启用电压稳压器为 I2C 总线通电时、其电源引脚变为活动状态。   不过、我确实在函数中打开了一个 I2Chandle。 我想我已经解释了如何通过将此函数移动为 CC2640从睡眠状态唤醒后执行的第一个代码来摆脱挂起。  如果 I2Chandle 在 CC2640进入睡眠模式之前打开、我还会关闭它。  因此不再存在挂起问题。  但 BLE 通信仍然存在第二个问题、即我初始化 I2C。

    [引用 user="Markel Robregado"]如果移植此 CCS 项目以使用最新的 BLE 堆栈

    我无法想象这会给我带来多长时间,尽管我不是第一次来这里,但我还是一个新手。。。 我有什么保证可以解决这个问题?

    [引用 USER="Markel Robregado]]Project Zero 作为基础,因为这是一个演示,用于 SimpleLink Academy 讲座。 但是、在这里、由于很多好的原因、他们会推荐简单外设、这是一个很长的解释

    2017年、当 Project Zero 决策制定时、我有很多论坛主题、许多 TI 员工都帮助我实现了目标。  我不记得他们也找不到建议用简单外设代替:(

    [引用 user="Markel Robregado"]如果您将旧的 CCS 项目移植到使用最新的 BLE 堆栈,则评估同时使用蓝牙通信所需的外设也不失为一个好主意。

    你会厌倦我需要回答的所有问题来实现这一目标、首先我甚至不能完全理解你提议我做什么。

    编辑: 我真的认为我已经很好地隔离了这个问题、让那些真正了解"内幕揭秘"的人能够轻松地提供解决方案、至少我必须希望这样、因为我认为我不能自己对此进行进一步调试...

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

    您好 Dale、

    我已经尝试回顾了到目前为止在这个主题上所说的所有内容。 如果我错过了一些东西、请接受我的道歉。  

    首先、我们通常建议使用 simple_peripheral 示例、但这并不意味着您必须将项目迁移到该示例。 关于迁移到较新的 SDK/BLE 堆栈、确实我们通常会建议这样做、但我建议首先解决 I2C 驱动程序的问题。 然后、您可以考虑根据更新的 BLE Stack 中实现的新功能/错误修复/优化进行迁移。
    总之,让我们尝试在不更改示例或 BLE 堆栈版本的情况下解决您的问题:)

    请问您是否已验证问题是否是由任何堆栈损坏或堆短缺引起的? 我是说、通过添加 I2C 驱动程序、我想您还添加了一些缓冲器、这些缓冲器消耗了一些 RAM。。。 如果您按照 本文档中的说明使用 ROV 或 ROV Classic 来验证堆栈使用情况、则很冷。 仍然使用同一个文档、您将找到一些调试堆问题的方法、可能值得查看。

    我的另一个想法是验证 CPU 被与 I2C 初始化相关的代码阻止的时间[您可以通过在之前和之后切换引脚来执行测量、CCS 调试器也可以进行 ALE 以为您清除此计时]。 BLE 操作实际上对时间很敏感、任何不必要的延迟都会导致不良的结果。 如果可用 RAM 的数量允许、您可能需要将所有 I2C 操作移至优先级较低的其他线程。 这样您就可以消除该问题。

    最后一个元素、您可以在 CCS 项目中导入 I2C 驱动程序的源代码。 这样、您就能够单步执行 I2C 代码。 在这种情况下、我们不确定它是否有用、但在其他情况下可能有用。

    让我们知道这是否会导致其他有趣的观察结果、

    此致、

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

    让我们尝试在不更改示例或 BLE 堆栈版本的情况下解决您的问题:)

    听我的耳朵听音乐:)

    [引用 user="Clment"]我是否可以询问您是否已验证问题是否是由任何堆栈损坏或堆短缺引起的?

    如果我不理解您的某些问题、请原谅我、我不熟悉这一级别的调试。  这个问题确实有意义、因为我知道我在2017年进行了一些堆栈大小优化、因为我的代码非常接近占用代码空间。

    下面是 I2C_init()之前的 ROV 经典系统堆栈:

    下面是 I2C_init()之后的 ROV 经典系统堆栈:

    下面是我的项目中有关内存的一些更多信息:

    [引用 user="Clment "]我的另一个想法是验证 CPU 被与 I2C 初始化相关的代码阻止的时间[您可以通过在前后切换引脚来执行测量、CCS 调试器也可能会进行 ALE 以屏蔽此计时]。 BLE 操作实际上对时间很敏感、任何不必要的延迟都会导致不良的结果。 [/报价]

    我在这个概念上遇到了困难、因为目前 I2C_init()的位置在使用 ICall 消息的'Application main loop'之外。  为什么在 I2C_init()期间 CPU 使用时间长度对于我执行 I2C_init()很重要?  如果您需要、我可以执行引脚切换、如果您确实认为需要、我可以使用示波器测量时间、请确认是否需要...  

    [引用 user="Clment"]如果可用 RAM 的数量允许,则可能需要将所有 I2C 操作移至优先级较低的另一个线程。 这样您就可以消除该问题。[/引述]

    是的、我想尝试这项建议、但我需要逐步说明才能实现。

    最后一个元素,您可以在 CCS 项目中导入 I2C 驱动程序的源代码。 这样、您就能够单步执行 I2C 代码。 在这种情况下、并不是100%确定会有所帮助、但在其他情况下可能会有所帮助。[/引述]

    我会尝试这种方法并报告:)

    感谢您的参与!

    戴尔

    编辑:出于完整性考虑、下面是我的 BLE221堆栈的内存使用情况:

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

    [引用用户="Dale Kramer"]

    克莱蒙特
    最后一个元素、您可以在 CCS 项目中导入 I2C 驱动程序的源代码。 这样、您就能够单步执行 I2C 代码。 在这种情况下、我们不确定它是否有用、但在其他情况下可能有用。

    我会尝试这种方法并报告:)

    [/报价]

    当然最好调试 I2C 代码的单步调试,但我似乎找不到 I2C_init()函数的源代码,以便为这个看起来会导致这些 BLE com 问题的特定函数测试这个概念。。。  有什么想法我可以在哪里找到它吗?

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

    您好!

    [引用 user="Dale Kramer">调试 I2C 代码的步骤确实不错,但我似乎找不到 I2C_init()函数的源代码,以便针对此特定函数测试此概念,这似乎会导致这些 BLE com 问题....  有什么想法我可以找到它吗?[/引述]

    因为 I2C.C 中可能使用了一些函数指针 如果要访问实际代码、必须找到 I2CCC26XX.c 文件 对于 CC2650、此代码应位于 tirtos_cc13xx_cc26xx_X_XX_XX\products\tidrivers_cc13xx_cc26xx_2_21_01_01\packages/ti\drivers\i2c 中。 对于 CC26XX、它位于中 \source\ti\drivers

    此致、

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

    您好!

    [引用 user="Dale Kramer"]如果我不理解您的某些问题,请原谅我,我不熟悉此调试级别

    用简体^^、我问您是否正在耗尽 RAM

    [引用用户="Dale Kramer"]

    下面是 I2C_init()之前的 ROV 经典系统堆栈:

    [/报价]

    您还可以查看模块"任务"吗? 您应该能够在那里找到 stackPeak。

    此致、

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

    [引用 user="Clment "]在英文本中,我询问您是否正在耗尽 RAM ^^[/quot]

    好的、我不这么认为  

    [引用 user="Clement ]您是否还可以查看模块"任务"? 您应该能够在此处找到 stackPeak。[/quot]

    在 I2C_init()之前:

    紧随 I2C_init()之后:

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

    好的、我将四个文件(I2C.h/.c 和 I2CCC26XX.h/.c)复制到了我的工作区目录中、并且我立即能够逐步调试它们。

    在 I2C_init()上没有太多的发生,基本上只有这一行结果我可以告诉'object->isOpen = false;',如下所示:

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

    您好 Dale、

    您现在已设置调试:)

    有几个我不了解的元素。 您可以为我执行以下操作吗?

    • 确定问题是由 I2C_init()、I2C_open()引起,还是由之后的传输引起[为此,我建议注释掉除 I2C_init()之外的所有 I2C 函数。 一旦您确认 I2C_init 不是问题的根源,请尝试取消注释 I2C_open ()]
    • 提供一些有关问题发生后器件状态的详细信息。 如果我回答正确、则表示您不再遇到挂起问题、对吗? 那么、该器件会做什么呢? 它是否仍在执行一些代码? 如果是、哪个功能?
      我通常建议在连接调试器的情况下运行代码、直到出现问题。 问题出现后、暂停执行。
      • 使用 ROV 验证不同任务的状态、验证是否没有发生异常(Hwi 模块)
      • 尝试识别正在执行的代码段(使用分步执行、它应该有助于查看您是处于无限循环还是类似的循环中)

    最后但同样重要的是、如果尚未完成、我强烈建议查看 此文档

    此致、

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

    identify if the problem is due to I2C_init()、I2C_open() or turt to the transfers out[为此,我建议注释掉除 I2C_init()之外的所有 I2C 函数。 确认 I2C_init 不是问题的根源后、尝试取消注释 I2C_open ()]

    很抱歉,我无法确认 I2C_init()不是问题的根源。 下面的调试代码片段(我已经发布过)描述了我如何通过初始化'useI2C = 0'来隔离 I2C_open ()和传输。  然后 I2C_init ()、I2C_open ()和所有传输代码都不执行、这使我能够正常工作 BLE 通信...  然后、在'useI2C = 0'的情况下、我取消注释第2个 I2C_init ()、该函数随后仅执行 I2C_init、不执行其他 I2C 代码、我的 BLE 通信不像该调试代码片段中所述那样工作。   我想我已经证明了 I2C_init()单独导致 BLE 通信问题...

    [报价用户="Clement ]]如果我回答正确、则表示您不再遇到挂起、对吧? [/报价]

    正确。

    那么、该器件有什么作用?  它是否仍在执行一些代码? 如果是、哪个功能? [/报价]

    静态空 HALO_init (void){//Dale
    openPins();
    如果(使用 I2C){//如果使用 I2C = 0、则没有 I2C 被初始化、打开或尝试处理。
    //如果 useI2C = 0,则所有 BLE 通信均按预期工作,与过去3年一样。
    Board_initI2C();//这等效于 I2C_init ();
    I2C_Params_init (&I2Cparams);
    I2Cparams.bitrate = I2C_400kHz;
    //如果 useI2C = 1,则所有 I2C 通信正常,但 BLE 通信会出现以下消息
    } 否则{
    //设置 useI2C = 0并取消注释以下 Board_initI2C ();行原因:
    // 1. 间歇性 BLE 握手成功
    // 2. 开/关按钮事件不会发送到 BLE 上的 iPhone
    // 3. 在 BLE 上向 iPhone 发送数据停止工作
    //Board_initI2C();//this 等效于 I2C_init ();
    }
    

    在上述调试代码"按原样"且使用 I2C 初始化为1的情况下、没有挂起、以下内容不再起作用:

    1. BLE 通信可实现间歇性握手成功
    2. 如果发生握手、BLE 将有关按钮事件发生的通知转移到 iPhone 上。
    3. 如果发生握手、数据包的 BLE 传输将不再到达 iPhone。

    下面的操作正常、可以使用断点和 F5来停止代码... ETC 调试分步通过:

    1.  I2C 与三个 I2C 总线器件(基于 RC522的 RFID 读取器、I2C 空气压力传感器和 BME280温度/湿度传感器)成功通信。
    2. 发生按钮事件。
    3. 数据将写入我的外部闪存芯片、然后通过 BLE 传输到 iPhone。
    4. 基本上、在过去3年中、一切都正常工作和执行、而我的新 I2C 通信正常工作、但 BLE 通信存在上述问题。

    我通常建议在连接调试器的情况下运行代码、直到出现问题。 [/报价]

    在过去3年中、我能够使用 CC2650 Launchpad 上的 XDS110进行调试。

    我在大约3年前使用过 ROV。

    正如本主题的前几篇文章中所述、我们已经处理了唯一的无限循环。

    [引用 user="Clement "]最后但同样重要的是,如果尚未完成,我强烈建议查看 此文档

    在过去3年里、我多次使用该文档。

    这一员额应是对迄今为止该专题所有员额的一个很好的总结。

    我很乐意在 Chrome 远程桌面支持会话中向您演示上述内容。

    编辑: 上面的 Halo_init()函数在 ProjectZero_init()之前直接在 Project Zero 中执行:

    静态空 ProjectZero_taskFxn (UArg a0、UArg A1)
    {
    Halo_init ();//Dale
    //初始化应用
    ProjectZero_init ();
    //
    应用程序主循环(;)
    {
    //等待与调用线程关联的信号量。
    //请注意、当发出信号时、与线程关联的信号量会发出信号
    //消息在线程的消息接收队列中排队,或在何时排队
    // iCall_signal ()函数被调用到信号量上。 

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

    您好!

    感谢您的详细信息。 我不确定是不是很清楚、因为看到驱动程序的 init 函数所产生的问题是非常令人惊讶的。 您能否验证系统是否仅初始化一个 I2C 驱动程序(按其应有的方式)? (这可以通过单步执行 I2C_init 函数并查看 I2C_count 来看出)。

    此致、

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

    [报价 USER="Clment "]您能否验证系统是否仅初始化一个 I2C 驱动程序(按应有的方式)? (这可以通过单步执行 I2C_init 函数并查看 I2C_count 来看出)。[/quot]

    是的、只有1、这是我昨天能够单步执行 I2C 代码时确认的第一件事、很抱歉我没有报告这一事实。

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

    最后一个值得在 I2C_init 函数中验证的元素是 I2C_CONFIG 的内容。 此外、您能否提供显示如何配置 I2C 驱动程序的板级配置文件的摘录?

    此致、

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

    Clment 说:
    您能否提供显示如何配置 I2C 驱动程序的 boardfile 摘录?

    在 board.h 中:

    #define Board_I2C0 Board_I2C//daleI2C
    #define Board_I2C_TMP Board_I2C0 //daleI2C
    #define Board_initI2C() I2C_init ()//daleI2C 

    在我的 HaloLoggerV1a.h"

    在我的 HaloLoggerV1a.c 中:

    *========================================= I2C BEGIN================================================================
    */
    *放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (I2C_CONFIG、".CONST:I2C_CONFIG")
    #pragma DATA_SECTION (i2cCC26xxHWAttrs、".const:i2cCC26xxAttrs)
    
    
    * HWinclude 驱动程序*/ HWendif 驱动程序
    
    
    /* I2C 对象*/I2CCC26XX_Object
    i2cCC26xx 对象[CC2650_LAUNCHXL_I2CCOUNT;
    
    /* I2C 配置结构,描述要使用的引脚*/
    const I2CCC26XX_HWAttrsV1 i2cCC26xxHWAttrs[CC2650_LAUNCHXL_COUNT_{=I2CC26xxHW]
    {
    baseAddr = I2C0_BASE、
    powerMngrId = PowerCC26XX_Periph_I2C0、
    .intNum = INT_I2C_IRQ、
    .intPriority =~0、
    .wiPriority = 0、
    sdaPin = Board_I2C0_SDA0、
    .sclPin = Board_I2C0_SCL0
    、}
    };
    
    /* I2C 配置结构*/
    const I2C_Config I2C_CONFIG[]={
    {
    .fxnTablePtr =&I2CCC26XX_fxnTable、
    .object =&i2cCC26xx 对象[0]、
    hwAttrs =&i2cCC26xxHWAttrs[0]
    }、
    {NULL、NULL、NULL}
    };
    /*
    ======================================== I2C 结束========================================================
    * 

    [引用 user="Clement"]在 I2C_init 函数中值得验证的最后一个元素是 I2C_CONFIG的内容

    抱歉、我在我的任何工作区文件中都找不到"I2C_config"文本、在我的计算机上也找不到名称中包含该文本的任何文件。  我在哪里可以找到它?

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

    您好!

    [引用 USER="Dale Kramer">抱歉,我在我的任何工作区文件中都找不到“I2C_CONFIG”文本,在我的计算机上也找不到名称中包含该文本的任何文件。  我在哪里可以找到它?

    实际上,您已经提供了定义 I2C_CONFIG 的代码:)

    我在那里找不到任何问题。
    您建议的诊断(即 I2C_init 导致的问题)对我来说意义越来越小。 我的意思是、此函数写入几个变量、不会产生任何错误。 再说一次、I2C_init 函数对 I2C 模块没有实际影响、因此我对此表示怀疑。 函数 I2C_init 可能会突出显示由于堆损坏或略微修改时序而导致的问题。  

    您能否尝试获取我在之前的一条消息中询问的堆/堆栈详细信息? 这是我看到在这一调试工作中进行的唯一元素。

    此致、

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

    实际上,您提供了定义 I2C_CONFIG 的代码:)

    哎呀,抱歉,当我进行工作区搜索时,我的搜索参数肯定有误,或者可能我进行了一个读写错误的搜索:)  

    您是否可以尝试获取我在之前的一封邮件中询问的堆/堆栈详细信息? [/报价]

    我以为我提供了 ROV Hwi 和任务屏幕快照。  很抱歉在这里这么差劲、但我如何找到  您请求的堆/堆栈详细信息?

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

    您好!

    实际上、您在前一封邮件中提供的屏幕截图是可以的、但如果我们在执行5分钟后查看相同的屏幕截图会更好。 为此、让器件自由运行(尝试与手机建立连接)、然后在5分钟后 连接调试器、暂停执行并验证 ROV 提供的结果。

    此致、

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

    调试正在运行的 CC2640是一个小技巧:)

    但是、在 iPhone 中未发生 BLE 握手的情况下运行15分钟后、我在使用有效的 I2C 代码触发 RFID 标签读取后休息一下。

    以下是中断时的 ROV Hwi 和任务状态:

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

    您好!

    您能否在注释掉 I2C 传输的情况下执行相同的测试? (即仅保留 I2C_init)

    此致、

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

    如果可以、我会这样做。

    因此、我可以像以前一样使用复位、构建等进行调试、将4个 GEL 复位行放回代码中、我将调试配置"Program"和"Target"选项卡上的2个复选框改回...  然后我尝试启动调试会话,但代码再次冻结,但这次在 BIOS_start()函数:(

    我已经尝试了所有的复位、循环通电、CCS 关闭/打开等方式、但这仍然是持续挂起。

    我在 BIOS_start()上放置一个断点,然后按 F5,然后它挂起,在我中断挂起后,这里是汇编语言:

    我尝试了 BIOS_start()断点的 Ctrl+Shift+F5按压操作,但我到达挂起代码所花费的时间太长,所以我放弃了.... :(

    编辑:我还创建了一个新的工作区,并导入了1月13日存档的工作区的存档备份(工作代码)...... 相同的 BIOS_start()冻结:(

    EDIT2:我可以使用闪存编程器2将我们3年来一直使用的十六进制文件加载到 cc2640上、代码运行完美、所有 BLE 都可以毫无故障或延迟地与 iPhone 应用通信...

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

    您好!

    好的、如果您从开始运行时以调试模式运行代码、会发生同样的情况吗?

    您能否尝试使用闪存编程器或 Uniflash 等外部工具刷写器件? (我想知道您之前为连接正在运行的目标而进行的修改是否可能是您遇到困难的原因)

    此致、

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

    [报价用户="Clement "]您能否尝试使用闪存编程器或 Uniflash 等外部工具来刷写器件

    是的,当你问这个问题时,我在之前的帖子上做了我的 EDIT2…

    Clment 说:
    好的,如果从开始运行时以调试模式运行代码,会发生同样的情况吗?

    不确定这个问题???? 我在调试模式下运行、甚至到达 BIOS_start()行上的断点、因此我不理解? 调试模式是否不是能够单步执行我的代码?

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

    此外,使用 Flash Programmer 2从最新编译的调试目录加载当前的十六进制文件也可以正常工作,代码运行时不会挂起(我的 LED 在闪烁,我的 PCB 上指示了生命证明;)...

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

    现在,除了在 CCS 中启动一个新的调试会话之外,如果我使用 FP2加载当前的十六进制文件,BIOS_Start()中就不再有挂起的现象了.........

    我讨厌中间帐篷… 早上5点的时候在这里浪费了太多时间了…

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

    好的,只有 I2C_init()添加到我的工作 BLE 通信代码中,如下所示:

    静态空 HALO_init (void){//Dale
    openPins();
    useI2C = 0;//set 在这里、而不是在程序复位时对其进行初始化
    如果(使用 I2C){//如果使用 I2C = 0、则没有 I2C 被初始化、打开或尝试处理。
    //如果 useI2C = 0,则所有 BLE 通信均按预期工作,与过去3年一样。
    Board_initI2C();//这等效于 I2C_init ();
    I2C_Params_init (&I2Cparams);
    I2Cparams.bitrate = I2C_400kHz;
    //如果 useI2C = 1,则所有 I2C 通信正常,但 BLE 通信会出现以下消息
    } 否则{
    //设置 useI2C = 0并取消注释以下 Board_initI2C ();行原因:
    // 1. 间歇性 BLE 握手成功
    // 2. 开/关按钮事件不会发送到 BLE 上的 iPhone
    // 3. 在 BLE 上向 iPhone 发送数据停止工作
    Board_initI2C();//这相当于 I2C_init ();
    } 

    以下是在运行10分钟后未完成 BLE 握手的情况下休息的 ROV 统计数据(我只是在周期性事件中设置一个断点、在 ICALL 循环中刷写我的"生命之差" LED):

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

    您好 Dale、

    感谢您的观看。  
    问题是没有任何迹象表明我们应该去哪里看。

    您能否在没有任何 I2C 功能(甚至不是 I2C_init)的情况下执行相同的测试?

    此致、

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

    嗯,自从我上一篇文章找到我的问题的解决方案以来,我一直在这里度过了一段时间,很抱歉,如果这是一篇很长的文章....

    我已经多次尝试在没有任何 I2C 代码的情况下(即使没有 I2C_init)运行代码... 但这次我第一次注意到一些有趣的 BLE 通信问题... 这是一个惊喜! 我现在看不到任何按钮事件通过 iPhone、一些有趣的 RTC 时间被传输到 iPhone。 BLE 握手始终如一地完成、并且在我对 BLE 通信满意之前、我通常尝试成功测试了尽可能多的数据传输模式。

    实际上、这是我对我能够找到解决方案的第一个一线希望。 我在这个漏洞中的一个原因是我知道工作区的历史以及这个基本代码在3年前被编写的环境。 它是使用 Win7计算机上的 CCS7 (7.0.0.00042) IDE 编写的。 当时、我只是通过压缩主项目和 BLE 堆栈项目的工作区文件夹来备份我编写或修改的代码(我知道我听到了您的"tsk tsk")。

    2020年12月、我几年来首次重新启动 Win7计算机、只是为了发现 Windows 告诉我我我的启动驱动器出现故障、我需要采取措施。 我立即在 USB 硬盘上进行了更多备份、但在'Users directory'(我的工作区所在的位置)和'ti'目录中有一些损坏的文件。 我的项目代码中有一些更改尚未备份、因此我今天花了很多时间尝试获取我对 Project Zero 所做的所有代码更改的"最新"副本、这些更改是十六进制文件的来源 在过去三年中使用。 幸运的是、上个月我一直在使用正确的代码修订版来寻求添加 I2C 功能、以便读取/写入三个 I2C 器件。 但是、我在上个月遇到了这些隐秘的 BLE 通信问题。

    不管怎样、我的计划的另一部分是镜像发生故障的驱动器、看看我是否可以从新驱动器启动、打开 CCS7并在我今天刚刚隔离的现有工作区中编译该代码。 很好、我得到了一个无错误且运行的十六进制文件、该文件与我们过去3年使用的十六进制文件一样工作完美。

    当我再次在 Win7/CCS7环境中进行调试时、使用代码开发所基于的原始工作区环境时、实际情况就已经成熟了。

    下面是我所做的:

    1. 已执行工作区的文件>导出>常规>存档文件"备份"。
    2. 将该文件带到我上个月一直在处理的 Win10计算机上。
    3. 已在 Win10计算机上安装 CCS7.0.0.00042。
    4. 已使用 CCS7打开新的工作区文件夹
    5. 执行了一个项目>导入 CCS 项目...>选择存档文件>浏览并从我刚刚创建的 Win7计算机中选择了存档文件。
    6. 工作区项目进入我的工作区后、我通过 CC2650 Launchpad 进行了清理>生成全部>调试会话、并将其连接到使用了3年的 cc2640F128 PCB (使用的 PCB 与运行完美无缺的 PCB 相同、 很快就在 Win7计算机上加载了我的新 hex 文件)。
    7. 猜猜猜,所有同样阴险的 BLE 通信问题都重新出现了:(

    因此、我很明显、现在是时候让我"继续"了、只需在重新开发的 Win7/CCS7.0.0.00042 IDE 上开发我的未来代码了...

    我希望 TI 的某个人有兴趣进一步跟进、因为我没有时间去讨论这个问题、并进一步隔离这个解决方案。

    我可以提供的另一个线索是、Win10/CCS7.0.0.00042 和 Win7/CCS7.0.0.00042上的十六进制文件不同。 以下是差异:

    Win10/CCS7.0.0.00042 'Project'十六进制文件= 139、109字节且'Stack'十六进制文件= 134、316字节
    Win7/CCS7.0.0.00042 'Project'十六进制文件= 139、125字节且'Stack'十六进制文件= 135、511字节 

    感谢大家对这一肮脏交易的帮助...

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

    您好 Dale、

    很高兴知道您找到了解决您的问题的方案并能够继续前进。 理想的方法是将代码移植到最新 BLE Stack 的示例程序。 在此期间、移植会验证程序的每个功能。 这更像是从头开始。  它有很多工作要做、但可以做。  

    如果此论坛不足以帮助解决您的问题。 有一些替代方案、例如贵公司招聘技术顾问来克服这一障碍、因此您的硬件上会运行一个工作计划。

    -kel

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

    尊敬的 Markel:

    如果我聘请专家完成所有有趣的工作、会给我的大脑带来什么挑战?  我认为生命是要学习直到你死去。  我感谢这里的所有帮助、并希望其他人能在这一极其复杂的产品领域中找到我的解决方案。  我知道我抱怨了很多,但请用一粒盐来拿,我的意思是没有伤害。  我怀疑我是否会将该项目移植到最新和最出色的 BLE 堆栈(如果我可以在一天内完成、但我认为不会这样做)。   在可预见的未来,我还有太多其他事情要征服。  通过 Google 我和您可以进一步了解我在这方面的立场。

    现在、在这个项目的下一个火灾中...

    戴尔

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

    您好 Dale、

    很好地解决了这个问题!

    我很乐意为您提供“下一个火”的帮助:)

    最棒的

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

    [引述 user="Clement "]我很乐意为您提供有关"下一个火"的帮助:)

    谢谢,但您可能会很抱歉,您说了;)