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[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, ®, 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