135 lines
3.9 KiB
C
135 lines
3.9 KiB
C
#include "gSensor/mpu6050.h"
|
||
#include "gSensor/gSensor_manage.h"
|
||
#include "app_config.h"
|
||
#include "imuSensor_manage.h"
|
||
|
||
#if TCFG_MPU6050_EN
|
||
|
||
int gsensorlen = 32;
|
||
OS_MUTEX SENSOR_IIC_MUTEX;
|
||
spinlock_t sensor_iic;
|
||
u8 sensor_iic_init_status = 0;
|
||
|
||
#define ACCEL_ONLY_LOW_POWER 0
|
||
|
||
u8 mpu6050_register_read(u8 addr, u8 *data)
|
||
{
|
||
_gravity_sensor_get_ndata(I2C_ADDR_MPU6050_R, addr, data, 1);
|
||
return 0;
|
||
}
|
||
|
||
u8 mpu6050_register_write(u8 addr, u8 data)
|
||
{
|
||
gravity_sensor_command(I2C_ADDR_MPU6050_W, addr, data);
|
||
return 0;
|
||
}
|
||
|
||
u8 mpu6050_read_nbyte_data(u8 addr, u8 *data, u8 len)
|
||
{
|
||
return _gravity_sensor_get_ndata(I2C_ADDR_MPU6050_R, addr, data, len);
|
||
}
|
||
|
||
u8 mpu6050_get_xyz_data(u8 addr, void *xyz_data)
|
||
{
|
||
u8 buf[6], read_len;
|
||
axis_info_t *data = (axis_info_t *)xyz_data;
|
||
read_len = mpu6050_read_nbyte_data(addr, buf, 6);
|
||
if (read_len == 6) {
|
||
data->x = ((u16)buf[0] << 8) | buf[1];
|
||
data->y = ((u16)buf[2] << 8) | buf[3];
|
||
data->z = ((u16)buf[4] << 8) | buf[5];
|
||
|
||
data->x = 2 * ACCEL_OF_GRAVITY * ACCEL_DATA_GAIN * data->x / 32768;
|
||
data->y = 2 * ACCEL_OF_GRAVITY * ACCEL_DATA_GAIN * data->y / 32768;
|
||
data->z = 2 * ACCEL_OF_GRAVITY * ACCEL_DATA_GAIN * data->z / 32768;
|
||
}
|
||
return read_len;
|
||
}
|
||
|
||
extern void step_cal_init();
|
||
extern int step_cal();
|
||
u8 mpu6050_init()
|
||
{
|
||
u8 res = 0;
|
||
u8 data;
|
||
res = mpu6050_register_read(MPU6050_RA_WHO_AM_I, &data); //读ID
|
||
if (data == MPU_ADDR) {
|
||
g_printf("read MPU6050 ID suss");
|
||
} else {
|
||
g_printf("read MPU6050 ID err");
|
||
return -1;
|
||
}
|
||
|
||
data = 0x80;
|
||
mpu6050_register_write(MPU6050_RA_PWR_MGMT_1, data); //复位
|
||
os_time_dly(10);
|
||
|
||
data = 0x00;
|
||
data |= BIT(3); //关闭温度传感器
|
||
#if ACCEL_ONLY_LOW_POWER
|
||
data |= BIT(5); //设置accel-only低功耗模式
|
||
#endif
|
||
mpu6050_register_write(MPU6050_RA_PWR_MGMT_1, data); //退出休眠
|
||
|
||
data = 0x00;
|
||
data |= (BIT(0) | BIT(1) | BIT(2)); //关闭陀螺仪
|
||
#if ACCEL_ONLY_LOW_POWER
|
||
data |= (3 << 6); //accel-only低功耗模式下,唤醒频率为40Hz
|
||
#endif
|
||
/*mpu6050_register_write(MPU6050_RA_PWR_MGMT_2, data);*/
|
||
|
||
data = ACCEL_RANGE_2G << 3;
|
||
mpu6050_register_write(MPU6050_RA_ACCEL_CONFIG, data); //加速度计量程
|
||
|
||
#if (!ACCEL_ONLY_LOW_POWER)
|
||
data = 0x06;
|
||
mpu6050_register_write(MPU6050_RA_CONFIG, data); //设置陀螺仪输出速率
|
||
|
||
data = MPU6050_GYRO_OUT_RATE / MPU6050_SAMPLE_RATE - 1;
|
||
mpu6050_register_write(MPU6050_RA_SMPLRT_DIV, data); //设置采样率, 采样率=陀螺仪输出速率/(1+SMPLRT_DIV)
|
||
|
||
data = 0x00;
|
||
mpu6050_register_write(MPU6050_RA_INT_ENABLE, data); //关闭中断
|
||
|
||
data = 0x00;
|
||
mpu6050_register_write(MPU6050_RA_USER_CTRL, data); //关闭主机IIC
|
||
#endif
|
||
|
||
/*step_cal_init();*/
|
||
/*sys_timer_add(NULL, step_cal, 50);*/
|
||
return 0;
|
||
}
|
||
|
||
void mpu6050_ctl(u8 cmd, void *arg)
|
||
{
|
||
switch (cmd) {
|
||
case GET_ACCEL_DATA:
|
||
case IMU_GET_ACCEL_DATA:
|
||
mpu6050_get_xyz_data(MPU6050_RA_ACCEL_XOUT_H, arg);
|
||
break;
|
||
case IMU_GET_GYRO_DATA:
|
||
mpu6050_get_xyz_data(MPU6050_RA_GYRO_XOUT_H, arg);
|
||
break;
|
||
case READ_GSENSOR_DATA:
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
REGISTER_GRAVITY_SENSOR(gSensor) = {
|
||
.logo = "mpu6050",
|
||
.gravity_sensor_init = mpu6050_init,
|
||
.gravity_sensor_check = NULL,
|
||
.gravity_sensor_ctl = mpu6050_ctl,
|
||
};
|
||
|
||
//未合到imu: init:gravity_sensor_init(&motion_sensor_data);
|
||
REGISTER_IMU_SENSOR(mpu6050_sensor) = {
|
||
.logo = "mpu6050",
|
||
.imu_sensor_init = mpu6050_init,
|
||
.imu_sensor_check = NULL,
|
||
.imu_sensor_ctl = mpu6050_ctl,
|
||
};
|
||
|
||
#endif //TCFG_MPU6050_EN
|