回答

收藏

[评测分享] 【米尔电子MYC-YG2LX开发板测评】+2.IIC驱动MPU6050

#板卡评测 #板卡评测 1653 人阅读 | 0 人回复 | 2023-07-09

本帖最后由 feifeiz 于 2023-7-9 13:21 编辑

一、      前言

上次将开发的开发环境搭建好,SSH连接,本次开始开发板的基础外设使用,本次选择的外设是IIC,板子已经将IIC引出,可以自由的接外设,本次接的是MPU6050,实现陀螺仪的基本使用。

二、      开发板驱动支持

在使用前先看一下参加支持的驱动,然后根据驱动进行外设开发,首先使用SSH和开发板连接

进入dev路径下,查看驱动,支持IIC0,IIC1,IIC3

打开开发板原理图,查看IO引出端子,可以看到板子引出端子支持IIC2和IIC3,同时可以看到开发板的资源使用情况

排针上IO以及其他引脚分布情况

本次选择的是IIC3接口,用于MPU6050的连接,实物连接如下:


三、      程序设计
//包含头文件
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/select.h>
#include<sys/time.h>
#include<errno.h>
//宏定义
#define SMPLRT_DIV                                  0x19
#define CONFIG                                      0x1A
#define GYRO_CONFIG                                 0x1B
#define ACCEL_CONFIG                                0x1C
#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
#define WHO_AM_I                                    0x75
#define SlaveAddress                                0xD0
#define Address                                     0x68                  //MPU6050地址
#define I2C_RETRIES                                 0x0701
#define I2C_TIMEOUT                                 0x0702
#define I2C_SLAVE                                   0x0703       //IIC从器件的地址设置
#define I2C_BUS_MODE                                0x0780

typedef unsigned char uint8;
int fd = -1;

//函数声明
static uint8 MPU6050_Init(void);
static uint8 i2c_write(int fd, uint8 reg, uint8 val);
static uint8 i2c_read(int fd, uint8 reg, uint8 * val);
static uint8 printarray(uint8 Array[], uint8 Num);

//MPU6050初始化
static uint8 MPU6050_Init(void)
{
    fd  = open("/dev/i2c-3", O_RDWR);               // open file and enable readand  write

    if (fd < 0)
    {
        perror("Can'topen /dev/MPU6050 \n");       //open i2c dev file fail
        exit(1);
    }

    printf("open/dev/i2c-3 success !\n");         // open i2c dev file succes

    if (ioctl(fd, I2C_SLAVE,Address) < 0)
    { //set i2c address
        printf("fail toset i2c device slave address!\n");
        close(fd);
        return - 1;
    }

    printf("set slave address to 0x%xsuccess!\n", Address);
    i2c_write(fd, PWR_MGMT_1,0X00);
    i2c_write(fd, SMPLRT_DIV,0X07);
    i2c_write(fd, CONFIG,0X06);
    i2c_write(fd,ACCEL_CONFIG, 0X01);
    return (1);
}

//MPU6050 wirte byte
static uint8 i2c_write(int fd, uint8 reg, uint8 val)
{
    int retries;
    uint8 data[2];

    data[0] = reg;
    data[1] = val;

    for (retries = 5; retries;retries--)
    {
        if (write(fd, data, 2)== 2)
        {
            return 0;

        }

        usleep(1000 * 10);
    }

    return - 1;
}

//MPU6050 read byte
static uint8 i2c_read(int fd, uint8 reg, uint8 * val)
{
    int retries;

    for (retries = 5; retries;retries--)
    {
        if (write(fd,?, 1) == 1)
        {
            if (read(fd, val,1) == 1)
            {
                return 0;
            }

        }

    }

    return - 1;
}

//get data
short GetData(unsigned char REG_Address)
{
    char H, L;

    i2c_read(fd, REG_Address,&H);
    usleep(1000);
    i2c_read(fd, REG_Address +1, &L);
    return (H << 8) +L;
}

// main
int main(int argc, char * argv[])
{
    MPU6050_Init();
    usleep(1000 * 100);

    while (1)
    {
       //printf("\033[2J");
        usleep(1000 * 200);
       printf("ACCE_X:%6d\n ", GetData(ACCEL_XOUT_H));
        usleep(1000 * 200);
       printf("ACCE_Y:%6d\n ", GetData(ACCEL_YOUT_H));
        usleep(1000 * 200);
       printf("ACCE_Z:%6d\n ", GetData(ACCEL_ZOUT_H));
        usleep(1000 * 200);
       printf("GYRO_X:%6d\n ", GetData(GYRO_XOUT_H));
        usleep(1000 * 200);
       printf("GYRO_Y:%6d\n ", GetData(GYRO_YOUT_H));
        usleep(1000 * 200);
        printf("GYRO_Z:%6d\n\n ",GetData(GYRO_ZOUT_H));
        sleep(1);
    }

    close(fd);
}
四、      代码载入


完成程序设计后编译为可执行文件

将编译生成的文件移至桌面,连接开发板,将文件拖入root文件夹内,或者其他地方也可以

给可执行文件添加权限

打开执行文件,查看读取数据内容,如下所示,驱动打开成功,陀螺仪数据正常读取。


五、总结
本次测评就到这里,本次进行了IIC的使用,使用的是IIC设备,应用层对IIC设备进行操作实现陀螺仪的数据读取,然后编译生成可执行文件,将可执行拖到桌面上,通过SSH载入开发板,添加权限,运行程序。本次在看硬件手册的时候,可以看到做得很细,可以直观的看到板子资源情况。


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条