!14 修复IoT平台命令下发失败问题

Merge pull request !14 from Laowang-BearPi/master
This commit is contained in:
openharmony_ci
2021-10-22 02:47:32 +00:00
committed by Gitee
8 changed files with 170 additions and 135 deletions
+22 -1
View File
@@ -37,6 +37,9 @@
#define MPU6050_RA_USER_CTRL 0x6A
#define MPU6050_RA_PWR_MGMT_1 0x6B
#define MPU6050_RA_WHO_AM_I 0x75
#define SENSOR_DATA_WIDTH_8_BIT 8 // 8 bit
#define ACCEL_DATA_LEN 6
#define TEMP_DATA_LEN 2
typedef enum
{
@@ -44,6 +47,25 @@ typedef enum
ON
} E53SC2Status;
enum AccelAxisNum {
ACCEL_X_AXIS = 0,
ACCEL_Y_AXIS = 1,
ACCEL_Z_AXIS = 2,
ACCEL_AXIS_NUM = 3,
};
enum AccelAxisPart {
ACCEL_X_AXIS_LSB = 0,
ACCEL_X_AXIS_MSB = 1,
ACCEL_Y_AXIS_LSB = 2,
ACCEL_Y_AXIS_MSB = 3,
ACCEL_Z_AXIS_LSB = 4,
ACCEL_Z_AXIS_MSB = 5,
ACCEL_AXIS_BUTT,
};
enum TempPart {
TEMP_LSB = 0,
TEMP_MSB = 1,
};
/* E53_SC2传感器数据类型定义 ------------------------------------------------------------*/
typedef struct
{
@@ -51,7 +73,6 @@ typedef struct
short Accel[3];
} E53SC2Data;
int E53SC2Init(void);
int E53SC2ReadData(E53SC2Data *ReadData);
void LedD1StatusSet(E53SC2Status status);
+61 -61
View File
@@ -30,6 +30,12 @@
#define WIFI_IOT_IO_FUNC_GPIO_8_GPIO 0
#define WIFI_IOT_IO_FUNC_GPIO_7_GPIO 0
#define WIFI_IOT_I2C_IDX_1 1
#define WIFI_IOT_IO_NAME_GPIO_7 7
#define WIFI_IOT_IO_NAME_GPIO_8 8
#define WIFI_IOT_IO_NAME_GPIO_0 0
#define WIFI_IOT_IO_NAME_GPIO_1 1
#define RESET_DELAY_US 20000
#define READ_DATA_DELAY_US 50000
/***************************************************************
* 函数名称: E53SC2IoInit
@@ -39,18 +45,18 @@
***************************************************************/
static void E53SC2IoInit(void)
{
IoTGpioInit(8);
IoTGpioSetFunc(8, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);
IoTGpioSetDir(8, IOT_GPIO_DIR_OUT); //设置GPIO_8为输出模式
IoTGpioInit(WIFI_IOT_IO_NAME_GPIO_8);
IoTGpioSetFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);
IoTGpioSetDir(WIFI_IOT_IO_NAME_GPIO_8, IOT_GPIO_DIR_OUT); // 设置GPIO_8为输出模式
IoTGpioInit(7);
IoTGpioSetFunc(7, WIFI_IOT_IO_FUNC_GPIO_7_GPIO);
IoTGpioSetDir(7, IOT_GPIO_DIR_OUT); //设置GPIO_7为输出模式
IoTGpioInit(WIFI_IOT_IO_NAME_GPIO_7);
IoTGpioSetFunc(WIFI_IOT_IO_NAME_GPIO_7, WIFI_IOT_IO_FUNC_GPIO_7_GPIO);
IoTGpioSetDir(WIFI_IOT_IO_NAME_GPIO_7, IOT_GPIO_DIR_OUT); // 设置GPIO_7为输出模式
IoTGpioInit(0);
IoTGpioSetFunc(0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA); // GPIO_0复用为I2C1_SDA
IoTGpioInit(1);
IoTGpioSetFunc(1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL); // GPIO_1复用为I2C1_SCL
IoTGpioInit(WIFI_IOT_IO_NAME_GPIO_0);
IoTGpioSetFunc(WIFI_IOT_IO_NAME_GPIO_0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA); // GPIO_0复用为I2C1_SDA
IoTGpioInit(WIFI_IOT_IO_NAME_GPIO_1);
IoTGpioSetFunc(WIFI_IOT_IO_NAME_GPIO_1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL); // GPIO_1复用为I2C1_SCL
IoTI2cInit(WIFI_IOT_I2C_IDX_1, 400000); /* baudrate: 400kbps */
}
/***************************************************************
@@ -157,14 +163,14 @@ static int MPU6050ReadData(uint8_t reg_add, unsigned char* read, uint8_t num)
static int MPU6050ReadAcc(short* accData)
{
int ret;
uint8_t buf[6];
ret = MPU6050ReadData(MPU6050_ACC_OUT, buf, 6);
uint8_t buf[ACCEL_DATA_LEN];
ret = MPU6050ReadData(MPU6050_ACC_OUT, buf, ACCEL_DATA_LEN);
if (ret != 0) {
return -1;
}
accData[0] = (buf[0] << 8) | buf[1];
accData[1] = (buf[2] << 8) | buf[3];
accData[2] = (buf[4] << 8) | buf[5];
accData[ACCEL_X_AXIS] = (buf[ACCEL_X_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_X_AXIS_MSB];
accData[ACCEL_Y_AXIS] = (buf[ACCEL_Y_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_Y_AXIS_MSB];
accData[ACCEL_Z_AXIS] = (buf[ACCEL_Z_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_Z_AXIS_MSB];
return 0;
}
@@ -177,14 +183,14 @@ static int MPU6050ReadAcc(short* accData)
static int MPU6050ReadGyro(short* gyroData)
{
int ret;
uint8_t buf[6];
ret = MPU6050ReadData(MPU6050_GYRO_OUT, buf, 6);
uint8_t buf[ACCEL_DATA_LEN];
ret = MPU6050ReadData(MPU6050_GYRO_OUT, buf, ACCEL_DATA_LEN);
if (ret != 0) {
return -1;
}
gyroData[0] = (buf[0] << 8) | buf[1];
gyroData[1] = (buf[2] << 8) | buf[3];
gyroData[2] = (buf[4] << 8) | buf[5];
gyroData[ACCEL_X_AXIS] = (buf[ACCEL_X_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_X_AXIS_MSB];
gyroData[ACCEL_Y_AXIS] = (buf[ACCEL_Y_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_Y_AXIS_MSB];
gyroData[ACCEL_Z_AXIS] = (buf[ACCEL_Z_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_Z_AXIS_MSB];
return 0;
}
@@ -197,12 +203,12 @@ static int MPU6050ReadGyro(short* gyroData)
static int MPU6050ReadTemp(short* tempData)
{
int ret;
uint8_t buf[2];
ret = MPU6050ReadData(MPU6050_RA_TEMP_OUT_H, buf, 2); //读取温度值
uint8_t buf[TEMP_DATA_LEN];
ret = MPU6050ReadData(MPU6050_RA_TEMP_OUT_H, buf, TEMP_DATA_LEN); // 读取温度值
if (ret != 0) {
return -1;
}
*tempData = (buf[0] << 8) | buf[1];
*tempData = (buf[TEMP_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[TEMP_MSB];
return 0;
}
@@ -216,14 +222,15 @@ static int MPU6050ReturnTemp(short* Temperature)
{
int ret;
short temp3;
uint8_t buf[2];
uint8_t buf[TEMP_DATA_LEN];
ret = MPU6050ReadData(MPU6050_RA_TEMP_OUT_H, buf, 2); //读取温度值
ret = MPU6050ReadData(MPU6050_RA_TEMP_OUT_H, buf, TEMP_DATA_LEN); // 读取温度值
if (ret != 0) {
return -1;
}
temp3 = (buf[0] << 8) | buf[1];
temp3 = (buf[TEMP_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[TEMP_MSB];
*Temperature = (((double)(temp3 + 13200)) / 280) - 13;
return 0;
}
/***************************************************************
@@ -232,20 +239,20 @@ static int MPU6050ReturnTemp(short* Temperature)
* 返 回 值: 无
* 说 明: 无
**************************************************************/
void FreeFallInterrupt(void) //自由落体中断
void FreeFallInterrupt(void) // 自由落体中断
{
MPU6050WriteReg(MPU6050_RA_FF_THR, 0x01); //自由落体阈值
MPU6050WriteReg(MPU6050_RA_FF_DUR, 0x01); //自由落体检测时间20ms 单位1ms 寄存器0X20
MPU6050WriteReg(MPU6050_RA_FF_THR, 0x01); // 自由落体阈值
MPU6050WriteReg(MPU6050_RA_FF_DUR, 0x01); // 自由落体检测时间20ms 单位1ms 寄存器0X20
}
void MotionInterrupt(void) //运动中断
void MotionInterrupt(void) // 运动中断
{
MPU6050WriteReg(MPU6050_RA_MOT_THR, 0x03); //运动阈值
MPU6050WriteReg(MPU6050_RA_MOT_DUR, 0x14); //检测时间20ms 单位1ms 寄存器0X20
MPU6050WriteReg(MPU6050_RA_MOT_THR, 0x03); // 运动阈值
MPU6050WriteReg(MPU6050_RA_MOT_DUR, 0x14); // 检测时间20ms 单位1ms 寄存器0X20
}
void ZeroMotionInterrupt(void) //静止中断
void ZeroMotionInterrupt(void) // 静止中断
{
MPU6050WriteReg(MPU6050_RA_ZRMOT_THR, 0x20); //静止阈值
MPU6050WriteReg(MPU6050_RA_ZRMOT_DUR, 0x20); //静止检测时间20ms 单位1ms 寄存器0X20
MPU6050WriteReg(MPU6050_RA_ZRMOT_THR, 0x20); // 静止阈值
MPU6050WriteReg(MPU6050_RA_ZRMOT_DUR, 0x20); // 静止检测时间20ms 单位1ms 寄存器0X20
}
/***************************************************************
@@ -256,26 +263,19 @@ void ZeroMotionInterrupt(void) //静止中断
***************************************************************/
void MPU6050Init(void)
{
int i = 0, j = 0;
//在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
for (i = 0; i < 1000; i++) {
for (j = 0; j < 1000; j++) {
;
}
}
MPU6050WriteReg(MPU6050_RA_PWR_MGMT_1, 0X80); //复位MPU6050
usleep(20000);
MPU6050WriteReg(MPU6050_RA_PWR_MGMT_1, 0X00); //唤醒MPU6050
MPU6050WriteReg(MPU6050_RA_INT_ENABLE, 0X00); //关闭所有中断
MPU6050WriteReg(MPU6050_RA_PWR_MGMT_1, 0X80); // 复位MPU6050
usleep(RESET_DELAY_US);
MPU6050WriteReg(MPU6050_RA_PWR_MGMT_1, 0X00); // 唤醒MPU6050
MPU6050WriteReg(MPU6050_RA_INT_ENABLE, 0X00); // 关闭所有中断
MPU6050WriteReg(MPU6050_RA_USER_CTRL, 0X00); // I2C主模式关闭
MPU6050WriteReg(MPU6050_RA_FIFO_EN, 0X00); //关闭FIFO
MPU6050WriteReg(MPU6050_RA_FIFO_EN, 0X00); // 关闭FIFO
MPU6050WriteReg(MPU6050_RA_INT_PIN_CFG,
0X80); //中断的逻辑电平模式,设置为0,中断信号为高电;设置为1,中断信号为低电平时。
MotionInterrupt(); //运动中断
MPU6050WriteReg(MPU6050_RA_CONFIG, 0x04); //配置外部引脚采样和DLPF数字低通滤波器
MPU6050WriteReg(MPU6050_RA_ACCEL_CONFIG, 0x1C); //加速度传感器量程和高通滤波器配置
0X80); // 中断的逻辑电平模式,设置为0,中断信号为高电;设置为1,中断信号为低电平时。
MotionInterrupt(); // 运动中断
MPU6050WriteReg(MPU6050_RA_CONFIG, 0x04); // 配置外部引脚采样和DLPF数字低通滤波器
MPU6050WriteReg(MPU6050_RA_ACCEL_CONFIG, 0x1C); // 加速度传感器量程和高通滤波器配置
MPU6050WriteReg(MPU6050_RA_INT_PIN_CFG, 0X1C); // INT引脚低电平平时
MPU6050WriteReg(MPU6050_RA_INT_ENABLE, 0x40); //中断使能寄存器
MPU6050WriteReg(MPU6050_RA_INT_ENABLE, 0x40); // 中断使能寄存器
}
/***************************************************************
@@ -287,7 +287,7 @@ void MPU6050Init(void)
int MPU6050ReadID(void)
{
unsigned char Re = 0;
MPU6050ReadData(MPU6050_RA_WHO_AM_I, &Re, 1); //读器件地址
MPU6050ReadData(MPU6050_RA_WHO_AM_I, &Re, 1); // 读器件地址
if (Re != 0x68) {
printf("MPU6050 dectected error!\r\n");
return -1;
@@ -337,10 +337,10 @@ int E53SC2ReadData(E53SC2Data* ReadData)
return -1;
}
ReadData->Temperature = Temp;
ReadData->Accel[0] = Accel[0];
ReadData->Accel[1] = Accel[1];
ReadData->Accel[2] = Accel[2];
usleep(50000);
ReadData->Accel[ACCEL_X_AXIS] = Accel[ACCEL_X_AXIS];
ReadData->Accel[ACCEL_Y_AXIS] = Accel[ACCEL_Y_AXIS];
ReadData->Accel[ACCEL_Z_AXIS] = Accel[ACCEL_Z_AXIS];
usleep(READ_DATA_DELAY_US);
return 0;
}
/***************************************************************
@@ -354,10 +354,10 @@ int E53SC2ReadData(E53SC2Data* ReadData)
void LedD1StatusSet(E53SC2Status status)
{
if (status == ON) {
IoTGpioSetOutputVal(7, 1); //设置GPIO_7输出高电平点亮灯
IoTGpioSetOutputVal(7, 1); // 设置GPIO_7输出高电平点亮灯
}
if (status == OFF) {
IoTGpioSetOutputVal(7, 0); //设置GPIO_7输出低电平关闭灯
IoTGpioSetOutputVal(7, 0); // 设置GPIO_7输出低电平关闭灯
}
}
@@ -372,10 +372,10 @@ void LedD1StatusSet(E53SC2Status status)
void LedD2StatusSet(E53SC2Status status)
{
if (status == ON) {
IoTGpioSetOutputVal(8, 1); //设置GPIO_8输出高电平点亮灯
IoTGpioSetOutputVal(8, 1); // 设置GPIO_8输出高电平点亮灯
}
if (status == OFF) {
IoTGpioSetOutputVal(8, 0); //设置GPIO_8输出低电平关闭灯
IoTGpioSetOutputVal(8, 0); // 设置GPIO_8输出低电平关闭灯
}
}
@@ -165,7 +165,7 @@ static void IotMainTaskEntry(void)
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = CLOUD_TASK_STACK_SIZES;
attr.stack_size = CLOUD_TASK_STACK_SIZE;
attr.priority = CLOUD_TASK_PRIO;
if (osThreadNew((osThreadFunc_t)CloudMainTaskEntry, NULL, &attr) == NULL) {
@@ -185,7 +185,7 @@ static void deal_cmd_msg(cmd_t* cmd)
if (obj_cmdname == NULL) {
cJSON_Delete(obj_root);
}
if (strcmp(cJSON_GetStringValue(obj_cmdname), "Track_Control_Beep" == 0)) {
if (strcmp(cJSON_GetStringValue(obj_cmdname), "Track_Control_Beep") == 0) {
obj_paras = cJSON_GetObjectItem(obj_root, "paras");
if (obj_paras == NULL) {
cJSON_Delete(obj_root);
@@ -195,7 +195,7 @@ static void deal_cmd_msg(cmd_t* cmd)
cJSON_Delete(obj_root);
}
///< operate the Beep here
if (strcmp(cJSON_GetStringValue(obj_para), "ON" == 0)) {
if (strcmp(cJSON_GetStringValue(obj_para), "ON") == 0) {
g_app_cb.beep = 1;
BeepStatusSet(ON);
printf("Beep On!\r\n");
@@ -177,7 +177,7 @@ static void deal_cmd_msg(cmd_t* cmd)
if (obj_cmdname == NULL) {
cJSON_Delete(obj_root);
}
if (strcmp(cJSON_GetStringValue(obj_cmdname), "Light_Control_Led" == 0)) {
if (strcmp(cJSON_GetStringValue(obj_cmdname), "Light_Control_Led") == 0) {
obj_paras = cJSON_GetObjectItem(obj_root, "paras");
if (obj_paras == NULL) {
cJSON_Delete(obj_root);
@@ -37,6 +37,9 @@
#define MPU6050_RA_USER_CTRL 0x6A
#define MPU6050_RA_PWR_MGMT_1 0x6B
#define MPU6050_RA_WHO_AM_I 0x75
#define SENSOR_DATA_WIDTH_8_BIT 8 // 8 bit
#define SENSOR_DATA_WIDTH_8_BIT 8 // 8 bit
#define SENSOR_DATA_WIDTH_8_BIT 8 // 8 bit
typedef enum
{
@@ -44,6 +47,25 @@ typedef enum
ON
} E53SC2Status;
enum AccelAxisNum {
ACCEL_X_AXIS = 0,
ACCEL_Y_AXIS = 1,
ACCEL_Z_AXIS = 2,
ACCEL_AXIS_NUM = 3,
};
enum AccelAxisPart {
ACCEL_X_AXIS_LSB = 0,
ACCEL_X_AXIS_MSB = 1,
ACCEL_Y_AXIS_LSB = 2,
ACCEL_Y_AXIS_MSB = 3,
ACCEL_Z_AXIS_LSB = 4,
ACCEL_Z_AXIS_MSB = 5,
ACCEL_AXIS_BUTT,
};
enum TempPart {
TEMP_LSB = 0,
TEMP_MSB = 1,
};
/* E53_SC2传感器数据类型定义 ------------------------------------------------------------*/
typedef struct
{
@@ -51,7 +73,6 @@ typedef struct
short Accel[3];
} E53SC2Data;
int E53SC2Init(void);
int E53SC2ReadData(E53SC2Data *ReadData);
void LedD1StatusSet(E53SC2Status status);
@@ -52,13 +52,6 @@
#define TASK_DELAY 3
#define FLIP_THRESHOLD 100
enum AccelAxisNum {
ACCEL_X_AXIS = 0,
ACCEL_Y_AXIS = 1,
ACCEL_Z_AXIS = 2,
ACCEL_AXIS_NUM = 3,
};
typedef enum {
en_msg_cmd = 0,
en_msg_report,
+61 -61
View File
@@ -30,6 +30,12 @@
#define WIFI_IOT_IO_FUNC_GPIO_8_GPIO 0
#define WIFI_IOT_IO_FUNC_GPIO_7_GPIO 0
#define WIFI_IOT_I2C_IDX_1 1
#define WIFI_IOT_IO_NAME_GPIO_7 7
#define WIFI_IOT_IO_NAME_GPIO_8 8
#define WIFI_IOT_IO_NAME_GPIO_0 0
#define WIFI_IOT_IO_NAME_GPIO_1 1
#define RESET_DELAY_US 20000
#define READ_DATA_DELAY_US 50000
/***************************************************************
* 函数名称: E53SC2IoInit
@@ -39,18 +45,18 @@
***************************************************************/
static void E53SC2IoInit(void)
{
IoTGpioInit(8);
IoTGpioSetFunc(8, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);
IoTGpioSetDir(8, IOT_GPIO_DIR_OUT); //设置GPIO_8为输出模式
IoTGpioInit(WIFI_IOT_IO_NAME_GPIO_8);
IoTGpioSetFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);
IoTGpioSetDir(WIFI_IOT_IO_NAME_GPIO_8, IOT_GPIO_DIR_OUT); // 设置GPIO_8为输出模式
IoTGpioInit(7);
IoTGpioSetFunc(7, WIFI_IOT_IO_FUNC_GPIO_7_GPIO);
IoTGpioSetDir(7, IOT_GPIO_DIR_OUT); //设置GPIO_7为输出模式
IoTGpioInit(WIFI_IOT_IO_NAME_GPIO_7);
IoTGpioSetFunc(WIFI_IOT_IO_NAME_GPIO_7, WIFI_IOT_IO_FUNC_GPIO_7_GPIO);
IoTGpioSetDir(WIFI_IOT_IO_NAME_GPIO_7, IOT_GPIO_DIR_OUT); // 设置GPIO_7为输出模式
IoTGpioInit(0);
IoTGpioSetFunc(0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA); // GPIO_0复用为I2C1_SDA
IoTGpioInit(1);
IoTGpioSetFunc(1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL); // GPIO_1复用为I2C1_SCL
IoTGpioInit(WIFI_IOT_IO_NAME_GPIO_0);
IoTGpioSetFunc(WIFI_IOT_IO_NAME_GPIO_0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA); // GPIO_0复用为I2C1_SDA
IoTGpioInit(WIFI_IOT_IO_NAME_GPIO_1);
IoTGpioSetFunc(WIFI_IOT_IO_NAME_GPIO_1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL); // GPIO_1复用为I2C1_SCL
IoTI2cInit(WIFI_IOT_I2C_IDX_1, 400000); /* baudrate: 400kbps */
}
/***************************************************************
@@ -157,14 +163,14 @@ static int MPU6050ReadData(uint8_t reg_add, unsigned char* read, uint8_t num)
static int MPU6050ReadAcc(short* accData)
{
int ret;
uint8_t buf[6];
ret = MPU6050ReadData(MPU6050_ACC_OUT, buf, 6);
uint8_t buf[ACCEL_DATA_LEN];
ret = MPU6050ReadData(MPU6050_ACC_OUT, buf, ACCEL_DATA_LEN);
if (ret != 0) {
return -1;
}
accData[0] = (buf[0] << 8) | buf[1];
accData[1] = (buf[2] << 8) | buf[3];
accData[2] = (buf[4] << 8) | buf[5];
accData[ACCEL_X_AXIS] = (buf[ACCEL_X_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_X_AXIS_MSB];
accData[ACCEL_Y_AXIS] = (buf[ACCEL_Y_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_Y_AXIS_MSB];
accData[ACCEL_Z_AXIS] = (buf[ACCEL_Z_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_Z_AXIS_MSB];
return 0;
}
@@ -177,14 +183,14 @@ static int MPU6050ReadAcc(short* accData)
static int MPU6050ReadGyro(short* gyroData)
{
int ret;
uint8_t buf[6];
ret = MPU6050ReadData(MPU6050_GYRO_OUT, buf, 6);
uint8_t buf[ACCEL_DATA_LEN];
ret = MPU6050ReadData(MPU6050_GYRO_OUT, buf, ACCEL_DATA_LEN);
if (ret != 0) {
return -1;
}
gyroData[0] = (buf[0] << 8) | buf[1];
gyroData[1] = (buf[2] << 8) | buf[3];
gyroData[2] = (buf[4] << 8) | buf[5];
gyroData[ACCEL_X_AXIS] = (buf[ACCEL_X_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_X_AXIS_MSB];
gyroData[ACCEL_Y_AXIS] = (buf[ACCEL_Y_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_Y_AXIS_MSB];
gyroData[ACCEL_Z_AXIS] = (buf[ACCEL_Z_AXIS_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[ACCEL_Z_AXIS_MSB];
return 0;
}
@@ -197,12 +203,12 @@ static int MPU6050ReadGyro(short* gyroData)
static int MPU6050ReadTemp(short* tempData)
{
int ret;
uint8_t buf[2];
ret = MPU6050ReadData(MPU6050_RA_TEMP_OUT_H, buf, 2); //读取温度值
uint8_t buf[TEMP_DATA_LEN];
ret = MPU6050ReadData(MPU6050_RA_TEMP_OUT_H, buf, TEMP_DATA_LEN); // 读取温度值
if (ret != 0) {
return -1;
}
*tempData = (buf[0] << 8) | buf[1];
*tempData = (buf[TEMP_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[TEMP_MSB];
return 0;
}
@@ -216,14 +222,15 @@ static int MPU6050ReturnTemp(short* Temperature)
{
int ret;
short temp3;
uint8_t buf[2];
uint8_t buf[TEMP_DATA_LEN];
ret = MPU6050ReadData(MPU6050_RA_TEMP_OUT_H, buf, 2); //读取温度值
ret = MPU6050ReadData(MPU6050_RA_TEMP_OUT_H, buf, TEMP_DATA_LEN); // 读取温度值
if (ret != 0) {
return -1;
}
temp3 = (buf[0] << 8) | buf[1];
temp3 = (buf[TEMP_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[TEMP_MSB];
*Temperature = (((double)(temp3 + 13200)) / 280) - 13;
return 0;
}
/***************************************************************
@@ -232,20 +239,20 @@ static int MPU6050ReturnTemp(short* Temperature)
* 返 回 值: 无
* 说 明: 无
**************************************************************/
void FreeFallInterrupt(void) //自由落体中断
void FreeFallInterrupt(void) // 自由落体中断
{
MPU6050WriteReg(MPU6050_RA_FF_THR, 0x01); //自由落体阈值
MPU6050WriteReg(MPU6050_RA_FF_DUR, 0x01); //自由落体检测时间20ms 单位1ms 寄存器0X20
MPU6050WriteReg(MPU6050_RA_FF_THR, 0x01); // 自由落体阈值
MPU6050WriteReg(MPU6050_RA_FF_DUR, 0x01); // 自由落体检测时间20ms 单位1ms 寄存器0X20
}
void MotionInterrupt(void) //运动中断
void MotionInterrupt(void) // 运动中断
{
MPU6050WriteReg(MPU6050_RA_MOT_THR, 0x03); //运动阈值
MPU6050WriteReg(MPU6050_RA_MOT_DUR, 0x14); //检测时间20ms 单位1ms 寄存器0X20
MPU6050WriteReg(MPU6050_RA_MOT_THR, 0x03); // 运动阈值
MPU6050WriteReg(MPU6050_RA_MOT_DUR, 0x14); // 检测时间20ms 单位1ms 寄存器0X20
}
void ZeroMotionInterrupt(void) //静止中断
void ZeroMotionInterrupt(void) // 静止中断
{
MPU6050WriteReg(MPU6050_RA_ZRMOT_THR, 0x20); //静止阈值
MPU6050WriteReg(MPU6050_RA_ZRMOT_DUR, 0x20); //静止检测时间20ms 单位1ms 寄存器0X20
MPU6050WriteReg(MPU6050_RA_ZRMOT_THR, 0x20); // 静止阈值
MPU6050WriteReg(MPU6050_RA_ZRMOT_DUR, 0x20); // 静止检测时间20ms 单位1ms 寄存器0X20
}
/***************************************************************
@@ -256,26 +263,19 @@ void ZeroMotionInterrupt(void) //静止中断
***************************************************************/
void MPU6050Init(void)
{
int i = 0, j = 0;
//在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
for (i = 0; i < 1000; i++) {
for (j = 0; j < 1000; j++) {
;
}
}
MPU6050WriteReg(MPU6050_RA_PWR_MGMT_1, 0X80); //复位MPU6050
usleep(20000);
MPU6050WriteReg(MPU6050_RA_PWR_MGMT_1, 0X00); //唤醒MPU6050
MPU6050WriteReg(MPU6050_RA_INT_ENABLE, 0X00); //关闭所有中断
MPU6050WriteReg(MPU6050_RA_PWR_MGMT_1, 0X80); // 复位MPU6050
usleep(RESET_DELAY_US);
MPU6050WriteReg(MPU6050_RA_PWR_MGMT_1, 0X00); // 唤醒MPU6050
MPU6050WriteReg(MPU6050_RA_INT_ENABLE, 0X00); // 关闭所有中断
MPU6050WriteReg(MPU6050_RA_USER_CTRL, 0X00); // I2C主模式关闭
MPU6050WriteReg(MPU6050_RA_FIFO_EN, 0X00); //关闭FIFO
MPU6050WriteReg(MPU6050_RA_FIFO_EN, 0X00); // 关闭FIFO
MPU6050WriteReg(MPU6050_RA_INT_PIN_CFG,
0X80); //中断的逻辑电平模式,设置为0,中断信号为高电;设置为1,中断信号为低电平时。
MotionInterrupt(); //运动中断
MPU6050WriteReg(MPU6050_RA_CONFIG, 0x04); //配置外部引脚采样和DLPF数字低通滤波器
MPU6050WriteReg(MPU6050_RA_ACCEL_CONFIG, 0x1C); //加速度传感器量程和高通滤波器配置
0X80); // 中断的逻辑电平模式,设置为0,中断信号为高电;设置为1,中断信号为低电平时。
MotionInterrupt(); // 运动中断
MPU6050WriteReg(MPU6050_RA_CONFIG, 0x04); // 配置外部引脚采样和DLPF数字低通滤波器
MPU6050WriteReg(MPU6050_RA_ACCEL_CONFIG, 0x1C); // 加速度传感器量程和高通滤波器配置
MPU6050WriteReg(MPU6050_RA_INT_PIN_CFG, 0X1C); // INT引脚低电平平时
MPU6050WriteReg(MPU6050_RA_INT_ENABLE, 0x40); //中断使能寄存器
MPU6050WriteReg(MPU6050_RA_INT_ENABLE, 0x40); // 中断使能寄存器
}
/***************************************************************
@@ -287,7 +287,7 @@ void MPU6050Init(void)
int MPU6050ReadID(void)
{
unsigned char Re = 0;
MPU6050ReadData(MPU6050_RA_WHO_AM_I, &Re, 1); //读器件地址
MPU6050ReadData(MPU6050_RA_WHO_AM_I, &Re, 1); // 读器件地址
if (Re != 0x68) {
printf("MPU6050 dectected error!\r\n");
return -1;
@@ -337,10 +337,10 @@ int E53SC2ReadData(E53SC2Data* ReadData)
return -1;
}
ReadData->Temperature = Temp;
ReadData->Accel[0] = Accel[0];
ReadData->Accel[1] = Accel[1];
ReadData->Accel[2] = Accel[2];
usleep(50000);
ReadData->Accel[ACCEL_X_AXIS] = Accel[ACCEL_X_AXIS];
ReadData->Accel[ACCEL_Y_AXIS] = Accel[ACCEL_Y_AXIS];
ReadData->Accel[ACCEL_Z_AXIS] = Accel[ACCEL_Z_AXIS];
usleep(READ_DATA_DELAY_US);
return 0;
}
/***************************************************************
@@ -354,10 +354,10 @@ int E53SC2ReadData(E53SC2Data* ReadData)
void LedD1StatusSet(E53SC2Status status)
{
if (status == ON) {
IoTGpioSetOutputVal(7, 1); //设置GPIO_7输出高电平点亮灯
IoTGpioSetOutputVal(7, 1); // 设置GPIO_7输出高电平点亮灯
}
if (status == OFF) {
IoTGpioSetOutputVal(7, 0); //设置GPIO_7输出低电平关闭灯
IoTGpioSetOutputVal(7, 0); // 设置GPIO_7输出低电平关闭灯
}
}
@@ -372,10 +372,10 @@ void LedD1StatusSet(E53SC2Status status)
void LedD2StatusSet(E53SC2Status status)
{
if (status == ON) {
IoTGpioSetOutputVal(8, 1); //设置GPIO_8输出高电平点亮灯
IoTGpioSetOutputVal(8, 1); // 设置GPIO_8输出高电平点亮灯
}
if (status == OFF) {
IoTGpioSetOutputVal(8, 0); //设置GPIO_8输出低电平关闭灯
IoTGpioSetOutputVal(8, 0); // 设置GPIO_8输出低电平关闭灯
}
}