QMI8658芯片I2C驱动开发指南

这个芯片纯国产挺好用的,电路很好设计,我这垃圾焊功,纯手焊,,居然能用。

第一部分 硬件连接


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

第二部分 软件驱动


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

2.1 I2C读写寄存器功能

c 复制代码
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();
}

2.2 qmi8658驱动部分

c 复制代码
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);  
	}
}

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

相关推荐
章鱼哥嵌入式开发2 小时前
# STM32F103 SD卡读写程序
stm32·单片机
学生哥-_-13 小时前
STM32通过KEIL pack包轻松移植LVGL,并学会使用GUI guider
stm32·lvgl·tftlcd·gui guider·gt911
贝塔实验室13 小时前
FPGA 动态重构配置流程
驱动开发·fpga开发·硬件架构·硬件工程·射频工程·fpga·基带工程
三三十二13 小时前
STM32实战:数字音频播放器开发指南
stm32·单片机·嵌入式硬件
让子弹飞0216 小时前
35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题
stm32·按键
木子单片机17 小时前
基于STM32语音识别柔光台灯
stm32·单片机·嵌入式硬件·proteus·语音识别·keil
lingzhilab21 小时前
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
stm32·嵌入式硬件·信息可视化
lixzest1 天前
Keil调试模式下,排查程序崩溃简述
stm32·单片机
可乐鸡翅好好吃2 天前
通过BUG(prvIdleTask、pxTasksWaitingTerminatio不断跳转问题)了解空闲函数(prvIdleTask)和TCB
c语言·stm32·单片机·嵌入式硬件·bug·keil
广药门徒2 天前
我认为STM32输入只分为模拟输入 与 数字输入
stm32·单片机·嵌入式硬件