主题中讨论的其他器件:INA169、 CC2640
工具/软件: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);
}
}
}