我们正在使用Dialog DA14681 MCU、LIS331HH加速度计和MMC3416磁力计开发一个物联网设备。
一切连接良好,我们从两个传感器(通过SPI加速和通过I2C磁电机)获得读数。
我们发起BLE连接的那一刻,一切都变得可怕的错误。
使用LIS加速度计,在最初8秒的操作中,加速度计通过SPI给出正确的读数,然后只输出所有3个轴的0。当使用UART调试器进行测试时,我们看到一大堆奇怪的数据,这显然是不正确的。当我们把它切换到12C接口来测试UART调试器在8-10秒后停止了,什么也没有给我们。
I2C上的磁强计也有类似的问题。
作为一个合理的新组件DA14681已经有点噩梦,但我希望有人遇到同样的问题,有一些简单的东西,我们已经错过了解决这个问题。
任何建议都是非常方便的!我附上了一些屏幕截图,所以你可以看到发生了什么。
设备:
请发送屏幕截图。
https://drive.google.com/open?id=0BxQAX5Lh1nJvLTl4Q2ttaUY1Qmc
是磁强计的调试屏幕吗
和
https://drive.google.com/open?id=0BxQAX5Lh1nJvV0VSNExPRXI0VFE
就是我们在加速度计上看到的。
干杯
本
你好,
请以zip格式发送文件。
谢谢,
达沃
嘿,Stavros图片附在Zip
你好,
我认为问题的根源在于睡眠不足。默认情况下,我们的示例代码使用XTAL32K作为低功耗时钟和在系统进入休眠状态之前,我们要等大约8秒水晶才会稳定下来.在那之后,系统就会进入睡眠模式,然后事情就变成了一场噩梦。首先,我们需要一些信息,更具体地说:
1.所使用的SDK版本和开发工具包类型是什么?
2.您是否使用我们的示例代码(例如ble_adv)构建了源代码?
3.低功率时钟(XTAL32K, RCX)的来源是什么?
下面是一些建议和步骤:
1.我们强烈推荐您使用pm_mode_extended_sleep睡眠模式。
2.您是否使用适配器来访问外设模块?请注意,适配器不仅确保对外围总线的独占访问,而且CPM(电源管理单元)在强制系统进入休眠状态之前,还会处理各种活动的模块。所以,如果你使用低级别的驱动程序而不是适配器,那么系统就不会意识到SPI/I2C活动的存在,并且在睡眠时,它最终会变得一团糟。
我不认为这个问题与不正确使用外围总线有关,因为您能够读取值。此外,BLE活动似乎不会破坏传感器的读数,因为您能够在头8秒获得一些值。请确认,如果在观察到问题之前,使用SmartSnippets工具箱有正常的BLE活动(广告)。
BR,
STS_Dialog。
当传感器不工作时,我们会通过蓝牙接收信号。
外设通过适配器访问。
DA1468x_DA15xxx_SDK_1.0.10.1072是SDK的版本,对于硬件我们使用DA14681 pro开发工具包。
我们的构建是基于SDK的源代码,而不是自定义编写的。
时钟设置与示例代码相同,仅为32.768KHz。RCX被禁用了,但我们在启用它的情况下进行了测试,没有任何改变。
还有其他的建议吗?
你好,
您使用适配器或任务的方式可能有问题。你在我们的SDK中使用的示例代码是什么?如果8秒后你试图与设备连接,并看到此失败或只是系统正在广告,没有任何尝试连接到芯片,请让我知道。
以下几点建议可能会有所帮助:
1.使用SPI/I2C功能时最好使用dma。它们具有更好的通信/功能,并能处理某些情况,例如,当一个高优先级的任务在仍处于活动状态时中断外围总线的操作。
2.当系统进入睡眠状态后,如何从传感器读取值?如何配置系统,让它被告知阅读时间?你是否使用任何定时调用的RTOS定时器?如果有任何延误,必须特别注意。当在RTOS中使用延迟时,任务实际上会进入挂起模式。如果是系统进入睡眠(在延时中)的时间,CPM(电源管理单元)会看到任务被挂起,并强制系统进入睡眠(在任务尚未完成操作的情况下)
3.当使用任何睡眠模式时,UART外设必须与流控制功能RTS/CTS一起使用。请注意,在DA14681芯片中只有UART2有这个功能。
BR,
STS_Dialog。
当我们删除pm_mode_extended_sleep时,一切似乎都工作了。这显然和睡眠呼叫有关,有没有其他的设置可以用于此?
删除前面提到的宏(pm_mode_extended_sleep)系统永远不会休眠。有没有其它选择如果你想使用睡眠模式。正如我所说的,我从一开始就怀疑睡觉后你的配置出了问题。请核实我以上的意见。否则我们就无能为力了。下面是一些可能有助于解决这个问题的技巧:
1.具体在哪里配置各种功能的引脚(SPI/I2C/UART)?你用periph_init ()函数,以便在每次唤醒时调用后者?如果不是,那么CPM在唤醒后不会重新配置引脚到它之前的状态。(他们睡觉前的状态)
2.另外,当设备进入休眠状态时,请检查外设总线,检查是否与传感器有接口?(使用逻辑分析器)。如果你得到像0和无关数据的值,我认为没有交互,你只是打印空变量。
BR,
STS_Dialog。
你好,对话框,
我按照上面的建议做了,但是在8秒之后,我仍然面临I2C的问题。
当我有调试I2C代码,我发现下面的函数哪里程序卡住:
init_event (&i2c_signal);
我正在每500毫秒读取磁强计(通过I2C接口)数据OS_TIMER触发事件。
请在附件中找到磁强计I2C驱动代码的文档文件。
请查看附件中的调试截图。在这个屏幕截图中,调试在8秒后停止在行号354处。
谢谢
Jitendra
你好,对话框,
我尝试在设备进入睡眠模式之前和之后读取“I2C_ENABLE_STATUS_REG”状态。睡眠模式前"I2C_ENABLE_STATUS_REG"
休眠模式后,I2C_ENABLE_STATUS_REG状态为0。
然后,我将尝试使用“HW_I2C_REG_SETF(id, I2C_ENABLE, CTRL_ENABLE, 1);”调用来启用I2C寄存器。但是I2C状态仍然是“0”。
此外,我还尝试在设备进入睡眠模式后使用“hw_gpio_configure”进行gpio硬件配置。
任何帮助都将被感激。
问候,
Jitendra
嗨Jitendraprasad,
我看不出任何明显的原因,设备卡住在init_event()的初始化所有函数所做的是创建一个信号量,我也不能达到一个有效的结论从数据,您已经附加。我认为您已经从peripherals_demo中获得了i2c功能作为一个例子,并且您已经将该功能转移到一个启用BLE的演示中,显然在传输代码时出现了一些错误。
有一些论坛帖子是关于I2C交易的,请查看下面的一些帖子,如果有帮助的话:
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。
由于MT_dialog