接上一篇:STM32CubeIDE HAL库操作IIC (一)配置篇

目录

一、IIC协议操作MPU9250寄存器函数

二、MPU9250的操作(举例)

1、设置寄存器方法

2、读取寄存器方法

三、MPU9250简单数据读取流程

1、初始化

2、读取各传感器数据函数

3、使用


一、IIC协议操作MPU9250寄存器函数

#define MPU9250Addr  0xd0/*****************************************************************************
* 功  能:写一个字节数据到 MPU9250 寄存器
* 参  数:reg: 寄存器地址
*         data: 要写入的数据
* 返回值:0成功 1失败
*****************************************************************************/
uint8_t MPU9250_WriteByte(uint8_t reg,uint8_t data)
{if(HALIIC_WriteByteToSlave(MPU9250Addr,reg,data))return 1;elsereturn 0;
}/*****************************************************************************
* 功  能:从指定MPU6050寄存器读取一个字节数据
* 参  数:reg: 寄存器地址
*         buf:  读取数据存放的地址
* 返回值:1失败 0成功
*****************************************************************************/
uint8_t MPU9250_ReadByte(uint8_t reg,uint8_t *buf)
{if(HALIIC_ReadByteFromSlave(MPU9250Addr,reg,buf))return 1;elsereturn 0;
}/*****************************************************************************
* 功  能:从指定寄存器写入指定长度数据
* 参  数:reg:寄存器地址
*         len:写入数据长度
*         buf: 写入数据存放的地址
* 返回值:0成功 1失败
*****************************************************************************/
uint8_t MPU9250_WriteMultBytes(uint8_t reg,uint8_t len,uint8_t *buf)
{if(HALIIC_WriteMultByteToSlave(MPU9250Addr,reg,len,buf))return 1;elsereturn 0;
}/*****************************************************************************
* 功  能:从指定寄存器读取指定长度数据
* 参  数:reg:寄存器地址
*         len:读取数据长度
*         buf: 读取数据存放的地址
* 返回值:0成功 0失败
*****************************************************************************/
uint8_t MPU9250_ReadMultBytes(uint8_t reg,uint8_t len,uint8_t *buf)
{if(HALIIC_ReadMultByteFromSlave(MPU9250Addr,reg,len,buf))return 1;elsereturn 0;
}

二、MPU9250的操作(举例)

1、设置寄存器方法

#define MPU9250_RA_PWR_MGMT_1       0x6BMPU9250_WriteByte(MPU6050_RA_PWR_MGMT_1, 0x80); //复位MPU9250

2、读取寄存器方法

读单个字节

#define MPU9250_RA_WHO_AM_I         0x75uint8_t buf;
MPU9250_ReadByte(MPU9250_RA_WHO_AM_I, &buf);//读取器件ID

读多个字节

/******************************************************************************
* 功  能:读取加速度的原始数据
* 参  数:*accData 原始数据的指针
* 返回值:无
*******************************************************************************/
void MPU9250_AccRead(int16_t *accData)
{uint8_t buf[6];MPU9250_ReadMultBytes(MPU6050_RA_ACCEL_XOUT_H,6,buf);accData[0] = (int16_t)((buf[0] << 8) | buf[1]);accData[1] = (int16_t)((buf[2] << 8) | buf[3]);accData[2] = (int16_t)((buf[4] << 8) | buf[5]);
}

三、MPU9250简单数据读取流程

1、初始化

