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.

[参考译文] CC2640:BLE 无线电出现问题

Guru**** 2560390 points
Other Parts Discussed in Thread: CC2640, CC2650, CC2541, HDC1000

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/569019/cc2640-problem-with-ble-radio

器件型号:CC2640
主题中讨论的其他器件: CC2650CC2541HDC1000

您好!

我的基于 CC2640的项目有问题。 我使用了大量 simpleBLEperipheral 项目、并添加了 I2C 接口(温度和湿度传感器)、2个新特性和 ADC (用于测量电池电平)。 我的问题是在随机时间(15分钟- 2小时)后使无线电 BLE 发生故障、我必须重置整个 CC2640才能再次开始广播。
当无线电停止工作时、我可以在示波器上看到时钟中断。
我找到了一个小解决方案、当我禁用省电时、一切都很顺利。 但现在功耗要大得多。
可能有人也有类似的问题。 您能提供一些建议或解决方案吗?

祝你度过美好的一天!
SK

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

    我无法仅从描述中得知(您没有提供有关开发套件或定制 PCB 以及 BLE SW 版本的详细信息)、但我建议您浏览 CC2640 SW 开发人员指南(SWRU393)中的调试一章。 我会检查堆内存是否耗尽以及您是否从 BLE 堆栈中收到任何事件。 此外、建议单独添加您的功能以确认问题发生的时间。

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

    您好!

    感谢您的回复。 当我使用调试器时、一切工作正常(不使用 PowerSaving 选项并使用 PowerSaving 选项)。 使用电池或直流(3.3)电源时出现问题。 在电池供电设备上、我可以看到"无线电冻结"更少。
    可能问题是广告的时钟是不能被传播的?

    我还尝试了大量添加功能、但这只是改变了崩溃的时间。

    我在硼上测试了软件:
    -基于 CC2640 (5x5)的定制板、
    -基于 CC2640 (4x4)的定制硼、
    - LSR Sable-x 开发板(4x4)、
    - LaunchPad CC2650 (7x7)。

    如果错误发生、则堆栈溢出会产生错误、因此应在所有电路板的同一时间发生。 我是对的吗?
    祝你一切顺利、

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

    您的软件在哪个电路板上工作正常? 如果移除 I2C 和 ADC、您的软件是否正常工作?

    请注意、LSR SaBLE-x 是采用 CC2650EM_5XD 天线布局的5x5。

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

    我已检查并更改所有 CC2640板的板级配置文件。

    当我禁用 PowerSaving 选项时、SW 在所有电路板上都能正常工作。 此外、我可以看到、在电池供电设备上运行得更好。 在 Sable-x 开发板上、无线电崩溃偶尔发生(一个持续3、4天)。

    不带 I2C 和 ADC 的全新 SimpleBLEPeriheral 项目(启用 PowerSaving)在所有电路板上都能正常工作。

    祝你一切顺利、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否可以按照软件开发人员指南第9节执行异常句柄、以查看是否能够在异常句柄未运行时提取更多信息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Christin、

    我无法捕获任何异常句柄。 主 Cortex 仍然运行、我可以看到时钟中断和闪烁 LED。 我认为时钟有问题、该时钟负责从空闲任务唤醒广播状态。 这证实了不同电路板上的不同工作、Wchich 的电源过滤有所不同。

    调试器版本堆栈和版本之间有何差异?

    Regars
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果时钟对象仍在运行、则表示调度程序没有问题。 SW 时钟来自调度唤醒的相同时钟源。

    是否可以使用范围扩展器来检查是否实际没有无线电活动? 您可以在下面找到包含所需信息的 wikipage:
    processors.wiki.ti.com/.../CC26xx_Range_Extender_Control

    连接调试器与未连接调试器时、如果器件将进入适当的待机状态、则主要区别在于连接了调试器。
    连接调试器时、JTAG 域将保持开启状态。
    换言之、软件堆栈没有实际差异。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    目前、我无法使用范围扩展器。 我只能检查示波器和监听器上的无线电活动。 当对讲机处于"冻结"状态时、我无法与其连接(有任何 BLE 响应用于连接查询)。 而在示波器上只显示时钟中断。
    您是否有什么想法会导致此问题?

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议您逐段注释添加的代码段、并查看代码的哪一部分导致了它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我找到了此主题:
    e2e.ti.com/.../314805
    这与 CC25xx 有关、但描述了一个类似的问题。

    "变量 HAL_SLEEP_ADJ_TICKs 正在调整睡眠定时器比较值、以补偿堆栈在函数 halSleep 中使用的时间。
    对于 CC2541、默认情况下、在 hal_sleep.c 的最新堆栈中、该值设置为25个睡眠定时器节拍、而不是35 (默认值)
    这可能会导致无线电发生故障、因为设备会在发生无线电事件之前及时唤醒、以使晶体正常稳定。
    如果您的晶体启动时间比我们的参考设计慢、您可能需要通过更改 HAL_SLEEP_ADJ_TICKs 来增加此预唤醒保护时间。"

    CC2640库中是否有任何等效参数?
    我能否仅复位 CC2640的无线电部分而不在 RAM 存储器中设置值?

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CC26xx 具有与 CC2541完全不同的架构。 这不适用于您在此处看到的内容。 同样、我建议您逐段添加代码段、看看代码的哪一部分会导致程序崩溃
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我进行了一些测试。 很难说、对代码的细分是有罪的。 因为设备在"冻结"之前有不同的时间(例如4天)。 问题似乎是与传感器控制器的连接。 当我使用 I2C 和 ADC 时、无线电崩溃的发生频率更高。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否发布代码片段或简单地解释如何将代码集成在一起?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你的帮助。

    我可以通过邮件向您发送我更改的 i2c 库和代码片段。
    这是与 SimpleBLEPeripheral 相比的变化:
    -禁用 ScanRemspse、
    -设置 SBP_TASK_STACK_SIZE=1024、
    -自己通过实际测量(电池电量、温度、湿度)广播数据、
    -添加两个特征、并在读取、写入时更改其预先访查(其中一个具有通知和长度= 20)、
    -更改服务 UUID、
    -添加负责发送通知的功能,
    -删除 Display.h 和此库的部分代码连接、
    参数更改:广播间隔(200ms)、max_Connection_interval、
    -添加 SBP_ADV_CB_EVT (通告后的事件)、
    -添加 i2c 库驱动程序(不含信标-我使用信标进行了测试、结果相同)、
    -添加 SHT20库、
    -预定义的 TI_drivers_I2C_include、
    -将此片段添加到 boardfile 中:
    /*======================================== I2C BEGIN================================================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (I2C_CONFIG、".CONST:I2C_CONFIG")
    #pragma DATA_SECTION (i2cCC26xxHWAttrs、".const:i2cCC26xxHWAttrs")
    #endif

    /*包含驱动程序*/
    #include

    /* I2C 对象*/
    I2CCC26XX_Object i2cCC26xx 对象[1];

    /* I2C 配置结构,描述要使用的引脚*/
    const I2CCC26XX_HWAttrsV1 i2cCC26xxHWAttrs[1]={

    baseAddr = I2C0_BASE、
    powerMngrId = PowerCC26XX_Periph_I2C0、
    .intNum = INT_I2C_IRQ、
    .intPriority =~0、
    .wiPriority = 0、
    sdaPin = IOID_2、
    .sclPin = IOID_1、

    };

    const I2C_Config I2C_CONFIG[]={

    .fxnTablePtr =&I2CCC26XX_fxnTable、
    .object =&i2cCC26xx 对象[0]、
    hwAttrs =&i2cCC26xxHWAttrs[0]
    }、
    {NULL、NULL、NULL}
    };
    /*
    *========================================= I2C 结束========================================================
    *

    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在什么条件下执行 I2C 和 ADC?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    I2C 在周期性时钟事件中执行:

    bool SensorHdc1010_start (空)

    uint8_t val;

    sensor_select();

    Val = HDC1000_REG_TEMP;
    Success = SensorI2C_WRITE (&V、sizeof (val));

    sensor_deleset();
    返回成功;


    delay_ms (15)之间;

    bool SensorHdc1010_read (uint8_t * rawTemp、uint8_t * rawHum)

    bool 有效;
    uint8_t bufor[4];
    if (成功)

    如果(!sensor_select())

    返回 false;


    Success = SensorI2C_Read (bufor、4);
    DELAY_MS (1);
    sensor_deleset();

    //存储温度
    rawTemp[0]= bufor [0];
    rawTemp[1]= bufor [1];

    //存储湿度
    rawHum[0]= bufor [2];
    rawHum[1]= bufor [3];

    有效=成功;
    Success = true;//为下一个周期做好准备

    退货有效;


    稍后我更新 advertData。
    I2C 始终处于打开状态。

    和 ADC 我在广播结束时使用的 evet:
    if (pEvt->EVENT_FLAG & SBP_ADV_CB_EVT){
    sumBAT++;
    if (sumBAT > default_battery_interval/(25*advertData[AdvIntervalN])){
    advertData[BatteryN]=电池测量();
    sumBAT=0;
    GAPRole_SetParameter (GAPROLE_adverted_data、sizeof (advertData)、advertData);





    uint8_t 电池测量(空)

    uint32_t percent;

    //读取电池电压(V)、仅读取前12位
    Percent = AONBatMonBatteryVoltageGet ();

    //转换为从 V 到 mV 以避免分数。
    //小数部分在低8位中,因此转换操作如下:
    //(1/256)/(1/1000)= 1000/256 = 125/32
    //通过乘以125然后移位来最有效地完成此操作
    //右侧5位。
    Percent =(Percent * 125)>> 5;
    //转换为最大电压的百分比。
    Percent =(Percent * 100)/BATT_MAX_VOLTAGE);

    退货百分比;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据您发布的代码、您的程序看起来不像使用传感器控制器引擎。 您遇到的问题与传感器控制器无关。

    当您提到 ADC 时、您意味着使用片上电池监控器 ADC 来实现电池电压回路。

    如果可能、您能否尝试排除所有 I2C 器件并运行代码的电池监控器部分? 我认为这不是程序崩溃的原因。

    I2C 任务的周期时钟周期是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    范围为1 - 20秒。 我认为模块 i2c 和 ADC 是传感器控制器的一部分。
    我不知道为什么、当我禁用 POWERSAVING 模式时、一切都正常。

    是的、我可以。 但这种测试需要很多时间、两天之后会发生一些崩溃。

    此致