開発ボード:K210 AIRVR3バージョンwidora
開発環境:kendryteIDE公式
必要なリファレンスドキュメント:スタンドアロンSDKプログラミングガイドv0.5.0、およびWidora回路図
(1)新しいフォルダを作成します11my_code_mpu6050
ギフト+地球
ライブラリと例にはIICがないため、自分でしか記述できません。変更にはspiルーチンを使用します。
インストールの依存関係
クリーン+ビルド
これらのいくつかを保持するだけです
回路図を見る
SDA-> IO10
SCL-> IO9
先配置
(2)コードの記述を開始する
第15章のI2C
i2c.hヘッダーファイルを追加し、依存関係をインストールしてから、クリーンアップ+ビルドします
例による変更
移植コードWildfireのMPU6050F103開発ボードを参照してください。彼についてはあまり言及していません。
モジュールに付属している51のプログラムを参照してください
過去のマクロ定義をコピーする
その後、K210に移植します
移植を続ける
K210に移植
移植を続ける
次に、見てみましょう(クリーン+ビルド+ダウンロード)
ここで修正してください。エラーが報告されました
構成中、シリアルポートからの出力がありません。
シリアルポートにはまだ出力がありません。シリアルポートを変更してください
他のシリアルポートアシスタントを開いて読み取ります
しかし、データはすべて0です。確認します
GY801モジュールをGY521mpu-6050データとして取得しました
変更してもまだ機能しない
マニュアルを確認し、OKに変更しました
特に注意して、しっかりとはんだ付けしてください。接点が不安定で、すべて0が表示され、リセットを押した後にのみ正常に出力できるため、Dubanワイヤーで吊るします。
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; //合成数据
*/
}