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.

[参考译文] CCS/LAUNCHXL-CC2650:简单广播设备广播意外停止!!

Guru**** 2609895 points
Other Parts Discussed in Thread: INA169, CC2640

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/919990/ccs-launchxl-cc2650-simple-broadcaster-advertising-stops-unexpectedly

器件型号:LAUNCHXL-CC2650
主题中讨论的其他器件:INA169CC2640

工具/软件:Code Composer Studio

大家好、

我正在研发基于 BME680 (通过 i2c)的超低功耗传感器节点。 我从简单广播设备项目开始、并进行了一些修改。 我添加了 i2c 和 BME API 所需的代码和库。 此外、在 main 函数中、我添加了待机功耗策略、以在 BLE 广播间隔期间节省功耗。

在 BLE 广播设备初始化函数中、我将步态广播关闭时间保持为0、这应使广播持续30秒、但我仅希望广播1秒、我通过[GAP_SetParamValue (TGAP_LIM_ADV_TIMEOUT、1);]此命令执行了这一操作。 在每个广播包1秒后、它应自动禁用广播。

我不太熟悉 TI-RTOS 的详细信息、因此在原始无限循环之前的主要 BLE 广播设备任务函数中、我创建了另一个无限循环、这样它绕过原始循环并在那里编写了我的重复代码。

在这里、我正在读取 BME 传感器生成数据包、将其上传到 GAP 并开始广播、然后器件在下一个广播包之前进入睡眠状态10秒。

这种情况预计会无休止地重复。 但是在测试时、我发现只有在12/13广播后、没有更多的广播、但 MCU 仍在运行、消耗恒定~3.5mA 的电流。 尽管在前12/13个数据包期间,电流按预期输出(广播期间为6mA,睡眠10秒期间为50uA)... 但之后它被卡住了...

*** I 使用万用表和 INA169电流监控器模块测得的电流。

有什么想法吗? 另外、请帮助我了解在广播设备任务函数内给定无限循环的默认用途是什么。 绕过它可能导致了问题?

提前感谢、

Jawad。

void upload_adv_TO_GAP (){
GAPRole_SetParameter (GAPROLE_advertise_data、sizeof (advertData)、advertData);
}


void turn on _adv(){
uint8_t my_adv_en = true;
GAPRole_SetParameter (GAPROLE_advertise_enabled、sizeof (uint8_t)、&my_adv_en);
}



void turn off _adv(){
uint8_t is _adv_enabled = false;
GAPRole_SetParameter (GAPROLE_adverted_enabled、sizeof (uint8_t)、&Is_Adv_enabled);
}



静态空 SimpleBLEBroadcaster _init (void)
{
//(void)
//在调用 iCall_registerApp 之前可能会发生 N0栈 API 调用
//
//将当前线程注册为 ICall 调度程序//
以便应用程序可以发送和接收消息。
iCall_registerApp (&selfEntity、&sem);

//对 DB 地址进行硬编码、直至 CC2650板获得其自己的 IEEE 地址
// uint8 bdAddress[B_ADDR_LEN]={0x33、0x33、0x33、0x33、0x33、0x33、0x33、 0x33};
// HCI_EXT_SetBDADDRCmd (bdAddress);

//创建一个 RTOS 队列,用于将来自配置文件的消息发送到应用程序。
appMsgQueue = Util_constructQueue (&appMsg);

//打开 LCD
dispHandle = Display_open (Display_Type_LCD、NULL);

//设置 GAP 广播设备角色配置文件
{
//对于所有硬件平台,设备在初始化时开始广播
uint8_t inited_advertising_enable = true;

//通过将此值设置为零,器件将在之后进入等待状态
//可发现30.72秒,并且不会再次进行广播
//直到启用程序设置回 true
// uint16_t gapRole_AddertOffTime = 0;
uint16_t gapRole_AddertOffTime = 0;

//此项已修改。 原始代码具有可扫描的非定向类型
uint8_t advType = GAP_ADTYPE_ADV_NONCONN_IND;//使用非连接的广播


//设置 GAP 角色参数
GAPRole_SetParameter (GAPROLE_advertise_enabled、sizeof (uint8_t)、&initial_advertising_enable);
GAPRole_SetParameter (GAPROLE_GOOD_OFF_TIME、sizeof (uint16_t)、&gapRole_AddertOffTime);
GAPRole_SetParameter (GAPROLE_SCAN_RSP_DATA、sizeof (scanRspData)、scanRspData);
GAPRole_SetParameter (GAPROLE_Adv_DATA、 sizeof (advertData)、advertData);
GAPRole_SetParameter (GAPROLE_ADV_EVENT_TYPE、sizeof (uint8_t)、&advType);
}

//设置广播间隔
{
uint16_t advInt = default_advertising_interval;
//设备处于有限的可发现模式。
//广告只运行1秒。
GAP_SetParamValue (TGAP_LIM_ADV_TIMEOUT、1);
GAP_SetParamValue (TGAP_LIM_DISC_ADV_INT_MIN、advInt);
GAP_SetParamValue (TGAP_LIM_DISC_ADV_INT_MAX、advInt);
GAP_SetParamValue (TGAP_GEN_DISC_ADV_INT_MIN、advInt);
GAP_SetParamValue (TGAP_GEN_DISC_ADV_INT_MAX、advInt);
}

//启动器
件空 GAPRole_StartDevice (&simpleBLEBroadcaster _BroadcasterCBs);
// Display_print0 (dispHandle、0、0、"BLE 广播设备");

}



