OpenEdv-开源电子网

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

MPU9250磁力计AK8963的ID读取问题

[复制链接]

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-9-30
在线时间
22 小时
发表于 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];     //&#182;&#193;&#200;&#161;&#188;&#198;&#203;&#227;X&#214;á&#202;&#253;&#190;&#221;

   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];    //&#182;&#193;&#200;&#161;&#188;&#198;&#203;&#227;Y&#214;á&#202;&#253;&#190;&#221;   
     
   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];    //&#182;&#193;&#200;&#161;&#188;&#198;&#203;&#227;Z&#214;á&#202;&#253;&#190;&#221;

      Single_Write_MPU9250(MAG_ADDRESS,0x0A,0x11); ////AK8963&#195;&#191;&#180;&#206;&#182;&#193;&#205;ê&#210;&#212;&#186;ó&#182;&#188;&#208;è&#210;&#170;&#214;&#216;&#208;&#194;&#201;è&#214;&#195;&#206;&#170;&#181;&#165;&#180;&#206;&#178;&#226;&#193;&#191;&#196;&#163;&#202;&#189;,16&#206;&#187;&#202;&#228;&#179;&#246;
   delay1ms(50);               
}
但是读MPU6500的ID是0x71,这个是正确的,这是怎么原因啊?

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

使用道具 举报

3

主题

2164

帖子

0

精华

资深版主

Rank: 8Rank: 8

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

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-9-30
在线时间
22 小时
 楼主| 发表于 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通讯时必须延时久一点的;          
回复 支持 反对

使用道具 举报

12

主题

76

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-5-15
在线时间
2 小时
发表于 2018-5-23 18:12:58 | 显示全部楼层
能分享下源码吗  谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 03:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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