Thread 中讨论的其他器件: CC2650
早上好、
我们从一年前开始将 CC2640用于我们的项目、有时会遇到问题、我找不到其来源。
几天后、广播似乎被禁用、VDDR 引脚和 DCOUP 引脚上的电压降至零。 据我所知、进入此状态的唯一方法是在系统工作时将全局电压功率降低至~1.7V。 我们在 VDDS 引脚上使用 CR1616电池和2x47uF 钽电容器、其他一切与参考设计类似。
是否还有其他可能(如软件问题)导致此状态? 是否可以防止系统或触发此电压?
提前感谢
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用于我们的项目、有时会遇到问题、我找不到其来源。
几天后、广播似乎被禁用、VDDR 引脚和 DCOUP 引脚上的电压降至零。 据我所知、进入此状态的唯一方法是在系统工作时将全局电压功率降低至~1.7V。 我们在 VDDS 引脚上使用 CR1616电池和2x47uF 钽电容器、其他一切与参考设计类似。
是否还有其他可能(如软件问题)导致此状态? 是否可以防止系统或触发此电压?
提前感谢
尊敬的 Christin:
非常感谢您的回答、这对我非常有帮助。
我发现、当我停止现有连接时、根据我在软件中执行的操作、应用程序会使用大量电流。 借助3倍47uF 钽电容器和 CR1616 (可能使用20%)、我捕捉了800mV 压降、接近2V。
在下图中、我以200ms 的间隔连接、然后我退出双连接。 在压降之前、传感器控制器在间隔连接之间驱动电机。 在压降之后、我们可以看到广播电流消耗。
我认为、当我启动一个新任务(用于在系统处于待机模式时使用传感器控制器控制电机)时、这个问题就会出现。
我的电路上出现了新的压降、这个压降会使系统崩溃。 外设只被连接、无电机控制、两分钟后没有读/写、我关闭了连接。 此时电压出现,达到1.81V:
我花了一个下午的时间来追踪这种电流消耗、我看到了5-10次、但每20次尝试一次。 什么会导致如此大的电流消耗?
// RF 输出配置 while (HCI_EXT_SetTxPowerCmd (HCI_EXT_TX_POWER_0_DBM)!=成功) Task_sleep (10); while (HCI_EXT_SetMaxDtmTxPowerCmd (HCI_EXT_TX_POWER_0_DBM)!=成功) Task_sleep (10 ~);while (HCI_0_CLT_connection_ACT_RET_RET_RET_ACT_ACT_RET_ACT_ACT_ACT_ACT_ACT_ACT_ACT_ACT_ACT_ACTION (H/ t) ~ /(HT_RET_RET_ACT_ACT_RET_ACT_ACT_ACT_ACT_ACT_ACT_RET_ACT_ACT_ACT_RET_ACT_ACT_ACT_ACT_ACT_RET_ACT_ACT_ACT_RET_ACT_ACT_ACT_RET_ACT_ACT_ACT_ACT_ACT_ACT_ACT_ACT_ACT_ACT_ACT_ACT_ACT_RET_RET_ACT_ACT_
欢迎提供任何帮助
我的应用分为两个任务:第一个任务是管理 BLE 事件和配置文件的读取/写入,第二个任务是管理传感器控制器。 第二个任务是在传感器控制器工作时处于待机模式、并在传感器控制器完成任务时每10ms 计时一次唤醒。 然后、它再次启动、直到传感器控制器执行所有步骤。
在第一个任务中,在广播事件之间,每200ms 启动一个时钟,创建一个“Starting_Steps_Events”:
if (event & peri_end_ADV_START_EVT) { event &=~peri_end_ADV_START_EVT;//重置 event Util_stopClock (&Clock_StartSteps);// Stop clk // Start Steps if (gapProfileState == GAPROLE_WAITING_STUFFT = sensor_stock_stocks);//停止时钟/停止步骤 if (gapProfileState = gap_steping = 16);//开始步骤= t SENSOR_st_steps;不等待时间和暂停状态= tor_steps;// 200ms volatile uint16_t scheduled_start = 0; peri_fw21_StartStop_Sensor (steps、0);//启动传感器控制器 //安排下一次启动 if (Flow_adace_cnt_u16_gl < Flow_adt_cnt_max_u16_gl) scheduled time_start_time_pert_sensor_time_for_time_/vert_up_time_vert_gl = pert_time_time_for_time_/vert_time_for_time_time_for_try_v_time_time_for_try_vert_trade_time_/vert_det_gl if (waiting_adv_time_counter_U16_gl <(default_advertising_TIMEOFF - PERIOD_SENSOR_MARGIN)) { Util_restartClock (&Clock_StartSteps、(uint32_t) scheduled_start);//广播管理的起始时钟 Flow_ADAP_cnt_U16_peri = Flow_ADAP_SENSOR_STATUS_U16; } = volatile Ut_OPT_STATUS = 1 (U16)= Ut_OPT_CLUS_CLUS_CLUS_CLUS_CLUS_CLUS_CLUS_CLUS_CLUS_QUESHOD= 1 = 1 = 1 = 1 (volatile 1 = 1) 1 = 1 = 1 = 1 = 1 (volatile 1 = 1 = 1
StartStop_Sensor 函数将计算我必须执行的步骤、然后创建一个任务来管理传感器控制器。 此任务每10ms 启动一次传感器控制器以执行新步骤。
静态空 Peri_fw21_Sensor_taskFxn (UARg a0、UARg A1) { SensorController_init ();//初始化应用 程序//重置结构 cfg 和状态 scifResetstruct (BV (SCIF_ASSERVISSETENT_ID);BV (SCIF_STRUCTOR_STEFFT ) ;task.STRUCTOR.STEFFT = STEFFT = STEFFT = STEFFT;task.STRUCTOR.STEFFT = STEFFT = STEFFT = STEFFT = STEFFT = STEFFT;task.STRUCTORT.STEFFT = STEFFT = STEFFT = STEFFT = STEFFT = STACT.STACT.STEFFT;task.STEFFT = STACT.STEFFT = STACT.STEFFT = STACT.STACT.STUISTEST.STUCTORT.STUART.STUCTORT.ST//重置步骤 scifTaskData.asservissection.cfg 错误步长= 0;//重置错过的步骤 scifTaskData.asservissection.cfg Periodstep = 0;//重置步骤的周期 scifTaskData.asservissection.state.HallDetected = 0;//重置霍尔检测标志 scifTaskAlert.cfg.Periodstep = 0;//从 sciftaskOutrate.state.state.state.state.state= 0;//从 sciftaskAlert.state.state.state.state.state.state.s/semf (s/semiftaskdata.state.state.state.state.state.state.state= 0)// Resetc.alf = 1开始 scifore= 1;//重复 //停止传感器控制 器 scifAckAlertEvents (); while (SensorController_stop ()!= SCIF_SUCCESS){Task_sleep (100);} * Sensor_state = sensor_pause;//通知传感器已执行任务 } //开始一次 init-execute-terminate 会话*/ scif_result_T SensorStartController ( 0xtc00024)// RTC Ch2、bit 15:0 -> 1/65536秒的开始节拍 //打开 AUX I/O 锁存器,在加电后该锁存器的值未定义。 默认 情况下、AUX_AIODIO 将//在所有 I/O 引脚上驱动"0"、因此必须在 IOC HWREG (AUX_WuC_BASE + AUX_WuC_O_AUXIOLATCH)= AUX_WuC_AUXIOLATCH_EN_Transp; scifTaskResourceInit();/ AUX_WuC_AUXIOLATCH = AUXIF/ AUXIFT/TASKERI 终止 任务0x000/ SYSCBIT_TASKIT (AUXIF/ AUXIF/ AUXIF_START)和 SYSCBIST/任务0xBIST/ AUXIF/ AUXIF/任务0xBIST/ AUXIF/ AUXIF/ AUXIF/任务0xBIN)
因此、基本而言、每200毫秒就会创建一个任务来管理传感器控制器。 每次都能正常工作、我不得不等待一天以上才能触发这种电流。 它发生在 Start_Steps 事件发生时、并使用25ms 达到12mA。 然后下降、我的时间再次得到尊重。 但我的应用程序没有使用这些25ms、这是错误的、因为它会在我的全局计时表中创建一个移位。
昨天我还尝试了其他东西:我没有使用电池,而是使用了电源。 同时、我更改了软件、以便在每次启动前下拉驱动电机的两个输出。
它整夜都在转动、屏幕上没有显示任何内容。
今天上午、我使用智能手机来停止电机、并开始一个包含更多步骤的新测试。 当我停止 BLE 时、我发现了一些非常有趣的东西。 第一张图片是一切正常时的断开连接:大约需要20ms,我选择在连接结束和广播开始之间等待一些时间(以便在这两个事件之间让电池恢复)。
最大电流7.4mA
以下是我今天上午停止 BLE 时的当前图片(配置、软件、电源以及所有内容与上一张图片相同):
使用的最大电流为12.5mA、两个事件所用的时间为43ms。 在前面的测试中、我们在我的传感器控制器任务开始时看到电流峰值为12mA、持续25ms。 在这里、传感器控制器任务被阻止、等待广播结束、然后再再次使用电机。
在以下情况下检测到电流峰值:
-断开 BLE 连接并开始广播(多次)
-在 Gaprole 等待时启动电机和传感器控制器。
如果传感器控制器、任务创建或电机控制是问题所在、我应该在夜间看到它。 我再次以全速启动系统。 无 BLE 连接、仅在该配置中存在峰值时等待。 但我的 CC2640似乎有一个奇怪的行为...
您好!
我还没有解决这个问题、但今天我将构建一个小型触发系统、以便使用引脚中断来停止 CC2640并查看 RTOS 对象查看器内部。 最近几天发生的事情:
-我尝试更改一些配置参数,如优化或堆栈大小。 没有改变。
我看一下 VDDR 电压,看看它是否在电流峰值之前下降,但没有下降。 它们同时下降。
-我在创建传感器任务之前简化了软件,并且每2分钟(而不是6小时)就会出现更容易捕捉的峰。
-然后我决定不是创建传感器任务,而是让它休眠并使用信标唤醒任务。
-同样,高峰每隔6-10小时出现一次。 因此问题不是创建或唤醒任务造成的。 它与 CC2640或 RTOS 相关。
-当系统唤醒传感器任务时,LED 闪烁;当峰值达到最大值时,LED 闪烁。
现在、我可以得出结论、随着我的应用的全局时序发生变化、该峰值会在使用电机或 I/O 之前出现 系统唤醒时会发生什么情况。 我当前正在运行系统、指示灯在 IcallWait 函数之后闪烁。 我们将看到 LED 是否再次在电流峰值的顶部闪烁。
关于其他问题:
我在连接的 Android 系统中读取 btssnoop_HCI 文件以查看发生了什么。 Android 似乎要求断开连接、收到通知、然后接受断开连接。 它可能来自我的 Android 软件、也许我应该在断开连接之前禁用通知。
我找到了问题。 它来自使用 osal_SNV_WRITE 的闪存存储器写入。
#include
#include
#include
#define two_byte 2
#define four_byte 4
#define 7e_byte 7
#define HI_UINT16 (A)>> 8)& 0xFF
)#define LO_UINT16 (A)(((A)& 0xFF)
#define State_missed_Steps_Current9//当前剂量中错过的步骤数,配置文件值
#define LOG_CODE_LOADD_CUR4. //日志代码编号,用于未完成的步骤
#define LAST_LOG_VALUE0x88 //最后一个日志值的闪存地址
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef enum
{
profile_action = 0、profile_State //配置文件类型、操作或状态
}Profile_type;
void UpdateStepsProfiles (const uint32_t current、const uint16_t missed、const uint8_t flag);
void WriteInProfile (const uint8_t 参数、const uint8_t size、void * ptr_param、const uint8_t flag);cont notification
void WriteLog (void *ptR_param);
int main()
{
//系统从待机状态唤醒,从 scifTaskData 读取值
uint32_t CURRENT_STEPS u32 = 2500; //电机执行一些步骤
uint16_t missed_Steps_u16 = 16; //错过了16个步骤
uint8_t 标志= 0; //通知标志
if (missed_Steps_U16)//所有错过的步骤都写入日志配置文件中
FLAG = 1; //设置标志
UpdateStepsProfiles (Current_Steps_u32、missed_Steps_U16、FLAG);//更新配置文件和日志
返回0;
}
void UpdateStepsProfiles (const uint32_t current、const uint16_t missing、const uint8_t flag)
{
uint8_t missed_steps [two_byte]={0};
if (flag)
{
missed_steps [0]=(uint8_t) HI_UINT16 ((((uint16_t) missed));//((missed>8)& 0xFF);
missing_steps[1]=(uint8_t) LO_UINT16 ((((((uint16_t) misseded)& 0xFF) misseded);missed_steps[1])=(missed_station_state_missed_steps[Uint8_Write_stepse_state_state])))))、
1);
}
}void WriteInProfile (const uint8_t 参数、const uint8_t 大小、void * ptr_param、const Profile_type Profile、const uint8_t Notification_FLAG)
{
uint8_t time[f4_byte]={0};//自开始以来的总时间(数组)
//. 从系统配置
开关(参数)获取时间值的函数
{
案例 State_Missed_Steps_Current: //如果错过了步骤
{
uint8_t missed[two_byte]={0};
memcpy (missed、ptr_param、two_byte);//复制 ptr_param
uint8_t Log_info[7_byte]={time[0]、time[1]、time[2]、time[3]、time_cuded、cual_log_code missed[0]、missed[1]};
WriteLog (Log_info); //在日志配置文件中写入
}
中断;
}
空 WriteLog (空*PTR_param)
{
volatile uint8_t log_index = 0;//要写入日志配置文件的索引
//... 在配置文件中移动日志以插入最后一个日志
log_index = 0;
//... 在配置文件中写入最后一个日志事件、且 LOG_INDEX = 0
//在 OSAL 中写入以在发生复位时保存最后一个事件
osal_SNV_write (last_log_value、7_Byte、ptR_param); // 12mA 峰值电流来自该线
}
我正在尝试通过将地址(LAST_LOG_VALUE)从0x88更改为0x80来使其正常工作、但当前峰值仍在此处、我还在软件中调用了 osal_SNV_WRITE、我删除了它们、但没有更改。
我像官方的例子一样改变了这条线,但没有变化。
//地址 #define LAST_LOG_VALUE 0x80 #define LAST_LOG_VALUE 0x88 //未更改任何内容 //行更改 osal_SNV_write (LAST_LOG_VALUE、7_BYTE、PTR_param); osal_SNV_write (LAST_LOG_VALUE、7_BYTE、 (uint8 *) ptR_param);//未更改任何内容