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

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读完吗
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版