静态空 SimpleBLEBroadcaster _taskFxn (UARg a0、UARg A1)
{

ledPinHandle = PIN_OPEN (&ledPinState、ledPinTable);
//使 LED 闪烁。 程序已启动的视觉效果。
PIN_setOutputValue (ledPinHandle、OP、1);毫秒延迟(2000);PIN_setOutputValue (ledPinHandle、 OP、0);

I2C_initialization();
I2C = I2C_open (Board_I2C、&i2cParams);

SimpleBLEBroadcaster _init ();

毫秒延迟(5000);//5s 延迟
sensor_initialization();//init the BME680
sensor_configuration ();//config the BME680


for (;)
{
sensor_read_data (); //通过 i2c 从 BME680读取环境数据
SLEEP_BME680(); //将 BME680设置为睡眠模式
load_adv_buf (); //将 BME 数据加载到广播缓冲区中
upload_adv_TO_GAP (); //使用步态参数设置上传高级缓冲区
turn on Adv (); //使用步态参数设置来启用广播
毫秒延迟(10000);//10s 延迟
}


//应用程序主循环
(;){



//等待与调用线程关联的信号量。
//请注意、当发出信号时、与线程关联的信号量会发出信号
//消息在线程的消息接收队列中排队,或在何时排队
// 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)
{
IF (((src =ICALL_SERVICE_CLASS_BLE)&&(dest =self Entity))
{
//处理任务间消息
SimpleBLEBroadcaster _processStackMsg ((iCall_HDR *) pMsg);
}

if (pMsg)
{
iCall_freeMsg (pMsg);
}
}

//如果 RTOS 队列不为空,则处理应用程序消息。
while (!Queue_empty (appMsgQueue))
{
sbbEvt_t *pMsg =(sbbEvt_t *) Util_dequeueMsg (appMsgQueue);
if (pMsg)
{
//处理消息。
SimpleBLEBroadcaster _processAppMsg (pMsg);

//从消息中释放空间。
iCall_free (pMsg);
}
}



}



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

    尊敬的 Jawad:

    我对你的调查迟迟未得到答复深表歉意。

    我假设您使用的是 BLE Stack 版本2.2.4、但如果情况并非如此、请更正我的错误。

    是的、请避免绕过应用程序主循环。  

    您的应用程序代码可在不同的 RTOS 任务上实现。 请阅读开发人员指南(SWRU393_CC2640_BLE_Software_Developer's Guide.pdf)中的第10.3节"创建其他任务"、您可以在安装目录的\docs 下找到该指南。 通常 为 C:\ti\simplelink\ble_sdk_2_02_04_06。

    如果您有更多问题、请尝试此操作并告知我。

    -Luis

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

    尊敬的 Luis:  

    非常感谢。 我设法使它在周期性事件中正常工作。

    -Jawad。