猪百岁 发表于 2021-3-12 17:27:10

K210入门-裸机开发(十)之IIC协议_MPU6050六轴陀螺仪

## K210入门-裸机开发(十)之IIC协议_MPU6050六轴陀螺仪

**开发板:K210 AIRV R3版 widora**

**开发环境:kendryte IDE 官方的**

**必须的参考文档:Standalone SDK编程指南v0.5.0,以及widora的原理图**

## 1. 新建文件夹11my_code_mpu6050


礼物 + 地球



库和实例都没有 IIC 所以只能自己写, 我们这里用spi的例程来改



安装依赖


清理 + 构建



只保留这几个


查看原理图







SDA -> IO10

SCL -> IO9

先配置





## 2.开始写代码

I2C在第15章



加个i2c.h 头文件 然后安装依赖, 再清理 + 构建



按举例来改



移植代码 参考野火的MPU6050 F103开发板 不参考他的了 太多了

现在参考 买模块附带的51程序



复制宏定义过去





然后移植过去K210



继续移植


移植到K210



继续移植



然后一条龙看看(清理+构建+下载)

这边修正一下 报错了




串口没输出., 配置下



串口还是没输出 换个串口



打开其他串口助手能读了

但数据是全0,我去检查下

我TM的拿了GY801的模块当GY521mpu-6050资料

换了之后还是不行

查了手册 改了下 OK了







特别注意, 请务必焊好, 我这边是用杜板线挂着, 因为接触不稳,就出出现全0,只能按复位后才正常输出

MPU6050移植完毕, 下次不知道能不能在K210再见了

链接:https://pan.baidu.com/s/1Ah_SmWkZ2gs4XbbnodmcKA
提取码:f0wf

## main.c代码如下

```

#include <bsp.h>
#include <fpioa.h>
#include <gpiohs.h>
#include <stdint.h>
#include <stdio.h>
#include <sysctl.h>
#include <uart.h>

#include "i2c.h"
#define UART_NUM UART_DEVICE_3

void uart_print(const char const *str) {
uart_send_data(UART_NUM, str, strlen(str));
}

//****************************************
// 定义MPU6050内部地址
//****************************************
#define SMPLRT_DIV 0x19//陀螺仪采样率,典型值:0x07(125Hz)
#define CONFIG 0x1A      //低通滤波频率,典型值:0x06(5Hz)
#define GYRO_CONFIG \
0x1B//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define ACCEL_CONFIG \
0x1C//加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6B    //电源管理,典型值:0x00(正常启用)
#define WHO_AM_I 0x75      // IIC地址寄存器(默认数值0x68,只读)
#define SlaveAddress 0xD0// IIC写入时的地址字节数据,+1为读取

void MPU6050_INIT(void);
int GETDATA_MPU6050(uint8_t addr);

int main(void) {
plic_init();
sysctl_enable_irq();
uart_init(UART_NUM);
uart_configure(UART_NUM, 115200, 8, UART_STOP_1, UART_PARITY_NONE);

i2c_init(I2C_DEVICE_0, 0x68, 7, 200000);
MPU6050_INIT();

while (1) {
    printf("ACCEL_XOUT_H:%d\r\n", GETDATA_MPU6050(ACCEL_XOUT_H));
    printf("ACCEL_YOUT_H:%d\r\n", GETDATA_MPU6050(ACCEL_YOUT_H));
    printf("ACCEL_ZOUT_H:%d\r\n", GETDATA_MPU6050(ACCEL_ZOUT_H));
    printf("GYRO_XOUT_H:%d\r\n", GETDATA_MPU6050(GYRO_XOUT_H));
    printf("GYRO_YOUT_H:%d\r\n", GETDATA_MPU6050(GYRO_YOUT_H));
    printf("GYRO_ZOUT_H:%d\r\n", GETDATA_MPU6050(GYRO_ZOUT_H));
    sleep(1);
}
}

void MPU6050_INIT(void) {
uint8_t data_buf = {PWR_MGMT_1, 0x00};
// Single_WriteI2C(PWR_MGMT_1, 0x00);      //解除休眠状态
i2c_send_data(I2C_DEVICE_0, data_buf, 2);

data_buf = SMPLRT_DIV;
data_buf = 0x07;
// Single_WriteI2C(SMPLRT_DIV, 0x07);
i2c_send_data(I2C_DEVICE_0, data_buf, 2);

data_buf = CONFIG;
data_buf = 0x06;
// Single_WriteI2C(CONFIG, 0x06);
i2c_send_data(I2C_DEVICE_0, data_buf, 2);

data_buf = GYRO_CONFIG;
data_buf = 0x18;
// Single_WriteI2C(GYRO_CONFIG, 0x18);
i2c_send_data(I2C_DEVICE_0, data_buf, 2);

data_buf = ACCEL_CONFIG;
data_buf = 0x01;
// Single_WriteI2C(ACCEL_CONFIG, 0x01);
i2c_send_data(I2C_DEVICE_0, data_buf, 2);
}

int GETDATA_MPU6050(uint8_t addr) {
uint8_t H, L;
uint8_t reg = addr;
i2c_recv_data(I2C_DEVICE_0, ®, 1, &H, 1);
reg = addr + 1;
i2c_recv_data(I2C_DEVICE_0, ®, 1, &L, 1);

return ((H << 8) + L);//合成数据
/*
H=Single_ReadI2C(REG_Address);
      L=Single_ReadI2C(REG_Address+1);
      return (H<<8)+L;   //合成数据
*/
}
```

---
版权声明:本文为CSDN博主「jwdeng1995」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jwdeng1995/article/details/108110072
页: [1]
查看完整版本: K210入门-裸机开发(十)之IIC协议_MPU6050六轴陀螺仪