DA14681 Pro Board适用于调试器,但单独运行时停止

11个帖子/ 0新
最后一篇
neil.伙伴
离线
最后一次露面:1天49分钟前
加入:2016-05-24 09:18
DA14681 Pro Board适用于调试器,但单独运行时停止

嗨,对话框,
我构建基于PX Reporter的应用程序,在连接到中央设备时,添加一个定时器以通过适配器从I2C总线读取数据。
最奇怪的是,它在jlink JTAG模式下工作很好,但在连接后停止并单独工作时发送多个数据数据包。我使用附加功能,发现它在HW_HARD_FAULT.C的循环中结束。
是什么原因?
非常感谢。
问候。

附件:
设备:
im_dialog.
离线
最后一次露面:2周1天前
加入:2016-12-06 22:25
嗨段,

嗨段,

硬故障处理程序(功能hw_hard_fault.c中的hardfault_handlerc)将堆栈帧复制到内存中的固定位置。此堆栈框包含许多参数,可以帮助您找到硬故障的源。首先要开始的PC - 这是在发生硬故障发生时程序计数器的值I.E。它将指向正在执行的指令,导致硬故障。您可以使用调试器访问PC的值。附加并在硬盘处理程序中查找执行的代码(1)循环检查内存位置状态_base + 0x18 - 这将包含PC的值。status_base的值可以在hw_hard_fault.c文件中找到。一旦您有PC,您可以了解哪些指令(因此C代码的WHCH线)导致硬故障。

im_dialog.

neil.伙伴
离线
最后一次露面:1天49分钟前
加入:2016-05-24 09:18
谢谢你的帮助。

谢谢你的帮助。按照您的说明,我发现硬件故障原因的PC为0x7fd11e0。
找出发生的事情是有助于的吗?

neil.伙伴
离线
最后一次露面:1天49分钟前
加入:2016-05-24 09:18
嗨,对话框,

嗨,对话框,
我本周末做了一系列测试:
1.简化了我的代码仅包括一个init函数,到init gpio和i2c异步交易,一个读取功能,从imu读取寄存器,并将其打印到UART。

2.将我的驱动程序代码移动到“Clean”BLE_PLE_PERITELAL项目,在任务开始时添加init,将计时器添加到ble_peripheral_task,然后在for for(;;)循环之前启动它,并且当任务接收计时器通知时,从i2c读取数据。

void ble_peripheral_task(void * params)
{
Int8_t wdog_id;
ble_service_t * svc;
OS_TASK句柄= null;
my_peripheral_init();

......
SNS_TIMER = OS_TIMER_CREATE(“SNS”,PORTCONVERD_MS_2_TICKS(100),OS_TIMER_SUCCESS,
(void *)os_get_current_task(),sns_timer_cb);
os_assert(sns_timer);
os_timer_start(sns_timer,os_timer_forever);
......
if(notf&sns_timer_notif){
refresh_sensor();
}
......
但几秒钟后,UART打印停止了。当Attch时,我发现该程序在Sys_Power_Mgr.c的第2132行运行:
//暂停任何正在进行的QSPI程序/擦除操作。
if(op!= null){// 2132
dbg_set_high(flash_debug,flashdbg_suspend);

if(qspi_check_and_suspend()){
OP->暂停=真;
}

dbg_set_low(flash_debug,flashdbg_suspend);
}
}

3.我尝试了另一种方式,删除了SNS_Timer,然后删除了(;;)之前的无限循环,在BLE服务开始之后:
而(1){
refresh_sensor();
os_delay(50);
}
就像之前一样,几秒钟后,UART打印停止了。当Attch时,我发现该程序在Sys_Power_Mgr.c的Line1513中运行:
/ *
* 睡觉
* /
__WFI();

/ *确保代码将以最快的速度执行。* /
如果(!allow_entering_sleep){// 1513
hw_cpm_set_hclk_div(ahb_div1);
}
4.我创建了一个新的任务,比ble_peripheral_task更低的优先级。除了循环中什么也不做:
而(1){
refresh_sensor();
os_delay(50);
}
我得到了与3的结果相同。
所有测试的2,3,4我尝试了pm_stay_alive()函数,或者不要启用看门狗,但同样的结果。

5.最后一次测试,我在下一行初始循环时,在所有BLE SEVICE开始之前。这次I2C数据读得很好!

