查看: 1132|回复: 0

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

[复制链接]
  • TA的每日心情
    无聊
    2024-10-11 22:04
  • 签到天数: 67 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2023-7-9 13:18:57 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 feifeiz 于 2023-7-9 13:21 编辑

    一、      前言

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

    二、      开发板驱动支持

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

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

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

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

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


    三、      程序设计
    //包含头文件
    #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);
    }
    四、      代码载入


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

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

    8.png
    给可执行文件添加权限
    9.png

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


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


    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-11-22 08:48 , Processed in 0.114549 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.