OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 152|回复: 3

MPU9250磁力计AK8963的ID读取问题

[复制链接]

  离线 

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-9-30
在线时间
13 小时
发表于 2017-10-31 17:09:04 | 显示全部楼层 |阅读模式
正点原子公众号
为什么我读到的MPU9250磁力计AK8963的ID是0x7f,并不是0x48;且读到的磁力计数值为0xDF ,0xBF,0x3F,0xFF3F等基本都是以F结尾的数值;
初始化代码如下:
void Init_MPU9250(void)
{
      unsigned char res;
        Single_Write_MPU9250(GYRO_ADDRESS,PWR_MGMT_1, 0x00);    //½â³ýÐÝÃß״̬
      Single_Write_MPU9250(GYRO_ADDRESS,SMPLRT_DIV, 0x07);
      Single_Write_MPU9250(GYRO_ADDRESS,CONFIG, 0x06);
      Single_Write_MPU9250(GYRO_ADDRESS,GYRO_CONFIG, 0x18);
      Single_Write_MPU9250(GYRO_ADDRESS,ACCEL_CONFIG, 0x00);
      //Single_Write_MPU9250(GYRO_ADDRESS,MPU_INT_EN_REG,0X00);   //¹Ø±ÕËùÓÐÖжÏ
      //Single_Write_MPU9250(GYRO_ADDRESS,MPU_USER_CTRL_REG,0X00);//I2CÖ÷ģʽ¹Ø±Õ
      //Single_Write_MPU9250(GYRO_ADDRESS,MPU_FIFO_EN_REG,0X00);    //¹Ø±ÕFIFO
      Single_Write_MPU9250(GYRO_ADDRESS,0x37,0x02);//turn on Bypass Mode
      delay1ms(100);
        res = Single_Read_MPU9250(GYRO_ADDRESS,WHO_AM_I);
        if (res == 0x71)
      {
          Single_Write_MPU9250(GYRO_ADDRESS,PWR_MGMT_1, 0x01);                           
      }
        res=Single_Read_MPU9250(MAG_ADDRESS,MAG_WIA);                //¶ÁÈ¡AK8963 ID   
    if(res==0x48)
    {
        Single_Write_MPU9250(MAG_ADDRESS,0x0A,0X11);        //ÉèÖÃAK8963Ϊµ¥´Î²âÁ¿Ä£Ê½
    }
}

void READ_MPU9250_MAG(void)
{     
   BUF[0]=Single_Read_MPU9250(MAG_ADDRESS,MAG_XOUT_L);
   BUF[1]=Single_Read_MPU9250(MAG_ADDRESS,MAG_XOUT_H);
   mag_x=(BUF[1]<<8)|BUF[0];     //¶ÁÈ¡¼ÆËãXÖáÊý¾Ý

   BUF[2]=Single_Read_MPU9250(MAG_ADDRESS,MAG_YOUT_L);
   BUF[3]=Single_Read_MPU9250(MAG_ADDRESS,MAG_YOUT_H);
   mag_y=    (BUF[3]<<8)|BUF[2];    //¶ÁÈ¡¼ÆËãYÖáÊý¾Ý   
     
   BUF[4]=Single_Read_MPU9250(MAG_ADDRESS,MAG_ZOUT_L);
   BUF[5]=Single_Read_MPU9250(MAG_ADDRESS,MAG_ZOUT_H);
   mag_z=    (BUF[5]<<8)|BUF[4];    //¶ÁÈ¡¼ÆËãZÖáÊý¾Ý

      Single_Write_MPU9250(MAG_ADDRESS,0x0A,0x11); ////AK8963ÿ´Î¶ÁÍêÒÔºó¶¼ÐèÒªÖØÐÂÉèÖÃΪµ¥´Î²âÁ¿Ä£Ê½,16λÊä³ö
   delay1ms(50);               
}
但是读MPU6500的ID是0x71,这个是正确的,这是怎么原因啊?

回复

使用道具 举报

  离线 

3

主题

2023

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3466
金钱
3466
注册时间
2013-11-22
在线时间
588 小时
发表于 2017-10-31 21:56:37 | 显示全部楼层
如果是IIC通信,可以参考下我们MiniFly的代码,SPI通信没试过 。
回复 支持 反对

使用道具 举报

  离线 

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-9-30
在线时间
13 小时
 楼主| 发表于 2017-10-31 22:42:37 | 显示全部楼层
找到原因了,IIC通讯上出问题了,用模拟IIC读MPU6500的ID和数据没问题,但是要能正确读到AK8963的ID及数据必须在IIC通讯上多延时几微秒,如以下代码:
void IIC_Start(void)
{
        SDA_OUT();   
        IIC_SDAH();                    
        IIC_SCLH();
        delay();
  IIC_SDAL();
        delay();
        IIC_SCLL();
}
之前delay()这里我只用了几个__nop();代替了,与AK8963通讯时必须延时久一点的;          
回复 支持 反对

使用道具 举报

  离线 

11

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2017-4-3
在线时间
69 小时
发表于 2017-11-7 08:43:57 | 显示全部楼层
你好,能分校下9250的源码么
回复 支持 反对

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-22 18:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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