void ble_peripheral_task(void * params)
{
Int8_t wdog_id;

ble_service_t * svc;
OS_TASK句柄= null;
my_peripheral_init();
而(1){
refresh_sensor();
os_delay(50);
}
.....

它似乎读取I2C经常无法与BLE堆叠共存。什么是问题?

为您的回复循环。
谢谢你。

im_dialog.
离线
最后一次露面:2周1天前
加入:2016-12-06 22:25
你应该能够阅读一个

您应该能够通过I2C读取设备并仍执行BLE操作。您可以发布您使用的代码,以初始化I2C接口并读取传感器。

neil.伙伴
离线
最后一次露面:1天49分钟前
加入:2016-05-24 09:18
嗨im_dialog,

嗨im_dialog,
谢谢你尊敬地重播。这是init代码:
bool i2c_devices_async_init(void)
{
BOOL RET1,RET2;
静态const i2c_config cfg = {
.speed = hw_i2c_speed_standard,
.mode = hw_i2c_mode_master,
.ddr_mode = hw_i2c_addressing_7b,
};

hw_i2c_init(hw_i2c1,cfg);
srand(os_get_tick_count());

/ *
*获取温度传感器设备的手柄。
*此调用尚未配置I2C控制器。
* /
// tpdev = ad_i2c_open(tp_mms427);
imudev = ad_i2c_open(imu_lsm6ds3);
// magdev = ad_i2c_open(mag_ak09915);
/ *
*创建将由GUI使用的事件等待I2C事务完成。
*此活动将用于从GUI任务访问温度传感器或EEPROM。
* /
init_event(&i2c_signal);

// ret1 = tp_device_init();

ret2 = imu_6axes_init();
/ * Ret1 = Ret1 && Ret2;

ret2 = mag_device_init();
Ret1 = Ret1 && Ret2;

//仅进行测试
mag_set_power_mode(4);// 100Hz刷新
* /返回(RET2);
}
和刷新传感器代码,在计时器中突出的折断通知:
静电void refresh_sensor(void)
{
Int32_t imudata [6];
int16_t magdata [3];
uint8_t k1status,tpirqstatus;
uint8_t xy [2];

// pm_stay_alive();
k1status =(uint8_t)hw_gpio_get_pin_status(app_button_gpio_port,app_button_gpio_pin);
tpirqstatus =(uint8_t)hw_gpio_get_pin_status(tp_irq_gpio_port,tp_irq_gpio_pin);

if(imu_6axes_read_data(imudata)){
printf(“IO:%d |%d acc:%d,%d,%d,”,k1status,tpirqstatus,(int)imudata [0],(int)imudata [1],(int)imudata [2]);

printf(“gyro:%d,%d,%d \ r \ n”,(int)imudata [3],(int)imudata [4],(int)imudata [5]);
}
/ * if(tp_drv_read_coorder(xy)){
printf(“tp:%u,%u”,xy [0],xy [1]);

}
if(mag_device_read(magdata)){
printf(“mag:%d,%d,%d \ r \ n”,magdata [0],magdata [1],magdata [2]);

* /
// pm_resume_sleep();

}

函数IMU_6AXES_READ_DATA使用IMU_I2C_READ函数从IMU读取多个寄存器并计算值:

BOOL IMU_I2C_READ(UINT8_T * PBUFFER,UINT8_T DEVICEADDR,UINT8_TREGRARADDR,
uint16_t numbytetoread)
{
bool ret = false;

ad_i2c_device_acquire(imudev);

if(hw_i2c_abort_none!= = i2c_device_read_async(imudev,&regreadAddr,pbuffer,1,numbytetoread,&i2c_signal))
转到退出;

ret = true;

出口:
ad_i2c_device_release(imudev);
返回Ret;
}
I2C读取寄存器功能:信号相关的功能与I2C_DEMO.C中的相同。

static hw_i2c_abort_source i2c_device_read_async(i2c_device dev,uint8_t * reg,const uint8_t * buf,uint8_t reglen,
UINT8_T BUFLEN,I2C_EVENT *事件)
{
/ *
*确保事件尚未处于信号状态;
* /
reset_event(事件);

/ *
*编写传感器寄存器,使用回调将信号发生同步。
* /
AD_I2C_ASYNC_TRANSACT(DEV,I2C_SND(REG,REGLEN),I2C_RCV(BUF,BUFLEN),
i2c_cb1(signal_event,事件),i2c_end);
/ *
*等待交易完成。
* /
wait_for_event(事件);

/ *
*错误代码如果在事件中存储,则返回它。
* /
返回Event->错误;

}

我需要强调,在系统停止之前,我可以成功识别并读取数十次的IMU数据。printf输出如下:

2017/1/11 10:08:05.658 [rx] -
IMU XG_ID:0x69
广告开始!
IO:1 | 1 ACC:-38,16,1043,陀螺仪:1680,-10710,-7630
IO:1 | 1 ACC:-38,16,1041,陀螺仪:1610,-10570,-7630
IO:1 | 1 ACC:-38,16,1041,陀螺仪:1680,-10640,-7630
IO:1 | 1 ACC:-38,17,1040,陀螺仪:1750,-10640,-7560
IO:1 | 1 ACC:-38,16,1041,陀螺仪:1680,-10640,-7630
IO:1 | 1 ACC:-38,16,1041,陀螺仪:1680,-10640,-7630
......

问候,

im_dialog.
离线
最后一次露面:2周1天前
加入:2016-12-06 22:25
使用I2C适配器时

使用I2C适配器时需要通过将以下内容添加到名为platform_devices.h的文件来配置您的设备和I2C总线。

#如果dg_configi2c_adapterI2C_BUS(I2C1)i2c_slave_device(i2c1,device_a,0x20,hw_i2c_addressing_7b,hw_i2c_speed_standard);I2C_BUS_END.#万一

当您希望初始化您进行以下呼叫的端口时:

i2c_bus_init(i2c1);i2c_device_init(device_a);

我无法在代码中看到这些呼叫,所以我不确定您是否使用此机制,如果不是,那么我建议您相应地更改代码。您可以在以下内容中找到如何使用I2C适配器的一个很好的示例:

da1468x_sdk_btle_v_1.0.8.1050.1 \ projects \ dk_apps \ demos \ peripherals_demo \ demos \ demo_i2c_async.c

neil.伙伴
离线
最后一次露面:1天49分钟前
加入:2016-05-24 09:18
谢谢你的重播。

谢谢你的重播。
我完全遵循演示演示_i2c_async.c。设备的声明是在platform_devices.h的副本中进行的,如demo,如demo:
I2C_BUS(I2C1)

#ifdef config_imu_lsm6ds3.
/ *实施例温度传感器FM75 * /
i2c_slave_device(i2c1,imu_lsm6ds3,0x6a,hw_i2c_addressing_7b,hw_i2c_speed_standard);
#万一
#ifdef config_mag_ak09915.
/ *实施例温度传感器FM75 * /
i2c_slave_device(i2c1,mag_ak09915,0x0c,hw_i2c_addressing_7b,hw_i2c_speed_standard);
#万一

但我找不到任何初始化,如i2c_bus_init(i2c1);在演示中。所以我没有在以前的代码中添加它们。

我在硬件init和设备打开之间将宏添加宏:
hw_i2c_init(hw_i2c1,cfg);
srand(os_get_tick_count());
i2c_bus_init(i2c1);

i2c_device_init(imu_lsm6ds3);
i2c_device_init(mag_ak09915);
/ *
*获取温度传感器设备的手柄。
*此调用尚未配置I2C控制器。
* /
// tpdev = ad_i2c_open(tp_mms427);
imudev = ad_i2c_open(imu_lsm6ds3);
magdev = ad_i2c_open(mag_ak09915);

但同样的结果。我应该接下来怎么样?谢谢!

mt_dialog.
离线
最后一次露面:1个月1周前
职员
加入:2015-06-08 11:34
嗨Neil.伙伴,

嗨Neil.伙伴,

你提到代码卡住的点,它没有卡住,(没有(1)或任何断言使您​​的代码卡住),代码仍然执行(可以检查您是否能够查看任何广告代码摊位的空气)。当您附加并且您在这些点处找到代码是因为代码经常或在__wfi()案例中浏览这些点,它只等待发生中断。您提到的硬盘是一种不同的原因,它不是一个BLE或适配器的原因,HardFaults发生在内存中未alalign的访问,对空指针函数,记忆损坏等的调用。我建议做的是检查FW通过系统查看器或臭氧调试器,检查任务和使用的适配器会发生什么,也可以轮询传感器并以较小的频率打印并检查系统是否无法打印。我们非常困难地假设代码可能出现问题,但由于您使用的适配器,SDK应该正确处理BLE事件和I2C交易。

谢谢mt_dialog.

Mahmed106.
离线
最后一次露面:4周59分钟前
加入:2019-05-03 17:28
我也有同样的努力

我也有相同的硬故障问题。但它只是在其中一个板上发生的。我总共有2个董事会。其他工作完全正常。

I M还使用I2C适配器进行I2C传感器读取温度。这个问题的解决方案是什么,,,,?任何人都可以帮助我吗?

PM_DIALOG.
离线
最后一次露面:14小时前1天
职员
加入:2018-02-08 11:03
嗨mahmed106,

嗨mahmed106,

谢谢你的评论。在以下论坛主题下,我已经回复了您:

https://support.dialog-semicondiondiondiondum/forums/post/dialog-smartbond-bluetooth-low-energy-%2%80%93-software/da14681-hardfault-when-reading-i2c.

谢谢,PM_DIALOG.