你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F4通过SPI读取MPU9250磁力计

[复制链接]
power568 提问时间:2016-3-8 15:14 /
本帖最后由 power568 于 2016-3-8 15:22 编辑

现在正在学习mpu9250,使用STM32F4+MPU9250, 通过SPI接口方式通讯,现在已经可以正常读取加速度和陀螺仪数据,但是磁力计无法读取,根据网上资料更改的程序:http://www.amobbs.com/thread-5579616-1-1.html,  求大侠指点!!!

附上程序:


UNS8 AkWriteReg(UNS8 const regAddr, UNS8 const value)
{
        OS_ERR        err;
        UNS8 sta = TRUE, tmp;
        UNS16         retryTime = SPI_WAIT_I2C_TIME;
       
        SpiMpuWriteReg(I2C_SLV4_ADDR, AK8963_I2C_ADDR);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        SpiMpuWriteReg(I2C_SLV4_REG, regAddr);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        SpiMpuWriteReg(I2C_SLV4_DO, value);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        SpiMpuWriteReg(I2C_SLV4_CTRL, I2C_SLV4_EN_VAL);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        do
        {
                SpiMpuReadReg(I2C_MSTR_STA, &tmp);
                OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        }while( (--retryTime) && (0==(tmp&I2C_SLV4_DONE_VAL)) );
       
        if (0 == retryTime)
        {
                sta = FALSE;
        }
       
        return sta;
}

UNS8 AkReadReg(UNS8 const regAddr, UNS8 *const pData)
{
        OS_ERR        err;
        UNS8 sta = TRUE, tmp;
        UNS16         retryTime = SPI_WAIT_I2C_TIME;
       
        if (NULL == pData)
        {
                return FALSE;
        }
       
        SpiMpuWriteReg(I2C_SLV4_ADDR, AK8963_I2C_ADDR | SPI_MPU_READ_CMD);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        SpiMpuWriteReg(I2C_SLV4_REG, regAddr);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        SpiMpuWriteReg(I2C_SLV4_CTRL, I2C_SLV4_EN_VAL);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        do
        {
                SpiMpuReadReg(I2C_MSTR_STA, &tmp);
                OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        }while( (--retryTime) && (0==(tmp&I2C_SLV4_DONE_VAL)) );
       
        if (0 != retryTime)
        {
                SpiMpuReadReg(I2C_SLV4_DI, pData);
        }
        else
        {
                sta = FALSE;
        }
       
        return sta;
}


void Ak8963Init( void )
{
        OS_ERR                err;
        UNS8                        tmp;
       
        AkReadReg(AK8963_WIA, &tmp);//// ref smartImu
        if (AK8963_WIA_VAL != tmp)
        {
                tmp ++;
        }
       
        AkWriteReg(0x0B, 0x01);
        OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, &err);
       
        AkWriteReg(0x0A, 0x10);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        AkWriteReg(0x0A, 0x1F);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        //// for test
        AkReadReg(0x00, &sAk8963AdjData.XMagnAdj);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        AkReadReg(0x10, &sAk8963AdjData.XMagnAdj);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        AkReadReg(0x11, &sAk8963AdjData.YMagnAdj);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        AkReadReg(0x12, &sAk8963AdjData.ZMagnAdj);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        AkWriteReg(0x0A, 0x10);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        SpiMpuWriteReg(0x24, 0x5D);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        SpiMpuWriteReg(0x25, SPI_MPU_READ_CMD | AK8963_I2C_ADDR);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        SpiMpuWriteReg(0x26, 0x02);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        SpiMpuWriteReg(0x27, 0x80 | 0x08);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
       
        AkWriteReg(0x0A, 0x16);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        SpiMpuWriteReg(I2C_SLV4_CTRL, 0x01);
        OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_HMSM_STRICT, &err);
        SpiMpuWriteReg(0x67, 0x81);
        OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, &err);
}

收藏 2 评论13 发布时间:2016-3-8 15:14

举报

13个回答
ECDog 回答时间:2016-8-6 22:22:26
power568 发表于 2016-7-7 13:36
解决了,把里面涉及到IIC读写延时的时间加长一点即可...

用spi配置9250为iic master可以读出地磁了吗
power568 回答时间:2016-3-8 16:05:24
自己先顶起来,希望大家多多交流...
power568 回答时间:2016-3-9 16:38:44
默默的等待英雄出现......
power568 回答时间:2016-3-12 15:02:39
恐怕只能靠自己了...
power568 回答时间:2016-3-14 12:42:15
心急但静静的等待...
ricky_wei 回答时间:2016-6-12 12:03:38
你好,我想了解一下,你这块解决了吗?我也一直卡在这,要哭了
power568 回答时间:2016-7-7 13:36:02
解决了,把里面涉及到IIC读写延时的时间加长一点即可...
power568 回答时间:2016-8-8 13:52:04
ECDog 发表于 2016-8-6 22:22
用spi配置9250为iic master可以读出地磁了吗

是的,已经给出解决方案...
ECDog 回答时间:2016-8-9 11:32:13
就是spi要延时久一些等master iic读完吗
power568 回答时间:2016-8-9 13:26:41
ECDog 发表于 2016-8-9 11:32
就是spi要延时久一些等master iic读完吗

对的,就是把上面的延时都适当的加大一点即可...
ECDog 回答时间:2016-8-9 14:55:09
好的谢谢,请问你有没有移植 motion driver 6.12啊
power568 回答时间:2016-8-10 13:27:12
没有,我的应用不需要那么复杂...
ECDog 回答时间:2016-8-10 15:10:53
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版