MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据

news2025/6/22 0:47:00

MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据

1、msa311简介

使用i2c总线
可以读取xyz轴的加速度
可以监测单击双击事件
可以监测运动与静止状态
可以监测自由落体事件,可用来监测摔倒或跌落。
可以监测旋转事件,类似手机旋转屏幕。
这一节只获取xyz轴加速度,中断以及其他事件先不设置。
msa311的初始化流程如下:
设置工作模式
使能Axis
设置dataRate
设置BandWidth
设置Range
对应代码:

void Msa311_Init(void)
{
	uint8_t partID = 0;
	msa311_powermode_t powerMode;
	msa311_axes_state_t state;
	msa311_dataRate_t dataRate;
	msa301_bandwidth_t bandWidth;
	msa311_range_t range;

    Msa311_GetPardId(&partID);

    if (partID == 0x13)
    {
        printf("Find Msa311 Device\r\n");
        printf("Now to Init Msa311\r\n");

        Msa311_SetPowerMode(MSA311_NORMALMODE);     // Power Mode == Normal Mode
        Msa311_GetPowerMode(&powerMode);
        printf("Msa311 Power Mode = 0x%02x\r\n",powerMode);

        Msa311_Set_Axes_Enable(AXES_ENABLE);        // 使能xyz轴
        Msa311_Get_Axes_Enable(&state); 
        printf("Msa311 Axes have %s\r\n",state == AXES_ENABLE ? "enable" : " disable ");

        Msa311_SetDataRate(MSA311_DATARATE_1000_HZ);
        Msa311_GetDataRate(&dataRate);
        printf("Msa311_GetDataRate == 0x%02x\r\n",dataRate);

        Msa311_SetBandWidth(MSA301_BANDWIDTH_500_HZ);
        Msa311_GetBandWidth(&bandWidth);
        printf("Msa311_GetBandWidth == 0x%02x\r\n",bandWidth);

        Msa311_SetRange(MSA311_RANGE_2_G);
        Msa311_GetRange(&range);
        printf("Msa311_GetRange == 0x%02x\r\n",range);

        printf("Msa311 Init Success!\r\n");

    }
    else
    {
        printf("ERROR: not Find Msa311 \r\n");
    }


    while (1)
    {
        Msa311_GetXYZData();
        BOARD_Delay1Ms(500);
    }  
}

2、接线

scl ---------pc6
sda ---------pc7

代码中既可以用硬件i2c,也可以用软件模拟i2c,都是配置的pc6,pc7 这两个管脚。
通过这个下面这个切换软硬件i2c的使用

#define I2C_MODE        USER_SW_I2C

3、封装msa i2c读写函数

static bool Msa311_WirteReg(uint8_t reg,uint8_t value)
{
#if I2C_MODE == USER_SW_I2C

    return SwI2c_Device_Write_Data(MSA311_I2CADDR_DEFAULT_8,&reg,1,&value,1);
#elif I2C_MODE == USE_HARD_I2C
    uint8_t tmp[2] = {0};
    tmp[0] = reg;
    tmp[1] = value;
    return BOARD_I2c1_Write(sizeof(tmp),tmp);
#endif

}

static bool Msa311_ReadReg(uint8_t reg,uint8_t *value)
{
#if I2C_MODE == USER_SW_I2C
    return SwI2c_Device_Read_Data(MSA311_I2CADDR_DEFAULT_8,&reg,1,value,1);
#elif I2C_MODE == USE_HARD_I2C
    bool bRet;
    bRet = BOARD_I2c1_Write(1,&reg);
    bRet |= BOARD_I2c1_Read(1,value);
    return bRet;
#endif
}

static bool Msa311_ReadRegs(uint8_t reg,uint8_t *value,uint16_t len)
{
#if I2C_MODE == USER_SW_I2C
    return SwI2c_Device_Read_Data(MSA311_I2CADDR_DEFAULT_8,&reg,1,value,len);
#elif I2C_MODE == USE_HARD_I2C
    bool bRet;
    bRet = BOARD_I2c1_Write(1,&reg);
    bRet |= BOARD_I2c1_Read(len,value);
    return bRet;
#endif
}

4、对应寄存器设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

xyz轴数据读取寄存器
在这里插入图片描述

对应设置寄存器代码如下:函数名与寄存器功能一一对应,方便理解。

static bool Msa311_Set_Axes_Enable(msa311_axes_state_t state)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_ODR,&r_data);
	if (bRet == false)
	{
		perror("Msa311_Set_Axes_Enable read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_AXES_ENABLE_MSAK) | state);
	bRet = Msa311_WirteReg(MSA311_REG_ODR,w_data);
	if (bRet == false)
	{
		perror("Msa311_Set_Axes_Enable write error\n");
		return false;
	}

    return bRet;
}

static bool Msa311_Get_Axes_Enable(msa311_axes_state_t *state)
{
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_ODR,&r_data);
	if (bRet == false)
	{
		perror("Msa311_Set_Axes_Enable read error\n");
		return false;
	}
    *state = (r_data & ~(MSA311_AXES_ENABLE_MSAK));
    
    return bRet;
}

