黄瓜 发表于 2014-5-6 17:40:36

MPU9150的读写代码,居于STM32的

看到越来越多的人开始问MPU9150的问题,看来大家都越来越舍得投资了阿。 {:lol:} {:lol:}

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

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

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--);
}

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















黄瓜 发表于 2014-5-6 17:42:43

MPU6050的也贴下好了。
=======================

#include "anbt_mpu6050.h"
extern unsigned char anbt_ak8975_mag_data_buffer;

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;
        unsigned char data_type,checksum,i;
        //
        AnBT_Uart1_Send_String("M-7,Send chip IDs.",18);
        //
        chip_id=mpu6050_gyro_id;
        chip_id=hmc5883l_mag_id;       
        chip_id=ak8975_mag_id;       
        //
        data_type=0xA0;
        checksum=data_type;
        for(i=0;i<3;i++) checksum+=chip_id;
        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);       
        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;
        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);       
        AnBT_Uart1_Send_Num(checksum);
        AnBT_Uart1_Send_Char('/');
        AnBT_Uart1_Send_Char(13);                                                                                                                                        //圆点博士:发送回车字符
}

黄瓜 发表于 2014-5-6 17:48:07

代码存放在git云库上,大家点击“下载ZIP包到本地”可以直接打包下载所有文件。

976717326 发表于 2014-5-6 18:52:20

先MARK,后面有时间再看。

zddd 发表于 2014-10-27 19:00:55

谢谢分享!赞!

sjf 发表于 2014-10-27 19:55:36

好东西,谢谢分享!!!

aptd 发表于 2015-4-4 15:47:56

楼主辛苦了

xiewei 发表于 2015-7-14 15:29:38

mark。。

张剑花 发表于 2015-12-30 19:09:54

楼主,你有没有MPU9150的中文资料?
有的话发我个。

孤独飞行 发表于 2015-12-31 15:53:11

别的不说,代码写的很规整!赞~
页: [1]
查看完整版本: MPU9150的读写代码,居于STM32的