123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- #include "MPU6050.h"
- #include "cmsis_os2.h"
- #include "iot_errno.h"
- #include "iot_gpio.h"
- #include "iot_gpio_ex.h"
- #include "iot_i2c.h"
- #include "iot_i2c_ex.h"
- #include <math.h>
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #define WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA 6
- #define WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL 6
- #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
- static void GpioInit(void)
- {
- 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);
- 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);
- IoTGpioInit(WIFI_IOT_IO_NAME_GPIO_0);
- IoTGpioSetFunc(WIFI_IOT_IO_NAME_GPIO_0, WIFI_IOT_IO_FUNC_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);
- IoTI2cInit(WIFI_IOT_I2C_IDX_1, 400000);
- }
- static int MPU6050WriteData(uint8_t Reg, uint8_t Value)
- {
- uint32_t ret;
- uint8_t send_data[2] = {Reg, Value};
- ret = IoTI2cWrite(WIFI_IOT_I2C_IDX_1, (MPU6050_SLAVE_ADDRESS << 1) | 0x00, send_data, 2);
- if (ret != 0) {
- printf("===== Error: I2C write ret = 0x%x! =====\r\n", ret);
- return -1;
- }
- return 0;
- }
- static int MPU6050WriteBuffer(uint8_t Reg, uint8_t* pBuffer, uint16_t Length)
- {
- uint32_t ret = 0;
- uint8_t send_data[256] = {0};
- send_data[0] = Reg;
- for (int j = 0; j < Length; j++) {
- send_data[j + 1] = pBuffer[j];
- }
- ret = IoTI2cWrite(WIFI_IOT_I2C_IDX_1, (MPU6050_SLAVE_ADDRESS << 1) | 0x00, send_data, Length + 1);
- if (ret != 0) {
- printf("===== Error: I2C write ret = 0x%x! =====\r\n", ret);
- return -1;
- }
- return 0;
- }
- static int MPU6050ReadBuffer(uint8_t Reg, uint8_t* pBuffer, uint16_t Length)
- {
- uint32_t ret = 0;
- IotI2cData mpu6050_i2c_data = {0};
- uint8_t buffer[1] = {Reg};
- mpu6050_i2c_data.sendBuf = buffer;
- mpu6050_i2c_data.sendLen = 1;
- mpu6050_i2c_data.receiveBuf = pBuffer;
- mpu6050_i2c_data.receiveLen = Length;
- ret = IoTI2cWriteread(WIFI_IOT_I2C_IDX_1, (MPU6050_SLAVE_ADDRESS << 1) | 0x00, &mpu6050_i2c_data);
- if (ret != 0) {
- printf("===== Error: I2C writeread ret = 0x%x! =====\r\n", ret);
- return -1;
- }
- return 0;
- }
- static void MPU6050WriteReg(uint8_t reg_add, uint8_t reg_dat)
- {
- MPU6050WriteData(reg_add, reg_dat);
- }
- static int MPU6050Read(uint8_t reg_add, unsigned char* read, uint8_t num)
- {
- return MPU6050ReadBuffer(reg_add, read, num);
- }
- static int MPU6050ReadAcc(short* accData)
- {
- int ret;
- uint8_t buf[ACCEL_DATA_LEN];
- ret = MPU6050Read(MPU6050_ACC_OUT, buf, ACCEL_DATA_LEN);
- if (ret != 0) {
- return -1;
- }
- 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;
- }
- static int MPU6050ReadGyro(short* gyroData)
- {
- int ret;
- uint8_t buf[ACCEL_DATA_LEN];
- ret = MPU6050Read(MPU6050_GYRO_OUT, buf, ACCEL_DATA_LEN);
- if (ret != 0) {
- return -1;
- }
- 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;
- }
- static int MPU6050ReadTemp(short* tempData)
- {
- int ret;
- uint8_t buf[TEMP_DATA_LEN];
- ret = MPU6050Read(MPU6050_RA_TEMP_OUT_H, buf, TEMP_DATA_LEN);
- if (ret != 0) {
- return -1;
- }
- *tempData = (buf[TEMP_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[TEMP_MSB];
- return 0;
- }
- static int MPU6050ReturnTemp(short* Temperature)
- {
- int ret;
- short temp3;
- uint8_t buf[TEMP_DATA_LEN];
- ret = MPU6050Read(MPU6050_RA_TEMP_OUT_H, buf, TEMP_DATA_LEN);
- if (ret != 0) {
- return -1;
- }
- temp3 = (buf[TEMP_LSB] << SENSOR_DATA_WIDTH_8_BIT) | buf[TEMP_MSB];
- *Temperature = (((double)(temp3 + 13200)) / 280) - 13;
- return 0;
- }
- void FreeFallInterrupt(void)
- {
- MPU6050WriteReg(MPU6050_RA_FF_THR, 0x01);
- MPU6050WriteReg(MPU6050_RA_FF_DUR, 0x01);
- }
- void MotionInterrupt(void)
- {
- MPU6050WriteReg(MPU6050_RA_MOT_THR, 0x03);
- MPU6050WriteReg(MPU6050_RA_MOT_DUR, 0x14);
- }
- void ZeroMotionInterrupt(void)
- {
- MPU6050WriteReg(MPU6050_RA_ZRMOT_THR, 0x20);
- MPU6050WriteReg(MPU6050_RA_ZRMOT_DUR, 0x20);
- }
- void MPU6050Init(void)
- {
- MPU6050WriteReg(MPU6050_RA_PWR_MGMT_1, 0X80);
- usleep(RESET_DELAY_US);
- MPU6050WriteReg(MPU6050_RA_PWR_MGMT_1, 0X00);
- MPU6050WriteReg(MPU6050_RA_INT_ENABLE, 0X00);
- MPU6050WriteReg(MPU6050_RA_USER_CTRL, 0X00);
- MPU6050WriteReg(MPU6050_RA_FIFO_EN, 0X00);
- MPU6050WriteReg(MPU6050_RA_INT_PIN_CFG,
- 0X80);
- MotionInterrupt();
- MPU6050WriteReg(MPU6050_RA_CONFIG, 0x04);
- MPU6050WriteReg(MPU6050_RA_ACCEL_CONFIG, 0x1C);
- MPU6050WriteReg(MPU6050_RA_INT_PIN_CFG, 0X1C);
- MPU6050WriteReg(MPU6050_RA_INT_ENABLE, 0x40);
- }
- int MPU6050ReadID(void)
- {
- unsigned char Re = 0;
- MPU6050Read(MPU6050_RA_WHO_AM_I, &Re, 1);
- if (Re != 0x68) {
- printf("MPU6050 dectected error!\r\n");
- return -1;
- } else {
- return 0;
- }
- }
- int BoardInit(void)
- {
- uint32_t ret = 0;
- GpioInit();
- MPU6050Init();
- ret = MPU6050ReadID();
- if (ret != 0) {
- return -1;
- }
- osDelay(100);
- return 0;
- }
- int MPU6050ReadData(MPU6050Data* ReadData)
- {
- int ret;
- short Accel[3];
- short Temp;
- if (MPU6050ReadID() != 0) {
- return -1;
- }
- ret = MPU6050ReadAcc(Accel);
- if (ret != 0) {
- return -1;
- }
- ret = MPU6050ReturnTemp(&Temp);
- if (ret != 0) {
- return -1;
- }
- ReadData->Temperature = Temp;
- 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;
- }
- void LedD1StatusSet(SwitchStatus status)
- {
- if (status == ON) {
- IoTGpioSetOutputVal(7, 1);
- }
- if (status == OFF) {
- IoTGpioSetOutputVal(7, 0);
- }
- }
- void LedD2StatusSet(SwitchStatus status)
- {
- if (status == ON) {
- IoTGpioSetOutputVal(8, 1);
- }
- if (status == OFF) {
- IoTGpioSetOutputVal(8, 0);
- }
- }
|