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

开发板:K210 AIRV R3版 widora

开发环境:kendryte IDE 官方的

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

(一) 新建文件夹11my_code_mpu6050

礼物 + 地球

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

安装依赖

清理 + 构建

只保留这几个

查看原理图

SDA -> IO10

SCL -> IO9

先配置

(二) 开始写代码

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[2] = {PWR_MGMT_1, 0x00};
  // Single_WriteI2C(PWR_MGMT_1, 0x00);	//解除休眠状态
  i2c_send_data(I2C_DEVICE_0, data_buf, 2);

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

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

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

  data_buf[0] = ACCEL_CONFIG;
  data_buf[1] = 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, &reg, 1, &H, 1);
  reg = addr + 1;
  i2c_recv_data(I2C_DEVICE_0, &reg, 1, &L, 1);

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

猜你喜欢

转载自blog.csdn.net/jwdeng1995/article/details/108110072