ST意法半导体
直播中

辛太励

9年用户 1215经验值
擅长:20153
私信 关注
[问答]

LIS3DH再次中断

我打算使用LIS3DH作为一个功率非常低的活动探测器,但是在我的应用程序中使用它的中断输出没有成功:我可以让它始终保持开启或始终关闭但从不对运动作出反应。
为了保持理智,我已经回到了应用笔记和编写的代码,它完全符合应用笔记(第6.3.3节)所说的但是我无法做到这一点:我可以看到X / Y / Z值改变但INT1_SRC中的IA位从未设置,无论我如何猛烈地摇动芯片(通过I2C连接的STEVAL-MKI105V1板)。我究竟做错了什么?帮帮我!
我的代码(在mbed-os中,在STM32F437VG上运行)附加到这篇文章,它的输出如下:
读I_AM_LIS3DH(0x0f):0x33。

写CTRL_REG1(0x20):0x57。

写CTRL_REG2(0x21):0x09。

写CTRL_REG3(0x22):0x40。

写CTRL_REG4(0x23):0x00。

写CTRL_REG5(0x24):0x08。

写INT1_THS(0x32):0x10。

写INT1_DURAtiON(0x33):0x00。

读参考(0x26):0x00。

写INT1_CFG(0x34):0x2a。

读INT1_SRC(0x31):0x00。

阅读X 64 Y 64 Z 65472。

读INT1_SRC(0x31):0x00。

阅读X 65472 Y 65472 Z 0。

读INT1_SRC(0x31):0x00。

读X 64 Y 0 Z 65472。

读INT1_SRC(0x31):0x00。

读X 0 Y 65472 Z 0。

读INT1_SRC(0x31):0x00。

读X 0 Y 0 Z 65472。

读INT1_SRC(0x31):0x00。

读X 0 Y 64 Z 65472。

读INT1_SRC(0x31):0x00。

读X 0 Y 65408 Z 0。

读INT1_SRC(0x31):0x00。

读X 65472 Y 0 Z 0。

读INT1_SRC(0x31):0x00。

阅读X 65408 Y 0 Z 65472。

读INT1_SRC(0x31):0x00。

...
读X 0 Y 64960 Z 1088。

读INT1_SRC(0x31):0x00。

阅读X 1088 Y 2496 Z 65088。

读INT1_SRC(0x31):0x00。

阅读X 1216 Y 64832 Z 63808。

读INT1_SRC(0x31):0x00。

阅读X 1408 Y 1280 Z 63424。

读INT1_SRC(0x31):0x00。

阅读X 1792 Y 4608 Z 63168。

读INT1_SRC(0x31):0x00。

阅读X 65472 Y 0 Z 64320。

读INT1_SRC(0x31):0x00。

读X 256 Y 768 Z 1600。

读INT1_SRC(0x31):0x00。

阅读X 1792 Y 3520 Z 2688。

读INT1_SRC(0x31):0x00。

阅读X 128 Y 1216 Z 64576。

读INT1_SRC(0x31):0x00。

...


#lis3dh

以上来自于谷歌翻译


以下为原文




I intend to use the LIS3DH as a very low power activity detector but have had no success in getting its interrupt output to behave in my application: I can make it stay always on or always off but never does it react to motion.
To retain my sanity, I have gone back to the application note and written code which does exactly what the application note (section 6.3.3) says but I can't make that work either: I can see the X/Y/Z values changing but the IA bit in INT1_SRC is never set, no matter how violently I shake the chip (which is on an STEVAL-MKI105V1 board attached via I2C).  What am I doing wrong? Help!
My code (in mbed-os, running on an STM32F437VG) is attached to this post, its output is below:

Read I_AM_LIS3DH (0x0f): 0x33.

Write CTRL_REG1 (0x20): 0x57.

Write CTRL_REG2 (0x21): 0x09.

Write CTRL_REG3 (0x22): 0x40.

Write CTRL_REG4 (0x23): 0x00.

Write CTRL_REG5 (0x24): 0x08.

Write INT1_THS (0x32): 0x10.

Write INT1_DURATION (0x33): 0x00.

Read REFERENCE (0x26): 0x00.

Write INT1_CFG (0x34): 0x2a.

Read INT1_SRC (0x31): 0x00.

Read X 64 Y 64 Z 65472.

Read INT1_SRC (0x31): 0x00.