static bool Msa311_SetPowerMode(msa311_powermode_t powerMode)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_POWERMODE,&r_data);
	if (bRet == false)
	{
		perror("msa311_set_power_mode read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_POWER_MODE_MSAK) | powerMode);
	bRet = Msa311_WirteReg(MSA311_REG_POWERMODE,w_data);
	if (bRet == false)
	{
		perror("msa311_set_power_mode write error\n");
		return false;
	}

    return bRet;
}


static bool Msa311_GetPowerMode(msa311_powermode_t *powerMode)
{    
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_POWERMODE,&r_data);
	if (bRet == false)
	{
		perror("msa311_set_power_mode read error\n");
		return false;
	}
    *powerMode = (r_data & ~(MSA311_POWER_MODE_MSAK));
    
    return bRet;
}

static bool Msa311_SetDataRate(msa311_dataRate_t dateRate)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_ODR,&r_data);
	if (bRet == false)
	{
		perror("Msa311_SetDataRate read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_DATA_RATE_MASK) | dateRate);
	bRet = Msa311_WirteReg(MSA311_REG_ODR,w_data);
	if (bRet == false)
	{
		perror("Msa311_SetDataRate write error\n");
		return false;
	}

    return bRet;
}

static bool Msa311_GetDataRate(msa311_dataRate_t *dataRate)
{    
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_ODR,&r_data);
	if (bRet == false)
	{
		perror("Msa311_GetDataRate read error\n");
		return false;
	}
    *dataRate = (r_data & ~(MSA311_DATA_RATE_MASK));
    
    return bRet;
}

static bool Msa311_SetBandWidth(msa301_bandwidth_t bandWidth)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_POWERMODE,&r_data);
	if (bRet == false)
	{
		perror("Msa311_GetBandWidth read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_BAND_WIDTH_MASK) | bandWidth);
	bRet = Msa311_WirteReg(MSA311_REG_POWERMODE,w_data);
	if (bRet == false)
	{
		perror("Msa311_GetBandWidth write error\n");
		return false;
	}

    return bRet;
}

static bool Msa311_GetBandWidth(msa301_bandwidth_t *bandWidth)
{    
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_POWERMODE,&r_data);
	if (bRet == false)
	{
		perror("Msa311_GetBandWidth read error\n");
		return false;
	}
    *bandWidth = (r_data & ~(MSA311_BAND_WIDTH_MASK));
    
    return bRet;
}

static bool Msa311_SetRange(msa311_range_t range)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_RESRANGE,&r_data);
	if (bRet == false)
	{
		perror("Msa311_SetRange read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_RANG_MASK) | range);
	bRet = Msa311_WirteReg(MSA311_REG_RESRANGE,w_data);
	if (bRet == false)
	{
		perror("Msa311_SetRange write error\n");
		return false;
	}

    return bRet;
}

static bool Msa311_GetRange(msa311_range_t *range)
{    
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_RESRANGE,&r_data);
	if (bRet == false)
	{
		perror("Msa311_GetRange read error\n");
		return false;
	}
    *range = (r_data & ~(MSA311_RANG_MASK));
    
    return bRet;
}

static bool Msa311_GetPardId(uint8_t *id)
{
    return Msa311_ReadReg(MSA311_REG_PARTID,id);
}

5、现象:

main函数调用Msa311_Init(),即可500ms间隔打印xyz轴数据。
在这里插入图片描述

6、代码

代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作中自我或者团队管理的几个有用工具

个人或者团队管理过程中,采用一些有效的管理工具或者方法,可以提升工作效率和结果。它们包括SMART原则、PDCA循环、SWOT分析、5W2H分析、鱼骨图分析、七个凡是。这几个工具或者方法之间有互通性,比如,PDCA循环中,在P这…

数学建模预备知识(1)全网最全的数学建模竞赛汇总,别再被坑了!

🌅*🔹** φ(゜▽゜*)♪ **🔹*🌅 欢迎来到馒头侠的博客,该类目主要讲数学建模的知识,大家一起学习,Qq及各类联系方式在图片上! 喜欢的朋友可以关注下,下次更新不迷路&…

【MySQL】为什么MySQL选择B+Tree来做索引?

B树和B树的区别? B树 B树 B*树 B树和B树的区别 (1)存储量大:B树叶子及非叶子节点存索引数据,B树叶子非叶子节点存索引,叶子节点存数据; (2)查找速度: 查单个值&…

细说websocket - php篇

下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket 套接字做了封装处理,开发者使用的时候只需要考虑数据的交互而不用处理连接的建立…

运营-22.内容分发

内容分发 内容分发本质要解决的问题包含两点: 1. 高效的连接人与信息; 2. 过滤出有价值的信息,让合适的人看到合适的信息 。 常见的内容分发方式: 1. 编辑分发; 2. 订阅分发; 3. 社交分发; 4. 算…

Oracle中使用【Interval】对【日期】进行【相加减】,报错 ORA-01839:指定月份的日期无效(Interval的坑)

