搜索
bottom↓
回复: 9

MPU9150的读写代码,居于STM32的

[复制链接]

出0入0汤圆

发表于 2014-5-6 17:40:36 | 显示全部楼层 |阅读模式
看到越来越多的人开始问MPU9150的问题,看来大家都越来越舍得投资了阿。

MPU9150就是MPU6050+AK8975, MPU6050大家肯定轻车熟路拉, 贴一个AK8975的读写代码给大家参考。

================================================
#include "anbt_ak8975.h"
extern unsigned char anbt_ak8975_mag_data_buffer[6];

u8 ANBT_AK8975_MAG_WHOAMI_FUN(void)
{
        u8 anbt_ak8975_mag_id;
        //
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_ADDR);                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_WHOAMI_ADDR);  //圆点博士:发送陀螺仪ID地址
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_ADDR+1);      //圆点博士:发送陀螺仪读地址
        anbt_ak8975_mag_id=ANBT_I2C_ReceiveByte();                                //圆点博士:读出陀螺仪ID
        ANBT_I2C_STOP();
        //
        return anbt_ak8975_mag_id;
}
//
u8 ANBT_AK8975_MAG_Get_Status_FUN(void)
{
        u8 anbt_ak8975_mag_ready;
        //
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_ADDR);                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_ST1_ADDR);  //圆点博士:发送陀螺仪ID地址
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_ADDR+1);      //圆点博士:发送陀螺仪读地址
        anbt_ak8975_mag_ready=ANBT_I2C_ReceiveByte();                                //圆点博士:读出陀螺仪ID
        ANBT_I2C_STOP();
        //
        return anbt_ak8975_mag_ready;
}
//
void ANBT_AK8975_MAG_Read_Data_FUN(u8 *ak8975_mag_data_buffer)
{
        u8 anbt_ak8975_mag_data_ready;
        //       
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_ADDR);                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_CTRL_ADDR);                                                                                  //圆点博士:发送陀螺仪ID地址
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_CTRL_VALUE);                                                                                        
        ANBT_I2C_STOP();
        ANBT_I2C_DELAY;
        //
        AnBT_AK8975_Delay(10000);
        //
        anbt_ak8975_mag_data_ready=ANBT_AK8975_MAG_Get_Status_FUN();
        if(anbt_ak8975_mag_data_ready&0x01)
        {
        ANBT_I2C_DELAY;
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_ADDR);                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_DATA_ADDR); //圆点博士:发送陀螺仪ID地址
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_AK8975_MAG_ADDR+1);      //圆点博士:发送陀螺仪读地址
        ANBT_I2C_Receive6Bytes(ak8975_mag_data_buffer);
        ANBT_I2C_STOP();
        //
        }
}

void ANBT_AK8975_SEND_MAG_DATA_FUN(u8 *ak8975_mag_data_buffer)       
{
        unsigned char data_type,checksum,i;
        //
        data_type=0xA3;
        checksum=data_type;
        for(i=0;i<6;i++) checksum+=ak8975_mag_data_buffer;
        checksum&=0xff;
        checksum=~checksum;
        checksum++;
        //
        AnBT_Uart1_Send_Char(':');
        AnBT_Uart1_Send_Num(data_type);
        for(i=0;i<6;i++) AnBT_Uart1_Send_Num(ak8975_mag_data_buffer);       
        AnBT_Uart1_Send_Num(checksum);
        AnBT_Uart1_Send_Char('/');
        AnBT_Uart1_Send_Char(13);                                                                                                                                        //圆点博士:发送回车字符
}

void AnBT_AK8975_Delay(unsigned int nCount)                   //圆点博士:延时函数
{
        for(; nCount != 0; nCount--);
}

============================
楼主还有更多常用的四轴代码库,大家可以自由使用。 一个个贴麻烦,大家自己下载吧。注解目前写得还不是特别好,大家将就用。















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2014-5-6 17:42:43 | 显示全部楼层
MPU6050的也贴下好了。
=======================

#include "anbt_mpu6050.h"
extern unsigned char anbt_ak8975_mag_data_buffer[6];

