• QMI8658芯片I2C驱动开发指南


    这个芯片纯国产挺好用的,电路很好设计,我这垃圾焊功,纯手焊,,居然能用。
    在这里插入图片描述

    第一部分 硬件连接


    画的很简陋,看看就可以了,这里I2C总线需要接10K上拉没有画出来,这个需要注意一下。
    在这里插入图片描述

    第二部分 软件驱动


    I2C的具体时序实现需要自己搞定!!

    2.1 I2C读写寄存器功能

    u8 QMI8658_ReadReg(u8 dAddr, u8 Reg)
    {
        u8 Value = 0;
        //1.启动IIC
        IIC_Start();
        //2.写设备地址
        IIC_Send_Byte((dAddr << 1)|0);
        //3.wait
        if(IIC_Wait_Ack())
        {
            IIC_Stop();
            return 1;
        }
        //4.寄存器地址
        IIC_Send_Byte(Reg);
        //5.wait
        if(IIC_Wait_Ack())
        {
            IIC_Stop();
            return 1;
        }
        //6.启动IIC
        IIC_Start();
        //7.设备地址
        IIC_Send_Byte((dAddr << 1)|1);
        //8.wait read ack
        if(IIC_Wait_Ack())
        {
            IIC_Stop();
            return 1;
        }
        
        Value = IIC_Read_Byte(1);
        //9.stop
        IIC_Stop();
        return Value;
    }
    
    void QMI8658_WriteReg(u8 dAddr, u8 Reg, u8 Value)
    {
        //1.启动IIC
        IIC_Start();
        //2.写设备地址
        IIC_Send_Byte((dAddr << 1)|0);
        //3.wait
        while(IIC_Wait_Ack());
        //4.写寄存器地址
        IIC_Send_Byte(Reg);
        //5.wait
        IIC_Wait_Ack();
        //6.写value
        IIC_Send_Byte(Value);
        //7.wait
        IIC_Wait_Ack();
        //8.stop
        IIC_Stop();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    2.2 qmi8658驱动部分

    void QMI8658_Init()
    {
        u8 uChipID = 0;
        u16 AX=0,AY=0,AZ=0,GX=0,GY=0,GZ=0;
        // 1.Device Reset & check Device
        QMI8658_WriteReg(QMI8658_DEV,CTRL9,0xA2); //PowerReset
        delay_ms(2000);                           // wait stable
        uChipID = QMI8658_ReadReg(QMI8658_DEV,0x00); // Read ID
        while(uChipID != 0x5) delay_ms(2000);        // device check
        printf("QMC5883 check Pass!:deviceID = 0x%x \r\n",uChipID);
        
        //2.Device Settings
        QMI8658_WriteReg(QMI8658_DEV,CTRL1,0x40); //地址自增,小端
        QMI8658_WriteReg(QMI8658_DEV,CTRL2,0x33); //配置加速度计 量程+-16g,采样率ODR==1kHZ
        QMI8658_WriteReg(QMI8658_DEV,CTRL3,0x73); //配置陀螺仪  量程±2048 dps ,采样率是940HZ
        QMI8658_WriteReg(QMI8658_DEV,CTRL5,0x0); //不使用低通滤波器
        QMI8658_WriteReg(QMI8658_DEV,CTRL6,0x0); //不使用Motion on Demand
        QMI8658_WriteReg(QMI8658_DEV,CTRL7,0x03); // 使能加速度计和陀螺仪  
        
        delay_ms(2000);   
        
        for(;;){
            AX = (u16)QMI8658_ReadReg(QMI8658_DEV,AX_H);
            AX = AX<<8;
            AX = AX | (u16)QMI8658_ReadReg(QMI8658_DEV,AX_L);
            
            AY = (u16)QMI8658_ReadReg(QMI8658_DEV,AY_H);
            AY = AY<<8;
            AY = AY | (u16)QMI8658_ReadReg(QMI8658_DEV,AY_L);
            
            AZ = (u16)QMI8658_ReadReg(QMI8658_DEV,AZ_H);
            AZ = AZ<<8;
            AZ = AZ | (u16)QMI8658_ReadReg(QMI8658_DEV,AZ_L);
            
            GX = (u16)QMI8658_ReadReg(QMI8658_DEV,GX_H);
            GX = GX<<8;
            GX = GX | (u16)QMI8658_ReadReg(QMI8658_DEV,GX_L);
            
            GY = (u16)QMI8658_ReadReg(QMI8658_DEV,GY_H);
            GY = GY<<8;
            GY = GY | (u16)QMI8658_ReadReg(QMI8658_DEV,GY_L);
            
            GZ = (u16)QMI8658_ReadReg(QMI8658_DEV,GZ_H);
            GZ = GZ<<8;
            GZ = GZ | (u16)QMI8658_ReadReg(QMI8658_DEV,GZ_L);
            
            printf("QMC5883 GX=%d\r\n", GX);
            printf("QMC5883 GY=%d\r\n", GY);
            printf("QMC5883 GZ=%d\r\n", GZ);
            delay_ms(60000);  
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    最后!!!注意,这里跑出来的数值是没有经过二阶低通滤波的,芯片是带这个功能的。可以配置

  • 相关阅读:
    SphereEx苗立尧:云原生架构下的Database Mesh研发实践
    AI全栈大模型工程师(五)Prompt 的构成
    基于奇异谱分析法和长短时记忆网络组合模型的滑坡位移预测
    在云服务器上安装VNC远程桌面服务
    单片机通识之PWM呼吸灯、变速马达等
    什么是前端框架中的数据绑定(data binding)?有哪些类型的数据绑定?
    《Nuitka打包实战指南》实战打包Playwright
    docker的安装部署nginx和mysql
    【Java-LangChain:使用 ChatGPT API 搭建系统-5】处理输入-思维链推理
    C++11 线程库
  • 原文地址:https://blog.csdn.net/qq_33479881/article/details/136583010