#define MPU9250_RA_INT_ENABLE       0x38
#define MPU9250_RA_PWR_MGMT_1       0x6B
#define MPU9250_RA_GYRO_CONFIG      0x1B
#define MPU9250_RA_ACCEL_CONFIG     0x1C
#define MPU9250_RA_CONFIG           0x1A
#define MPU9250_RA_SMPLRT_DIV       0x19
#define MPU9250_RA_INT_PIN_CFG      0x37//设置低通滤波
#define MPU9250_DLPF_BW_256         0x00
#define MPU9250_DLPF_BW_188         0x01
#define MPU9250_DLPF_BW_98          0x02
#define MPU9250_DLPF_BW_42          0x03
#define MPU9250_DLPF_BW_20          0x04
#define MPU9250_DLPF_BW_10          0x05
#define MPU9250_DLPF_BW_5           0x06void MPU9250_Init(void)
{MPU9250_Check(); //通过读取ID,检查MPU9250是否连接MPU9250_WriteByte(MPU9250_RA_PWR_MGMT_1, 0x80); //复位MPU9250HAL_Delay(100);MPU9250_WriteByte(MPU9250_RA_PWR_MGMT_1, 0x00); //唤醒MPU9250,并选择陀螺仪x轴PLL为时钟源 (MPU9250_RA_PWR_MGMT_1, 0x01)MPU9250_WriteByte(MPU9250_RA_INT_ENABLE, 0x00); //禁止中断MPU9250_WriteByte(MPU9250_RA_GYRO_CONFIG, 0x18); //陀螺仪满量程+-2000度/秒 (最低分辨率 = 2^15/2000 = 16.4LSB/度/秒MPU9250_WriteByte(MPU9250_RA_ACCEL_CONFIG, 0x08); //加速度满量程+-4g   (最低分辨率 = 2^15/4g = 8196LSB/g )MPU9250_WriteByte(MPU9250_RA_CONFIG, MPU6050_DLPF_BW_20);//设置陀螺的输出为1kHZ,DLPF=20HzMPU9250_WriteByte(MPU9250_RA_SMPLRT_DIV, 0x00);  //采样分频 (采样频率 = 陀螺仪输出频率 / (1+DIV),采样频率1000hz)MPU9250_WriteByte(MPU9250_RA_INT_PIN_CFG, 0x02); //MPU 可直接访问MPU9250辅助I2C}

2、读取各传感器数据函数

#define MPU9250_RA_ACCEL_XOUT_H     0x3B#define MPU9250_RA_TEMP_OUT_H       0x41#define MPU9250_RA_GYRO_XOUT_H      0x43//MPU9250内部封装了一个AK8963磁力计,地址和ID如下:
#define AK8963_ADDR         0X0C    //AK8963的I2C地址
#define AK8963_ID           0X48    //AK8963的器件ID
//AK8963的内部寄存器
#define MAG_WIA             0x00    //AK8963的器件ID寄存器地址
#define MAG_XOUT_L          0X03/******************************************************************************
* 功  能:读取加速度的原始数据
* 参  数:*accData 原始数据的指针
* 返回值:无
*******************************************************************************/
void MPU9250_AccRead(int16_t *accData)
{uint8_t buf[6];MPU9250_ReadMultBytes(MPU9250_RA_ACCEL_XOUT_H,6,buf);accData[0] = (int16_t)((buf[0] << 8) | buf[1]);accData[1] = (int16_t)((buf[2] << 8) | buf[3]);accData[2] = (int16_t)((buf[4] << 8) | buf[5]);
}/******************************************************************************
* 功  能:读取陀螺仪的原始数据
* 参  数:*gyroData 原始数据的指针
* 返回值:无
*******************************************************************************/
void MPU9250_GyroRead(int16_t *gyroData)
{uint8_t buf[6];MPU9250_ReadMultBytes(MPU9250_RA_GYRO_XOUT_H, 6, buf);gyroData[0] = (int16_t)((buf[0] << 8) | buf[1]) ;gyroData[1] = (int16_t)((buf[2] << 8) | buf[3]) ;gyroData[2] = (int16_t)((buf[4] << 8) | buf[5]) ;
}/******************************************************************************
* 功  能:读取磁力计的原始数据
* 参  数:*magData原始数据的指针
* 返回值:无
*******************************************************************************/
void MPU9250_MagRead(int16_t *magData)
{uint8_t buf[6];HALIIC_WriteByteToSlave(MPU9250Addr,0x37,0x02);//turn on Bypass ModeHAL_Delay(10);HALIIC_WriteByteToSlave(AK8963_MAG_ADDRESS,0x0A,0x11);HAL_Delay(10);HALIIC_ReadMultByteFromSlave(AK8963_MAG_ADDRESS,MAG_XOUT_L, 6, buf);magData[0] = (int16_t)((buf[1] << 8) | buf[0]) ;magData[1] = (int16_t)((buf[3] << 8) | buf[2]) ;magData[2] = (int16_t)((buf[5] << 8) | buf[4]) ;
}/******************************************************************************
* 功  能:温度值读取
* 参  数:*tempdata 温度数据的指针
* 返回值:无
*******************************************************************************/
void MPU9250_TempRead(float *tempdata)
{uint8_t buf[2];short data;MPU9250_ReadMultBytes(MPU9250_RA_TEMP_OUT_H, 2, buf);data = (int16_t)((buf[0] << 8) | buf[1]) ;*tempdata = 21f + ((float)data/333.87f);
}

3、使用

int16_t acc[3],gyy[3],mag[3];MPU9250_AccRead(acc);
MPU9250_GyroRead(gyy);
MPU9250_MagRead(mag);
ANO_DT_Send_Senser(acc[0],acc[1],acc[2],gyy[0],gyy[1],gyy[2],mag[0],mag[1],mag[2],0);

注:ANO_DT_Send_Senser函数是适用于匿名电子的V6版本上位机的发送协议,可以用来看波形显示

#define BYTE0(dwTemp)       ( *( (char *)(&dwTemp)       ) )
#define BYTE1(dwTemp)       ( *( (char *)(&dwTemp) + 1) )
#define BYTE2(dwTemp)       ( *( (char *)(&dwTemp) + 2) )
#define BYTE3(dwTemp)       ( *( (char *)(&dwTemp) + 3) )uint8_t data_to_send[50]; //发送数据缓存void ANO_DT_Send_Senser(int16_t a_x,int16_t a_y,int16_t a_z,int16_t g_x,int16_t g_y,int16_t g_z,int16_t m_x,int16_t m_y,int16_t m_z,s32 bar)
{uint8_t _cnt=0,sum = 0,i;vs16 _temp;data_to_send[_cnt++]=0xAA;data_to_send[_cnt++]=0x05;data_to_send[_cnt++]=0xAF;data_to_send[_cnt++]=0x02;data_to_send[_cnt++]=0;_temp = a_x;data_to_send[_cnt++]=BYTE1(_temp);data_to_send[_cnt++]=BYTE0(_temp);_temp = a_y;data_to_send[_cnt++]=BYTE1(_temp);data_to_send[_cnt++]=BYTE0(_temp);_temp = a_z;data_to_send[_cnt++]=BYTE1(_temp);data_to_send[_cnt++]=BYTE0(_temp);_temp = g_x;data_to_send[_cnt++]=BYTE1(_temp);data_to_send[_cnt++]=BYTE0(_temp);_temp = g_y;data_to_send[_cnt++]=BYTE1(_temp);data_to_send[_cnt++]=BYTE0(_temp);_temp = g_z;data_to_send[_cnt++]=BYTE1(_temp);data_to_send[_cnt++]=BYTE0(_temp);_temp = m_x;data_to_send[_cnt++]=BYTE1(_temp);data_to_send[_cnt++]=BYTE0(_temp);_temp = m_y;data_to_send[_cnt++]=BYTE1(_temp);data_to_send[_cnt++]=BYTE0(_temp);_temp = m_z;data_to_send[_cnt++]=BYTE1(_temp);data_to_send[_cnt++]=BYTE0(_temp);data_to_send[4] = _cnt-5;for(i=0;i<_cnt;i++)sum += data_to_send[i];data_to_send[_cnt++] = sum;usart_send(data_to_send, _cnt);
}

参考文献:

[原创] STM32 的 硬件IIC 很好用

基于MPU-9250和BMP180的IMU 10DOF模块原理图/PCB/demo程序

STM32CubeIDE HAL库操作IIC (二)案例篇(MPU9250)相关推荐

  1. STM32CubeIDE HAL库IIC实现气压计MS5637的数据读取

    目录 一.配置 二.MS5637工作流程 1.复位 2.读取出厂校准参数 3.开启ADC及转换 4.读取数据(重复开启和读取,分别得到温度和气压值) 5.通过参数和数据计算得到标准单位的数据 三.代码 ...

  2. LSM6DS3TR-C姿态传感器的使用(二)---HAL库硬件IIC和官方例程

    上篇记录了,利用模拟IIC读取LSM6DS3TR数据,这篇记录利用硬件IIC和LSM6DS3TR官方例程,读取加速计.陀螺仪.温度数据,并利用加速计数据装换成角度. 官网例程写的很好,有兴趣的网友可以 ...

  3. 【STM32】标准库与HAL库对照学习教程外设篇--超声波测距传感器

    [STM32]标准库与HAL库对照学习教程外设篇--超声波测距传感器 一.前言 二.准备工作 三.超声波测距传感器 1.原理说明 2.使用说明 四.标准库使用传感器 1.实验程序 2.实验效果 五.H ...

  4. 【STM32】标准库与HAL库对照学习教程外设篇--红外避障传感器

    [STM32]标准库与HAL库对照学习教程外设篇--红外避障传感器 一.前言 二.准备工作 三.红外避障传感器 1.传感器原理说明 2.传感器特性 四.标准库使用红外传感器 1.实验程序 2.实验效果 ...

  5. 【STM32】STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲

    [STM32]STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲 一.前言 二.时钟是什么 三.时钟树 1.时钟树图 2.时钟树讲解 左边部分 中间部分 右边部分 特殊部分 四.初始化 ...

  6. STM32 (基于HAL库) 硬件IIC读写任意AT24CXX芯片

    HAL任意AT24Cxx芯片读写: 原理我就不讲了,直接实操: 一.配置 1.使用STM32CUBEMX进行引脚配置,IIC配置如下: 2.利用串口进行数据查看,串口配置如下: 3.时钟我们选择最高7 ...

  7. Unity精品专栏之序列化操作之Json案例篇(上)

    1.3 Json案例:使用Unity解析上述复合JSON 前言 通过本篇博客,我会和大家通过一个案例来学习Json的操作,希望本篇博客能为大家的工作过程中带来一些帮助与启发. 若当前文章对你有所帮助, ...

  8. hal库开启中断关中断_STM32 HAL库学习系列第9篇---NVIC按键外部中断函数

    原文首发于同名微信公号「Allen5G」,欢迎大家搜索关注! **针对HAL库的中断操作,使用按键实例进行说下,以供参考---------------------------**void HAL_GP ...

  9. hal库开启中断关中断_(2)STM32使用HAL库操作外部中断——理论讲解

    1.中断触发过程 对主程序压栈--把中断服务函数的地址写入到程序计数器(PC)--执行中断服务函数 2.中断向量表 中断服务函数的地址在STM32的手册上的中断向量表中(如下是一部分): 如上表所示, ...

最新文章

  1. 作为一个测试人员,在你提出问题之前请先想想如下问题
  2. 安装pytorch步骤
  3. RK3399Pro Android Rock-X 人工智能开发系列(1)
  4. 构建smaba服务器
  5. 计算机考研数据结构高分笔记,2021版天勤计算机考研高分笔记系列:数据结构高分笔记(第9版)...
  6. 【老生谈算法】matlab实现方位角计算源码——方位角计算
  7. JavaScript中的break
  8. 神棍节献礼之——TJU1111 MPI Maelstrom(最短路)
  9. 高通MSM8953点屏记录
  10. 手机无线如何共享给台式计算机,教你用手机做热点分享wifi给台式电脑用,不是用数据网络哦...
  11. vscode 连接ubuntu显示“试图写入的管道不存在”
  12. 如何添加装饰螺纹线规格
  13. Canvas实现3D效果-可旋转的立方体
  14. 有真正的骨传导耳机吗、骨传导耳机到底好不好用
  15. 国庆头像html代码
  16. 科学计算机算余切,科学计算机在线算(科学计算器如何算正态分布)
  17. a标签 rel=‘nofollow‘
  18. 大咖说|中国循环经济协会朱黎阳:数字经济与循环经济协同赋能绿色低碳转型
  19. Win10+Word2016保存丢失解决方案
  20. 网页设计之栅格系统及应用

热门文章

  1. folly库安装(4)folly依赖的重要组件安装:double-conversion, google-gflags, glog, fmt, googletest, boost等
  2. linux下察看cpu状态
  3. 巴士博弈hdu1846
  4. Pytorch1.1.0 入门 自定义op(python)
  5. MySQl 实现 FULL JOIN
  6. paper 43 :ENDNOTE下载及使用方法简介
  7. 【如何开发小程序】自己如何开发小程序?
  8. 区块链知识系列 - 系统学习EVM(二)-存储与安全
  9. Unknown error 1146的解决办法:
  10. Alpine Linux(初)