ADXL345传感器小结

大家好,今天小白给大家简单分享下ADXL345使用,欢迎一起讨论学习。

ADXL345是一种三轴加速度计,当ADXL345沿检测轴正向加速时,它对正加速度进行检测。

一.使用IIC接法调试遇到的问题

1. IIC接法

                                                    

在该中连接方式下:器件的7位I2C地址是0x53,紧随其后的是R/W位。用户通过将SDO/ALTADDRESS引脚连接到VDDIO引脚来选择I2C的替代地址。此配置下的7位I2C地址是0x1D,紧随其后的是R/W位。

2. 器件初始化

我们初始化的寄存器有:0x31, 0x2C, 0x2D,0x2E, 0x2F, 0x2E, 0x38;根据器件手册主要设置了测量范围±16g,13位模式,中断引脚为低电平;速率设定为12.5kz;选择电源模式;禁止所有的中断(首先);将中断映射到INT1引脚;使能水印中断;设置了FIFO模式中的流模式。

3. 数据读写过程

根据器件手册,单字节写的大致流程如下:

可以看出在进行单字节写操作时:首先master设备会发送1位start标志位(START),给slave设备,间隔一小段时间后,接着是7位的器件地址和1位的写标志位(SLAVE ADDRESS + WRITE),传输接收后slave设备会发送1位ack回复给master设备(ACK);当master设备收到回复后,master设备接着发送待初始化的寄存器地址(REGISTER ADDRESS),slave设备收到后会给master设备回复1位ack信号,master收到回复后,开始发送8位数据(给器件初始化的值),slave设备收到后发送1位ACK回复,master设备收到后回复1为STOP信号,本次写寄存器操作到此结束。

同理多字节写过程如下:

读寄存器大致流程如下:

可以看出在进行单字节读取数据时:首先是master设备发送1位的start信号(START)给slave设备,间隔一小段时间后,接着是7位的器件地址和1位的写标志位(SLAVE ADDRESS + WRITE),当master设备收到回复后,master设备接着发送待初始化的寄存器地址(REGISTER ADDRESS),slave设备收到后会给master设备回复1位ack信号(ACK),master收到回复后,接着会发送1位的start信号(START)信号,间隔一小段时间后,master设备开始发送7位的器件地址和1位的读标志位(SLAVE ADDRESS + READ),当slave发出1位ack回复后(ACK,间隔一小段时间后,开始向master设备发送主设备需要读取的REGISTER中的数据(DATA。Master收到数据后不产生回复信号(NACK),间隔一小段时间后,master设备发送1为的stop信号(STOP),本次数据读取过程结束。

同理也可以很容易理解多字节读取过程

4. 遇到的问题

a. 由于搞错了器件地址,导致数据在器件初始化时,一直看不到正确的波形,最后通过详细阅读技术手册后,发现了问题,修改了器件地址后,在SDA线上看到了正确的波形。

b. 在进行读取数据时,由于接口问题,尝试过一些方式,但还是未能成功的通过IIC的方式读取到数据,只是完成了器件的初始化过程(即:写寄存器的过程。)

二. SPI接法

SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。

1. 4线SPI连接方式

                                                          

由于ADXL345传感器即支持IIC通信方式,也支持SPI的通信方式,所以尝试使用SPI通信方法来完成数据采集功能。

2. 数据读写时序图

进行数据读写时主要参考了器件手册提供的如下时序图:

4线式SPI写时序:

根据SPI写时序图:在代码中设置:tx_buf[0] = reg & 0x3F; tx_buf[1] = data;(其中reg代表“ADDRESS BITS”, DATA BITS代表data,也就是要写入到寄存器中的值。)

4线式SPI读时序:

根据SPI读时序:在代码中设置:tx_buf[0] = reg | 0x80 & 0xbf; tx_buf[1] = 0xff;(其中reg代表“ADDRESS BITS”), 可知:rx_buf[1]中的数据即为读取到的数据,即SDO总线上的DATA BITS。

注意:时序图上的SDI和SDO均表示slave设备上的引脚,SDI表示数据输入引脚,SDO表示数据输出引脚,即:slave设备的SDI引脚接的是master设备的MOSI引脚;slave设备的SDO引脚接的是mster的MISO引脚。

3. 遇到的问题

在进行多字节读取数据时,还是会遇到和IIC读取数据相同的问题,最后选择使用单字节读取的方式解决了数据读取的问题。

4. 调试心得

a. 首先得确保硬件连线的正确性,如果能确保ADXL345模块正常,那就能将错误定位在软件上,问题就容易解决多了。

b. 要确保通信双方器件的时序无误。即需要合理的配置主控器件,使双方的时序一致。

c. 找一些靠谱的参考代码,在其基础上修改,这样也可加快调试的进度。

三. 总结

本篇主要是简单记录了ADXL345使用方法和调试经验。

猜你喜欢

转载自blog.csdn.net/weixin_38498942/article/details/86575617