Read X 65472 Y 65472 Z 0.

Read INT1_SRC (0x31): 0x00.

Read X 64 Y 0 Z 65472.

Read INT1_SRC (0x31): 0x00.

Read X 0 Y 65472 Z 0.

Read INT1_SRC (0x31): 0x00.

Read X 0 Y 0 Z 65472.

Read INT1_SRC (0x31): 0x00.

Read X 0 Y 64 Z 65472.

Read INT1_SRC (0x31): 0x00.

Read X 0 Y 65408 Z 0.

Read INT1_SRC (0x31): 0x00.

Read X 65472 Y 0 Z 0.

Read INT1_SRC (0x31): 0x00.

Read X 65408 Y 0 Z 65472.

Read INT1_SRC (0x31): 0x00.

...

Read X 0 Y 64960 Z 1088.

Read INT1_SRC (0x31): 0x00.

Read X 1088 Y 2496 Z 65088.

Read INT1_SRC (0x31): 0x00.

Read X 1216 Y 64832 Z 63808.

Read INT1_SRC (0x31): 0x00.

Read X 1408 Y 1280 Z 63424.

Read INT1_SRC (0x31): 0x00.

Read X 1792 Y 4608 Z 63168.

Read INT1_SRC (0x31): 0x00.

Read X 65472 Y 0 Z 64320.

Read INT1_SRC (0x31): 0x00.

Read X 256 Y 768 Z 1600.

Read INT1_SRC (0x31): 0x00.

Read X 1792 Y 3520 Z 2688.

Read INT1_SRC (0x31): 0x00.

Read X 128 Y 1216 Z 64576.

Read INT1_SRC (0x31): 0x00.

...
Rob

#lis3dh

回帖(6)

曾玲娟

2018-10-11 17:05:34
您的传感器配置正常,我已对其进行了测试并触发了中断。
你能用示波器或逻辑分析仪检查INT引脚吗?

以上来自于谷歌翻译


以下为原文




Your sensor configuration is OK, I have tested it and the interrupt is triggered.
Can you check the INT pin with scope or logic analyzer?
举报

曾玲娟

2018-10-11 17:23:14
我没有测试你的示例代码,我对mbed不太熟悉,但是我使用了你的传感器配置,而且没关系。
需要轻柔的动作来触发中断。
也许您可以尝试回读所有配置。

以上来自于谷歌翻译


以下为原文




I did not test your sample code, I'm not much familiar with mbed, but I used exactly your sensor configuration, and it is OK.
Gentle movement was needed to trigger the interrupt.
Maybe you can try to read back all the configuration.
举报

辛太励

2018-10-11 17:35:45
好的:你能把你的代码发给我,以便我可以反复检查我在做什么吗?我在配置结束时添加了一组回读 - 所有寄存器似乎都有预期的值(见下文)。我能以某种方式做错事吗?为避免疑问,我对电路板进行了电源循环,以便之前的测试没有延迟配置。
读I_AM_LIS3DH(0x0f):0x33。
 
写CTRL_REG1(0x20):0x57。
 
写CTRL_REG2(0x21):0x09。
 
写CTRL_REG3(0x22):0x40。
 
写CTRL_REG4(0x23):0x00。
 
写CTRL_REG5(0x24):0x08。
 
写INT1_THS(0x32):0x10。
 
写INT1_DURATION(0x33):0x00。
 
读CTRL_REG1(0x20):0x57。
 
读CTRL_REG2(0x21):0x09。
 
读CTRL_REG3(0x22):0x40。
 
读CTRL_REG4(0x23):0x00。
 
读CTRL_REG5(0x24):0x08。
 
读INT1_THS(0x32):0x10。
 
读INT1_DURATION(0x33):0x00。
 
读参考(0x26):0x00。
 
写INT1_CFG(0x34):0x2a。
 
读INT1_CFG(0x34):0x2a。
 
读X 0 Y 1 Z 0。
 
读X 0 Y -1 Z -1。
 
读X -1 Y -1 Z 0。
 
读X -2 Y 0 Z -1。
 
读X -1 Y -1 Z 0。
 
读X 117 Y -131 Z 88。
 
读X 13 Y -39 Z -5。
 
读X 0 Y -8 Z 4。
 
读X 0 Y -1 Z -1。
 
读X -1 Y -1 Z 1。
 