void ANBT_MPU6050_Init(void)       
{
        AnBT_Uart1_Send_String("M-6,Init MPU6050 Device.",24);
        //
        ANBT_MPU6050_PWM_CFG_FUN();                         //圆点博士:设置内部时钟
        ANBT_MPU6050_EXIT_SLEEP_FUN();    //圆点博士:退出休眠模式
        ANBT_MPU6050_GYRO_CFG_FUN();      //圆点博士:设置陀螺仪量程
        ANBT_MPU6050_ACCEL_CFG_FUN();     //圆点博士:设置加速度量程
        ANBT_MPU6050_USER_CTRL_FUN();
        ANBT_MPU6050_I2CBYPASS_CFG_FUN(); //圆点博士:设置电磁读写模式
        ANBT_MPU6050_INT_CFG_FUN();
}

void ANBT_SEND_CHIP_IDs_FUN(u8 mpu6050_gyro_id,u8 hmc5883l_mag_id,u8 ak8975_mag_id)       
{
        unsigned char chip_id[3];
        unsigned char data_type,checksum,i;
        //
        AnBT_Uart1_Send_String("M-7,Send chip IDs.",18);
        //
        chip_id[0]=mpu6050_gyro_id;
        chip_id[1]=hmc5883l_mag_id;       
        chip_id[2]=ak8975_mag_id;       
        //
        data_type=0xA0;
        checksum=data_type;
        for(i=0;i<3;i++) checksum+=chip_id[i];
        checksum&=0xff;
        checksum=~checksum;
        checksum++;
        //
        AnBT_Uart1_Send_Char(':');
        AnBT_Uart1_Send_Num(data_type);
        for(i=0;i<3;i++) AnBT_Uart1_Send_Num(chip_id[i]);       
        AnBT_Uart1_Send_Num(checksum);
        AnBT_Uart1_Send_Char('/');
        AnBT_Uart1_Send_Char(13);                                                                                                                                        //圆点博士:发送回车字符
}

u8 ANBT_MPU6050_GYRO_WHOAMI_FUN(void)
{
        u8 anbt_mpu6050_gyro_id;
        //
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR);                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_WHOAMI_ADDR);  //圆点博士:发送陀螺仪ID地址
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR+1);      //圆点博士:发送陀螺仪读地址
        anbt_mpu6050_gyro_id=ANBT_I2C_ReceiveByte();                                //圆点博士:读出陀螺仪ID
        ANBT_I2C_STOP();
        //
        return anbt_mpu6050_gyro_id;
}
//
u8 ANBT_MPU6050_READ_REG_FUN(u8 anbt_mpu6050_dev_addr,u8 anbt_mpu6050_reg_addr)   
{
        u8 anbt_mpu6050_reg;
       
        ANBT_I2C_START();
        ANBT_I2C_SendByte(anbt_mpu6050_dev_addr);                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(anbt_mpu6050_reg_addr);    //圆点博士:发送陀螺仪寄存器地址
        ANBT_I2C_START();
        ANBT_I2C_SendByte(anbt_mpu6050_dev_addr+1);      //圆点博士:发送陀螺仪读地址
        anbt_mpu6050_reg=ANBT_I2C_ReceiveByte();                        //圆点博士:读出陀螺仪寄存器值
        ANBT_I2C_STOP();
        //
        return anbt_mpu6050_reg;
}

void ANBT_MPU6050_PWM_CFG_FUN(void)   
{
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR);                                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_MPU6050_PWR_MGMT_1_ADDR);  //圆点博士:发送陀螺仪PWM地址
        ANBT_I2C_SendByte(ANBT_MPU6050_PWR_MGMT_1_VALUE); //圆点博士:发送陀螺仪PWM值
        ANBT_I2C_STOP();
}
//
void ANBT_MPU6050_GYRO_CFG_FUN(void)   
{
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR);                                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_CFG_ADDR);           //圆点博士:发送陀螺仪PWM地址
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_CFG_VALUE);         //圆点博士:发送陀螺仪PWM值
        ANBT_I2C_STOP();
}
//
void ANBT_MPU6050_ACCEL_CFG_FUN(void)   
{
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR);                                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_MPU6050_ACCEL_CFG_ADDR);   //圆点博士:发送陀螺仪PWM地址
        ANBT_I2C_SendByte(ANBT_MPU6050_ACCEL_CFG_VALUE);         //圆点博士:发送陀螺仪PWM值
        ANBT_I2C_STOP();
}

