[关闭]
@SiberiaBear 2016-04-06T11:48:33.000000Z 字数 2370 阅读 3832

ADXL345在树莓派上的配置和调试经验

raspberryPi

固定链接:https://www.zybuluo.com/SiberiaBear/note/336444


最近在调试ADXL345,主要用途是想通过该芯片来实现对人睡眠状态和清醒活动状态的检测,初步的,准备通过检测人体活动的加速度值来判断活动与非活动状态。最初是用Edison板来调试的,后来在SPI部分卡住了,时序调试不通过,然后才换成树莓派。
调试过程中遇到一些问题,记录在这里。
程序代码参考我的github:https://github.com/PWESiberiaBear/adxl345-Pi

SPI部分疑问

使用Edison调试SPI时,首先使用了网络上的SPI调试例程spi_test.c,只连接Edison的MOSI和MISO引脚,通信正常,然后将ADXL345-master.zip文件解压,编译运行,将Edison与ADXL345通信,发现了一些问题。
这里备注一下,这个例程是我从网上找的,比较懒,自己不想写驱动代码了。

出现的编译问题:
- I2C文件提示有问题,由于我用的是I2C,用SPI,所以在Makefile中将ADXL345PiI2C直接删除。用I2C的同学,求不打脸。
- usleep()函数找不到定义,解决办法在main.cpp中增加了#include <unistd.h>
- 找不到target/all,没有对应的文件和路径。解决办法在当前路径下新建一个target目录。

编译通过后,运行./target/all,提示无法打开SPI,然后进入到ADXL345PiSPI.cpp中,将里边构造函数里的spidev1.换成spidev5.,然后在main.cpp中将创建对象中的参数改为0,也就是使用spidev5.0设备。

之后运行,提示运行正常,但是识别ADXL345失败,内在原因是读取ADXL345的设备号,并不是0xE5,而是0xFF,明显是读取寄存器失败,在检查过接线问题、寄存器号、读取寄存器函数的时序后,几乎崩溃,因为对Edison的SPI驱动不太了解,所以在这块没办法查看。

后来,用示波器查看SPI时序,被逼急了,才发现时序似乎有点问题,休怪我当时没有拍照,因为太急了。简单描述下,时序中CS段拉低后,大概过去整个CS拉低段3/4时间后,时钟和数据才开始发送,前边一大段的CS拉低后没有干任何事情,我不知道问题出在哪里。

树莓派中设备号的问题

最后只能放弃Edison,等我学了Linux设备驱动以后再回头研究吧。
手头有个树莓派3,所以准备试试,同样的过程,遇到的编译问题也相同,使用树莓派的spidev0.0设备,遇到了SPI设备未打开的问题,通过rasp-configure打开。

然后发现示波器的波形特别不稳定,抖动很厉害,而且出现了中间电平。后来检查接线,发现是接线的问题,ADXL345的地线是与Edison共地的,并没有与树莓派共地,共地后没有问题了。

运行程序后,发现还是提示ADXL345设备未找到,通过示波器观察,发现读取寄存器0x00后返回的内容是0xF2,这就郁闷了,不应该会有这么个数字吧,然后各种检查程序,并没有问题。后来检查接线,唯一可能怀疑的是ADXL345的电源线是Edison给的,并不是树莓派给的。切换过来试了一下,问题解决,读取到了0xE5,并且加速度计的数哗哗的出现在了终端上,感动的想哭。仔细想想看,毕竟是传感器,可能对供电部分要求比较高。,虽然是同一个电源出来的,但可能还是有影响。

再后来读了一下README.md,才发现这个是raspberrypi adxl345 interface。怪不得在Edison上使用不正常,之后还是另外再调Edison的SPI。

ADXL345中断的问题

ADXL345芯片的寄存器配置是相对简单的,我在操作过程中并没有遇到过读写寄存器失败的情况,只要SPI工作正常。另外,关于ADXL345配置寄存器的数据手册一定要认真看,如果没有意识到寄存器配置的先后关系,可能会遇到一些问题,如:

包含但不限于以上这几点。

我遇到这样一个问题,困惑我两天时间。程序为:

  1. while(1) {
  2. if(activity_flag) { // activity interrupt occured
  3. // DO ACTIVITY THING
  4. readRegister(INT_SOURCE);
  5. }
  6. }
  1. while(1)
  2. if(activity_flag) { // activity interrupt occured
  3. // DO ACTIVITY THING
  4. }
  5. readRegister(INT_SOURCE);
  6. }

我只摘录重要的一部分代码说明问题,所有代码可以参考我的github。

最初时,我是按上边的代码做的,发现并无法正常进入中断,现象是总是进入一两次中断然后就不再进入了,各种调试和配置寄存器,都无法解决问题。

在一个ADI的论坛里,一个工程师说,ADXL345的中断标志清除并不可靠,需要多读几次。源网址我找不到了,当时就是这么说的,我改成第二种方式,让它频繁的清中断,然后系统就正常了,中断正常进入。加入其它的一些功能,也没问题。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注