读X 0 Y 1 Z 1。
 
读X -1 Y 1 Z 0。
 
读X -1 Y -2 Z -1。
 
阅读X-47 Y 63 Z -28。
 
读X 44 Y 5 Z -8。
 
读X -10 Y -1 Z 2。
 
读X 39 Y 78 Z 33。
 
读X 12 Y 20 Z 1。
 
读X -1 Y 1 Z 0。
 
读X 0 Y 0 Z 0。
 
读X 0 Y 0 Z 0。
 
读X 0 Y 0 Z 1。
 
读X -1 Y -1 Z 1。
 
读X -1 Y -1 Z -1。
 
读X 1 Y 1 Z 1。
 
读X 1 Y -2 Z -2。
 
读X 0 Y 0 Z 0。
 
读X -1 Y -1 Z 0。
 
读X 1 Y 1 Z 0。
 
读X -1 Y 0 Z 1。
 
读X -1 Y 0 Z -1。
 
读X 0 Y 0 Z 0。
 
读X 1 Y -1 Z 0。
 
读X 1 Y -1 Z 0。
 
读X 1 Y -1 Z 0。
 
读X 2 Y 0 Z 1。
 
读X 0 Y -1 Z -2。
 
读X 1 Y 1 Z 0。
 
阅读X -57 Y 78 Z 4。
 
读X -1 Y -1 Z -1。
 
读X 2 Y -2 Z -1。
 
读X 0 Y -2 Z 0。
 
读X -1 Y -2 Z 1。
 
读X -1 Y 0 Z -1。

以上来自于谷歌翻译


以下为原文




OK: could you send me your code so that I could cross-check what I'm doing?  I've added a set of read-backs at the end of my configuration-writes and all the registers seem to have the expected values (see below).  Could I be doing things in the wrong order somehow?  For the avoidance of doubt, I have power-cycled the board so that there is no lingering configuration from a previous test.

Read I_AM_LIS3DH (0x0f): 0x33.

Write CTRL_REG1 (0x20): 0x57.

Write CTRL_REG2 (0x21): 0x09.

Write CTRL_REG3 (0x22): 0x40.

Write CTRL_REG4 (0x23): 0x00.

Write CTRL_REG5 (0x24): 0x08.

Write INT1_THS (0x32): 0x10.

Write INT1_DURATION (0x33): 0x00.

Read CTRL_REG1 (0x20): 0x57.

Read CTRL_REG2 (0x21): 0x09.

Read CTRL_REG3 (0x22): 0x40.

Read CTRL_REG4 (0x23): 0x00.

Read CTRL_REG5 (0x24): 0x08.

Read INT1_THS (0x32): 0x10.

Read INT1_DURATION (0x33): 0x00.

Read REFERENCE (0x26): 0x00.

Write INT1_CFG (0x34): 0x2a.

Read INT1_CFG (0x34): 0x2a.

Read X 0 Y 1 Z 0.

Read X 0 Y -1 Z -1.

Read X -1 Y -1 Z 0.

Read X -2 Y 0 Z -1.

Read X -1 Y -1 Z 0.

Read X 117 Y -131 Z 88.

Read X 13 Y -39 Z -5.

Read X 0 Y -8 Z 4.

Read X 0 Y -1 Z -1.

Read X -1 Y -1 Z 1.

Read X 0 Y 1 Z 1.

Read X -1 Y 1 Z 0.

Read X -1 Y -2 Z -1.

Read X -47 Y 63 Z -28.

Read X 44 Y 5 Z -8.

Read X -10 Y -1 Z 2.

Read X 39 Y 78 Z 33.

Read X 12 Y 20 Z 1.

Read X -1 Y 1 Z 0.

Read X 0 Y 0 Z 0.

Read X 0 Y 0 Z 0.

Read X 0 Y 0 Z 1.

Read X -1 Y -1 Z 1.

Read X -1 Y -1 Z -1.

Read X 1 Y 1 Z 1.

Read X 1 Y -2 Z -2.

Read X 0 Y 0 Z 0.

Read X -1 Y -1 Z 0.

Read X 1 Y 1 Z 0.

Read X -1 Y 0 Z 1.

Read X -1 Y 0 Z -1.

Read X 0 Y 0 Z 0.

Read X 1 Y -1 Z 0.

Read X 1 Y -1 Z 0.

