#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