OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3080|回复: 13

ADXL345用SPI通信Z轴输出明显不对,什么原因造成的啊?

[复制链接]

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2016-1-14
在线时间
21 小时
发表于 2016-1-15 17:44:36 | 显示全部楼层 |阅读模式
1金钱
我的ADXL345读取ID和向寄存器读写数值都正确,但是读取XYZ的数值明显不对
下面是初始化函数
void ADXL345_HW_SPI_Init(void)
{
    SPI_InitTypeDef  SPI_InitStructure;

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;                //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //选择了串行时钟的稳态:时钟悬空高
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //数据捕获于第二个时钟沿
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式

        SPI_Init(ADXL345_SPI_x, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
  SPI_Cmd(ADXL345_SPI_x, ENABLE); //使能SPI外设
}  
寄存器的配置如下
        write_byte(0X31,0X0A);        //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程
                //ADXL345_WR_Reg(0X2C,0x0A);                //数据输出速度为100Hz
        write_byte(0X2C,0x0A);
                //ADXL345_WR_Reg(0X2D,0x28);                   //链接使能,测量模式
        write_byte(0X2D,0x08);//0x08
                write_byte(0X2E,0x00);        //不使用中断                 
//                 write_byte(0X1E,0xF3);
//                write_byte(0X1F,0xE8);
//                write_byte(0X20,0xBA);
                 write_byte(0X1E,0x00);
                write_byte(0X1F,0x00);
                write_byte(0X20,0x00);
读写函数如下
u8 read_byte(u8 add)
{
    // GPIO_ResetBits(GPIOA,GPIO_Pin_4);
        ADXL345_CS_L;
     SPI_I2S_SendData(SPI1,(add|0x80)<<8|0x00);
  
    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
   
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET);
   
    //GPIO_SetBits(GPIOA,GPIO_Pin_4);
        ADXL345_CS_H;
   
    return SPI_I2S_ReceiveData(SPI1)&0xff;
  
}

void write_byte(u8 add,u8 val)
{
     //GPIO_ResetBits(GPIOA,GPIO_Pin_4);
        ADXL345_CS_L;

     SPI_I2S_SendData(SPI1,add<<8|val);
  
    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
   
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET);
   
    //GPIO_SetBits(GPIOA,GPIO_Pin_4);
        ADXL345_CS_H;
     SPI_I2S_ReceiveData(SPI1)&0xff;
  
}
读取XYZ
        for(i=0;i<6;i++)
        {
                buf=read_byte(0x32+i);  
        }        

        BUF[0]=(buf[1]<<8)+buf[0];
        BUF[1]=(buf[3]<<8)+buf[2];
        BUF[2]=(buf[5]<<8)+buf[4];

读出来的数据是这样的:
BUF[0]:0X003A   
BUF[1]:0X0062
BUF[2]:0X04A6
显然0x4A6(十进制后为1190),13位±16g,那么1190*3.9mg=4641mg,显然大于1g
读取ID和其他可读可写寄存器都是正确的
是什么问题呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-17 23:48:05 | 显示全部楼层
回复

使用道具 举报

7

主题

171

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2337
金钱
2337
注册时间
2015-9-6
在线时间
536 小时
发表于 2016-1-18 07:54:51 | 显示全部楼层
你的芯片是如何使用的?是正面朝上还是背面朝上?
回复

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2016-1-14
在线时间
21 小时
 楼主| 发表于 2016-1-19 16:56:46 | 显示全部楼层
键盘侠 发表于 2016-1-18 07:54
你的芯片是如何使用的?是正面朝上还是背面朝上?

有刻蚀字的一面朝下
回复

使用道具 举报

7

主题

171

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2337
金钱
2337
注册时间
2015-9-6
在线时间
536 小时
发表于 2016-1-20 08:01:29 | 显示全部楼层
DHG 发表于 2016-1-19 16:56
有刻蚀字的一面朝下

先反过来用,试一下,而且你用的程序是不是原子的?如果是的话,我记得里面应该有个XYZ矫正的程序,把那个Z轴矫正屏蔽掉试试。
回复

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2016-1-14
在线时间
21 小时
 楼主| 发表于 2016-1-20 08:40:10 | 显示全部楼层
反过来也试过了,是用硬件SPI做的,原本原子哥的是IIC,去掉那个矫正函数了,依然这样。。。
回复

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
639
金钱
639
注册时间
2014-6-20
在线时间
169 小时
发表于 2016-1-20 11:59:10 | 显示全部楼层
有可能是adxl345坏了 ,之前我也出现过,上网查,说这个好像有一批有问题。
不过原子的是好的,估计原子哥出厂前都测试过了。
回复

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
发表于 2016-1-20 13:00:08 | 显示全部楼层
我也遇到过
回复

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2016-1-14
在线时间
21 小时
 楼主| 发表于 2016-1-20 14:59:07 | 显示全部楼层

那后来怎么解决了?这个问题直接让我快翻烂了PDF手册。。。
回复

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2016-1-14
在线时间
21 小时
 楼主| 发表于 2016-1-20 15:02:53 | 显示全部楼层
另外有个问题,在data sheet中page26,关于0X31寄存器,下面这句话
The DATA_FORMAT register controls the presentation of data
to Register 0x32 through Register 0x37.
的意思应该是:
DATA_FORMAT 寄存器控制着从寄存器0x32到寄存器0x37的数据描述吧?
但是中文翻译是这样的:
DATA_FORMAT寄存器通过寄存器0x37控制寄存器0x32的
数据显示。
大家是怎么理解这句话的?
回复

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2016-1-14
在线时间
21 小时
 楼主| 发表于 2016-1-20 16:18:06 | 显示全部楼层
Fliger 发表于 2016-1-20 11:59
有可能是adxl345坏了 ,之前我也出现过,上网查,说这个好像有一批有问题。
不过原子的是好的,估计原子哥 ...

变化范围倒是在±1G左右,就是数值很大,要是芯片坏了估计要吐血
回复

使用道具 举报

7

主题

171

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2337
金钱
2337
注册时间
2015-9-6
在线时间
536 小时
发表于 2016-1-20 18:16:48 | 显示全部楼层
DHG 发表于 2016-1-20 16:18
变化范围倒是在±1G左右,就是数值很大,要是芯片坏了估计要吐血

芯片损坏或者盗版的可能性还是很大的,之前我就买到过假货,连寄存器都写不了,地址都对应不上,后来又买过了,一样的程序,跑的飞起来。
回复

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
发表于 2016-2-1 13:20:22 | 显示全部楼层
DHG 发表于 2016-1-20 14:59
那后来怎么解决了?这个问题直接让我快翻烂了PDF手册。。。

后来不了了之了
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2018-10-10
在线时间
1 小时
发表于 2018-10-10 20:22:26 | 显示全部楼层
楼主 你的代码还在吗 能否发我一份 1136086574@qq.com  不胜感激!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 14:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表