Read X 1 Y -1 Z 0.

Read X 2 Y 0 Z 1.

Read X 0 Y -1 Z -2.

Read X 1 Y 1 Z 0.

Read X -57 Y 78 Z 4.

Read X -1 Y -1 Z -1.

Read X 2 Y -2 Z -1.

Read X 0 Y -2 Z 0.

Read X -1 Y -2 Z 1.

Read X -1 Y 0 Z -1.
举报

辛太励

2018-10-11 17:55:30
还有一点信息:如果我定期读取INT1_SRC,它总是0,所以它不仅仅是IA位(和INT1输出)没有被设置,根本没有中断源(代码附加了)这个)。某种程度上我的配置肯定有问题。可能会有时间进行吗?
读I_AM_LIS3DH(0x0f):0x33。
 
写CTRL_REG1(0x20):0x57。
 
写CTRL_REG2(0x21):0x09。
 
写CTRL_REG3(0x22):0x40。
 
写CTRL_REG4(0x23):0x00。
 
写CTRL_REG5(0x24):0x08。
 
写INT1_THS(0x32):0x10。
 
写INT1_DURATION(0x33):0x00。
 
读CTRL_REG1(0x20):0x57。
 
读CTRL_REG2(0x21):0x09。
 
读CTRL_REG3(0x22):0x40。
 
读CTRL_REG4(0x23):0x00。
 
读CTRL_REG5(0x24):0x08。
 
读INT1_THS(0x32):0x10。
 
读INT1_DURATION(0x33):0x00。
 
读参考(0x26):0x00。
 
写INT1_CFG(0x34):0x2a。
 
读INT1_CFG(0x34):0x2a。
 
读INT1_SRC(0x31):0x00。
 
读X 0 Y 0 Z 0。
 
读INT1_SRC(0x31):0x00。
 
读X 0 Y 1 Z 1。
 
读INT1_SRC(0x31):0x00。
 
读X -1 Y 0 Z -1。
 
读INT1_SRC(0x31):0x00。
 
读X 0 Y 0 Z 1。
 
读INT1_SRC(0x31):0x00。
 
读X -2 Y -2 Z 4。
 
读INT1_SRC(0x31):0x00。
 
阅读X 22 Y 179 Z -40。
 
读INT1_SRC(0x31):0x00。
 
读X -3 Y -1 Z -1。
 
...

以上来自于谷歌翻译


以下为原文




One more point of information: if I read INT1_SRC on a regular basis it is always 0, so it's not just the IA bit (and the INT1 output) that is not being set, there is no interrupt source at all (code attached that does this).  Something must be wrong with my configuration somehow.  Could there be a timing thing going on?

Read I_AM_LIS3DH (0x0f): 0x33.

Write CTRL_REG1 (0x20): 0x57.

Write CTRL_REG2 (0x21): 0x09.

Write CTRL_REG3 (0x22): 0x40.

Write CTRL_REG4 (0x23): 0x00.

Write CTRL_REG5 (0x24): 0x08.

Write INT1_THS (0x32): 0x10.

Write INT1_DURATION (0x33): 0x00.

Read CTRL_REG1 (0x20): 0x57.

Read CTRL_REG2 (0x21): 0x09.

Read CTRL_REG3 (0x22): 0x40.

Read CTRL_REG4 (0x23): 0x00.

Read CTRL_REG5 (0x24): 0x08.

Read INT1_THS (0x32): 0x10.

Read INT1_DURATION (0x33): 0x00.

Read REFERENCE (0x26): 0x00.

Write INT1_CFG (0x34): 0x2a.

Read INT1_CFG (0x34): 0x2a.

Read INT1_SRC (0x31): 0x00.

Read X 0 Y 0 Z 0.

Read INT1_SRC (0x31): 0x00.

Read X 0 Y 1 Z 1.

Read INT1_SRC (0x31): 0x00.

Read X -1 Y 0 Z -1.

Read INT1_SRC (0x31): 0x00.

Read X 0 Y 0 Z 1.

Read INT1_SRC (0x31): 0x00.

Read X -2 Y -2 Z 4.

Read INT1_SRC (0x31): 0x00.

Read X 22 Y 179 Z -40.

Read INT1_SRC (0x31): 0x00.

Read X -3 Y -1 Z -1.

...
举报

更多回帖

发帖
×
20
完善资料,
赚取积分