完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我打算使用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个回答
|
|
您的传感器配置正常,我已对其进行了测试并触发了中断。
你能用示波器或逻辑分析仪检查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? |
|
|
|
我没有测试你的示例代码,我对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. |
|
|
|
好的:你能把你的代码发给我,以便我可以反复检查我在做什么吗?我在配置结束时添加了一组回读 - 所有寄存器似乎都有预期的值(见下文)。我能以某种方式做错事吗?为避免疑问,我对电路板进行了电源循环,以便之前的测试没有延迟配置。
读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. |
|
|
|
还有一点信息:如果我定期读取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. ... |
|
|
|
排序吧!检查并仔细检查,在我的简单代码中,我写的是INT2_CFG(0x34)而不是INT1_CFG(0x30)。写入正确的寄存器,它的工作原理。当然,这个错误只出现在我发布的示例代码中,我真正的目标代码是写入正确的寄存器,但至少我有一个例子可以从现在开始工作。
感谢你的帮助 Batek.Miroslav “!罗布 注意:原始帖子包含大量线程对话,只能迁移到第9级 以上来自于谷歌翻译 以下为原文 Sorted it! Checking and double-checking, in my simple code I was writing to INT2_CFG (0x34) not INT1_CFG (0x30). Write to the correct register and it works. Of course, this mistake is only in my sample code posted here, my real target code is writing to the correct register, but at least I have an example to work from now. Thanks for all your help Batek.Miroslav ‌!Rob Note: the original post contained a large number of threaded conversations and was only able to be migrated to the 9th level |
|
|
|
如果它可以帮助其他任何人,我现在已经在我的真实目标代码中找到问题的根源。要理解INTx_CFG中6个中断使能位的含义。我曾经想过如果我设置一个阈值,比如16,那么如果我设置了例如ZHIE和ZLIE位
在INTx_CFG中 ,如果Z轴加速度超过+16或低于-16,我会得到一个中断。我现在明白,如果Z轴加速度超过16或低于16,它会给我一个中断,因此它会一直熄灭。所以分辨率只是设置xHIE位,这就是示例代码所做的。 以上来自于谷歌翻译 以下为原文 In case it helps anyone else, I've now got to the bottom of the problem in my real target code. It was down to understanding the meaning of the 6 interrupt enable bits in INTx_CFG. I had thought that if I set a threshold of, say 16, then if I set, for instance, the ZHIE and ZLIE bits in INTx_CFG , then I would get an interrupt if the Z axis acceleration went above +16 or below -16. What I now understand it that it will give me an interrupt if the Z axis acceleration goes above 16 or below 16, hence it goes off all the time. So the resolution is to set just the xHIE bits, which is what the example code does. |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2735 浏览 1 评论
3241 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1810 浏览 1 评论
3650 浏览 6 评论
6039 浏览 21 评论
1339浏览 4评论
201浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
352浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
444浏览 2评论
STM32处理增量式编码器Z信号如何判断中断是正转的还是反向转的?
274浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 18:47 , Processed in 1.015983 second(s), Total 57, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号