K210の概要-ベアメタル開発(10)IICプロトコル_MPU60506軸ジャイロスコープ

開発ボード: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, &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