void ANBT_MPU6050_EXIT_SLEEP_FUN(void)  
{
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR);                                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_MPU6050_PWR_MGMT_1_ADDR);  //圆点博士:发送陀螺仪PWM地址
        ANBT_I2C_SendByte(ANBT_MPU6050_EXIT_SLEEP_VALUE); //圆点博士:发送陀螺仪PWM值
        ANBT_I2C_STOP();
}

void ANBT_MPU6050_USER_CTRL_FUN(void)   
{
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR);                                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_MPU6050_USER_CTRL_ADDR);  //圆点博士:发送陀螺仪PWM地址
        ANBT_I2C_SendByte(ANBT_MPU6050_USER_CTRL_VALUE); //圆点博士:发送陀螺仪PWM值
        ANBT_I2C_STOP();
}

void ANBT_MPU6050_I2CBYPASS_CFG_FUN(void)   
{
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR);                                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_MPU6050_I2CBYPASS_CFG_ADDR);   //圆点博士:发送陀螺仪PWM地址
        ANBT_I2C_SendByte(ANBT_MPU6050_I2CBYPASS_CFG_VALUE);         //圆点博士:发送陀螺仪PWM值
        ANBT_I2C_STOP();
}

void ANBT_MPU6050_INT_CFG_FUN(void)   
{
        ANBT_I2C_START();
        ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR);                                        //圆点博士:发送陀螺仪写地址
        ANBT_I2C_SendByte(ANBT_MPU6050_INT_CFG_ADDR);   //圆点博士:发送陀螺仪PWM地址
        ANBT_I2C_SendByte(ANBT_MPU6050_INT_CFG_VALUE);         //圆点博士:发送陀螺仪PWM值
        ANBT_I2C_STOP();
}

void ANBT_MPU6050_GYRO_READ_FUN(u8 *mpu6050_gyro_data_buffer)   
{
        if(!ANBT_MPU6050_INT_STATE)
        {
                ANBT_I2C_START();
                ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR);                        //圆点博士:发送陀螺仪写地址
                ANBT_I2C_SendByte(ANBT_MPU6050_ACCEL_DATA_ADDR);    //圆点博士:发送陀螺仪寄存器地址
                ANBT_I2C_START();
                ANBT_I2C_SendByte(ANBT_MPU6050_GYRO_ADDR+1);      //圆点博士:发送陀螺仪读地址
                ANBT_I2C_Receive14Bytes(mpu6050_gyro_data_buffer);                        //圆点博士:读出陀螺仪寄存器值
                ANBT_I2C_STOP();
        }
}

void ANBT_MPU6050_SEND_DATA_FUN(u8 *mpu6050_gyro_data_buffer)       
{
        unsigned char data_type,checksum,i;
        //
        data_type=0xA1;
        checksum=data_type;
        for(i=0;i<14;i++) checksum+=mpu6050_gyro_data_buffer[i];
        checksum&=0xff;
        checksum=~checksum;
        checksum++;
        //
        AnBT_Uart1_Send_Char(':');
        AnBT_Uart1_Send_Num(data_type);
        for(i=0;i<14;i++) AnBT_Uart1_Send_Num(mpu6050_gyro_data_buffer[i]);       
        AnBT_Uart1_Send_Num(checksum);
        AnBT_Uart1_Send_Char('/');
        AnBT_Uart1_Send_Char(13);                                                                                                                                        //圆点博士:发送回车字符
}

出0入0汤圆

 楼主| 发表于 2014-5-6 17:48:07 | 显示全部楼层
代码存放在git云库上,大家点击“下载ZIP包到本地”可以直接打包下载所有文件。

出0入0汤圆

发表于 2014-5-6 18:52:20 | 显示全部楼层
先MARK,后面有时间再看。

出0入0汤圆

发表于 2014-10-27 19:00:55 | 显示全部楼层
谢谢分享!赞!

出0入0汤圆

发表于 2014-10-27 19:55:36 | 显示全部楼层
好东西,谢谢分享!!!

出0入0汤圆

发表于 2015-4-4 15:47:56 | 显示全部楼层
楼主辛苦了

出0入0汤圆

发表于 2015-7-14 15:29:38 | 显示全部楼层
mark。。

出0入0汤圆

发表于 2015-12-30 19:09:54 | 显示全部楼层
楼主,你有没有MPU9150的中文资料?
有的话发我个。

出0入0汤圆

发表于 2015-12-31 15:53:11 | 显示全部楼层
别的不说,代码写的很规整!赞~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 20:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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