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--);
}
============================
楼主还有更多常用的四轴代码库,大家可以自由使用。 一个个贴麻烦,大家自己下载吧。注解目前写得还不是特别好,大家将就用。
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); //圆点博士:发送回车字符
}
代码存放在git云库上,大家点击“下载ZIP包到本地”可以直接打包下载所有文件。 先MARK,后面有时间再看。 谢谢分享!赞! 好东西,谢谢分享!!! 楼主辛苦了 mark。。 楼主,你有没有MPU9150的中文资料?
有的话发我个。 别的不说,代码写的很规整!赞~
页:
[1]