文章目录 1. 前言2. 先说结论3. 案例演示 1. 前言 最近在对某些表进行旧数据的删除,必然是通过【时间】删除之前较为久远的数据,比如1年前,6个月前,7天前的数据等等情况,这个时候的SQL,必然会出现条件&…

pandas---数据结构(Series、DataFrame 和 MultiIndex)创建方式、属性

1. 数据结构 Pandas中一共有三种数据结构,分别为:Series、DataFrame 和MultiIndex。 其中Series是一维数据结构,DataFrame是二维表格型数据结构,MultiIndex是三维数据结构。 1.1 Series Series是一个类似于一维数组的数据结构…

【LeetCode】每日一题 -- 1170. 比较字符串最小字母出现频次 -- Java Version

题目链接:https://leetcode.cn/problems/compare-strings-by-frequency-of-the-smallest-character/ 1. 题解(1170. 比较字符串最小字母出现频次) 昨天的每日一题 2699. 修改图中的边权 有点难,研究了一会儿,学习了一…

文件讲解—【C语言】

目录 1.为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 4. 文件的顺序读写 4.1 顺序读写函数介绍 4.2 对比一组函数 例子 例子 5.3 rewind 例子 6. 文本文件和二进制文件 测试代…

机器学习 day15(神经网络的工作原理,激活值a的公式)

1. 隐藏层的内部实现 如图通常来说,该模型一共有两层,不包括输入层(layer 0),第一层是隐藏层(layer 1),第二层是输出层(layer 2),我们可以用方括…

【力扣刷题 | 第三天】242.有效字母异位词 349 两个数组的交集

目录 1.242. 有效的字母异位词 2.349. 两个数组的交集 - 力扣(LeetCode)​​​​​​ 使用算法笔记: 总结: 1.242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意…

学习记录 -- Accurate and fast cell marker gene identification with COSG

文章目录 brief代码演示安装实操 个人感受 brief 单细胞数据分析当中,细胞聚类分群完成之后,我们希望得知每一个细胞类群是什么细胞,也就是细胞类型注释。 通常情况下,我们可以找到细胞类群间表达量存在差异的基因,我…

爆款视频生成器-视频批量剪辑系统源码开发分享

创建视频 该接口用于创建抖音视频(支持话题, 小程序等功能)。该接口适用于抖音。 使用限制 抖音的 OAuth API 以https://open.douyin.com/ 开头。挂载小程序请先完成注册开发者平台账号。创建抖音视频后, 会有一个审核过程, 期间只有自己可见。如果发…

【C/C++】带你快速掌握 使用—增强for(范围for循环)

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Cefsharp-Winform114.2.100(5735)最新版本体验

版本说明: 官方仓库最新版本体验,114.2.100 (分支5735),支持MP3,WEBGL,不支持H264 视频体验H264参阅109版本(CSDN中搜索) Cefsharp109.1.110(winfrom)最新支持H264-MP3-MP4功能体验,导出pdf和下载方法有变调整_cef h264_久爱物联网的博客-CSDN博客 效果预览: 一…

LinuxC编程——高级文件操作

目录 一、查询文件信息1、stat2、stat fstat lstat区别 二、目录操作2.1 opendir2.2 readdir2.3 closedir例练习&#xff1a;实现ls操作 三、库3.1 库的定义3.2 库的分类3.2.1 静态库3.2.2 动态库 3.3 创建库3.3.1 静态库制作3.3.2 动态库制作 一、查询文件信息 1、stat int …

TLD7002学习笔记(二)-使用S32K144驱动TLD7002

文章目录 1. 前言2. 评估板简介3. 官方驱动3.1 官网驱动的介绍3.2 官方驱动的移植3.3 官方驱动的使用 4. 参考资料 1. 前言 本篇文章是TLD7002学习笔记的第二篇&#xff0c;主要是介绍如何使用S32K144驱动TLD7002-16ES。为此&#xff0c;笔者做了一套基于TLD7002-16ES的评估板…

重学Java的第一章

1.写在前面 今年的行情很差&#xff0c;差到很多人都没有办法找到工作&#xff0c;博主也是一个菜逼&#xff0c;找了一家小破公司&#xff0c;导致我那段时间很迷茫&#xff0c;也是也很焦虑&#xff0c;思考了很多&#xff0c;觉得我自己学的已经够多了&#xff0c;但是每一…

《Lua程序设计》--学习7

数据结构 数组 矩阵和多维数组 不规则数组&#xff1a;数组的数组&#xff0c;也就是所有元素均是另一个表的表 将两个索引合并为一个&#xff1a;声明一个长数组&#xff0c;然后根据 行数*行所拥有的元素个数列数来访问这样 链表 因为表是动态对象&#xff0c;所以在Lua语…

4.7 wait notify - 4.11 多把锁

目录 4.7 wait notify1、为什么需要wait2、原理之wait/notify3、API的介绍 4.8 wait notify 的正确姿势4.9 Park & Unpark4.10 重新理解线程状态转换4.11 多把锁 4.7 wait notify 1、为什么需要wait 当持有锁的线程因为某种条件不能满足不能执行时&#xff0c;由于其持有…