RM3100 stm32驱动(硬件i2c)

目录

  • RM3100接线
  • HAL库I2C函数
    • HAL_I2C_Mem_Read
    • HAL_I2C_Mem_Write
    • HAL_I2C_Master_Transmit / HAL_I2C_Master_Receive
    • 例子 HSHAKE寄存器
  • cubemx配置
  • RM3100寄存器
  • 驱动
  • 最终效果

RM3100接线

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

在这里插入图片描述
SA0 SA1接地,此时i2c设备地址为0100000,即0x20
如果SA0接高,SA1接地,地址为0100001,即0x21
如果SA0接地,SA1接高,地址为0100010,即0x22
SDA SCL正常接单片机,要上拉
I2C/SPI接高,选择I2C模式

手册下载链接

HAL库I2C函数

stm32 hal库对于i2c的操作有几个函数:

HAL_I2C_Mem_Read

hi2c:i2cx,比如 &hi2c1
DevAddress:左移一位的传感器设备地址,比如RM3100原来是0x20,要输入(0x20<<1)即0x40
MemAddress:要读取的寄存器地址,这个不用左移,按照手册里面即可,比如HSHAKE寄存器就是0x35
MemAddSize:一般I2C_MEMADD_SIZE_8BIT
后面几个正常写即可,pData传指针把读出来数据传递出来,比如HSHAKE寄存器(0x35)读出来就是0x1B

/*** @brief  Read an amount of data in blocking mode from a specific memory address* @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains*                the configuration information for the specified I2C.* @param  DevAddress Target device address: The device 7 bits address value*         in datasheet must be shifted to the left before calling the interface* @param  MemAddress Internal memory address* @param  MemAddSize Size of internal memory address* @param  pData Pointer to data buffer* @param  Size Amount of data to be sent* @param  Timeout Timeout duration* @retval HAL status*/
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

HAL_I2C_Mem_Write

和上面类似,不同的是pData 变成了往里面写的数据

/*** @brief  Write an amount of data in blocking mode to a specific memory address* @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains*                the configuration information for the specified I2C.* @param  DevAddress Target device address: The device 7 bits address value*         in datasheet must be shifted to the left before calling the interface* @param  MemAddress Internal memory address* @param  MemAddSize Size of internal memory address* @param  pData Pointer to data buffer* @param  Size Amount of data to be sent* @param  Timeout Timeout duration* @retval HAL status*/
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

HAL_I2C_Master_Transmit / HAL_I2C_Master_Receive

这俩成对用,可以看到他俩都么有MemAddress
先调用HAL_I2C_Master_Transmit,pData写成MemAddress地址,再调用HAL_I2C_Master_Receive收数据

/*** @brief  Transmits in master mode an amount of data in blocking mode.* @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains*                the configuration information for the specified I2C.* @param  DevAddress Target device address: The device 7 bits address value*         in datasheet must be shifted to the left before calling the interface* @param  pData Pointer to data buffer* @param  Size Amount of data to be sent* @param  Timeout Timeout duration* @retval HAL status*/
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
/*** @brief  Receives in master mode an amount of data in blocking mode.* @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains*                the configuration information for the specified I2C.* @param  DevAddress Target device address: The device 7 bits address value*         in datasheet must be shifted to the left before calling the interface* @param  pData Pointer to data buffer* @param  Size Amount of data to be sent* @param  Timeout Timeout duration* @retval HAL status*/
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

例子 HSHAKE寄存器

两种写法,data即为读出来数据,应该是0x1B

uint8_t data=0;
HAL_StatusTypeDef status = HAL_I2C_Mem_Read(&RM3100_I2C,RM3100_ADDRESS,ADDR_HSHAKE,I2C_MEMADD_SIZE_8BIT,&data, 1, 1000);
uint8_t data=0;
uint8_t addr_hshake=ADDR_HSHAKE;//0x35
HAL_StatusTypeDef status = HAL_I2C_Master_Transmit(&RM3100_I2C,RM3100_ADDRESS,&addr_hshake,1,1000); //addr_hshake要写成目标寄存器地址
status = HAL_I2C_Master_Receive(&RM3100_I2C,(RM3100_ADDRESS|1),&data,1,1000);

cubemx配置

正常使用I2C即可,选择fast mode,最高400k可以工作
在这里插入图片描述
需要上拉,最好硬件上也拉一下
在这里插入图片描述

RM3100寄存器

在这里插入图片描述
上面提示了对于I2C,读写地址不一样,因为有一位0/1标志着读/写,但是不用管,hal库帮我们搞好了,直接对着第二列填MemAddress即可
在这里插入图片描述

驱动

采用poll写法,参考手册5.3 5.8 5.8.2
.h文件

#ifndef __RM3100_H
#define __RM3100_H
#include "main.h"
#include "i2c.h"#define RM3100_I2C hi2c1
#define RM3100_ADDRESS 0x20<<1 //AD0 AD1都接地#define RM3100_CONVERSION_INTERVAL	10000	// Microseconds, corresponds to 100 Hz (cycle count 200 on 3 axis)
#define UTESLA_TO_GAUSS			100.0f
#define RM3100_SENSITIVITY		75.0f#define ADDR_POLL		0x00
#define ADDR_CMM		0x01
#define ADDR_CCX		0x04
#define ADDR_CCY		0x06
#define ADDR_CCZ		0x08
#define ADDR_TMRC		0x0B
#define ADDR_MX			0x24
#define ADDR_MY			0x27
#define ADDR_MZ			0x2A
#define ADDR_BIST		0x33
#define ADDR_STATUS		0x34
//#define ADDR_STATUS_READ		0xB4 //0X34|0X80
#define ADDR_HSHAKE		0x35
#define ADDR_REVID		0x36#define CCX_DEFAULT_MSB		0x00
#define CCX_DEFAULT_LSB		0xC8
#define CCY_DEFAULT_MSB		CCX_DEFAULT_MSB
#define CCY_DEFAULT_LSB		CCX_DEFAULT_LSB
#define CCZ_DEFAULT_MSB		CCX_DEFAULT_MSB
#define CCZ_DEFAULT_LSB		CCX_DEFAULT_LSB
#define CMM_DEFAULT		0x70	// No continuous mode
#define CONTINUOUS_MODE		(1 << 0)
#define POLLING_MODE		(0 << 0)
#define TMRC_DEFAULT		0x94
#define BIST_SELFTEST		0x8F
#define BIST_DEFAULT		0x00
#define BIST_XYZ_OK		((1 << 4) | (1 << 5) | (1 << 6))
#define STATUS_DRDY		(1 << 7)
#define POLL_XYZ		0x70
#define RM3100_REVID		0x22#define NUM_BUS_OPTIONS		(sizeof(bus_options)/sizeof(bus_options[0]))uint8_t RM3100ReadID(void);
uint8_t RM3100_Init(void);
uint8_t RM3100_GetData(short *x,short *y,short*z);
uint8_t RM3100_CheckDataReady(void);
#endif

.c文件

#include "RM3100.h"uint8_t RM3100ReadID(void){uint8_t data=0;uint8_t addr_hshake=ADDR_HSHAKE;
//	HAL_StatusTypeDef status = HAL_I2C_Mem_Read(&RM3100_I2C,RM3100_ADDRESS,ADDR_HSHAKE,I2C_MEMADD_SIZE_8BIT,&data, 1, 1000);HAL_StatusTypeDef status = HAL_I2C_Master_Transmit(&RM3100_I2C,RM3100_ADDRESS,&addr_hshake,1,1000); //addr_hshake要写成目标寄存器地址status = HAL_I2C_Master_Receive(&RM3100_I2C,(RM3100_ADDRESS|1),&data,1,1000);//两种写法都可以,读取0x35寄存器值,并与1b进行比较if(status!=HAL_OK){printf("RM3100 I2C Error!\r\n");return 1;}else{if(data!=0x1B){printf("RM3100 detected Error! %x\r\n",data);return 1;}else{printf("RM3100 Address = %x\r\n",data);return 0;}}
}uint8_t RM3100_Init(void){uint8_t CCR[6] = {0, 200, 0, 200, 0, 200};if(RM3100ReadID()) {return 1;}else{HAL_StatusTypeDef status = HAL_I2C_Mem_Write(&RM3100_I2C,RM3100_ADDRESS,ADDR_CCX,I2C_MEMADD_SIZE_8BIT,CCR, 6, 1000);//发送一次poll请求,开始测量uint8_t data=POLL_XYZ;HAL_StatusTypeDef status1 = HAL_I2C_Mem_Write(&RM3100_I2C,RM3100_ADDRESS,ADDR_POLL,I2C_MEMADD_SIZE_8BIT,&data, 1, 1000);if(status!=HAL_OK | status1!=HAL_OK){printf("Error!,status=%d,status1=%d\r\n",status,status1);return 1;}else{return 0;}		}
}uint8_t RM3100_CheckDataReady(void)
{uint8_t cResult;HAL_I2C_Mem_Read(&RM3100_I2C,RM3100_ADDRESS,ADDR_STATUS,I2C_MEMADD_SIZE_8BIT,&cResult,1,1000);cResult = cResult&0x80;
//	printf("%x\r\n",cResult);return cResult; 
}uint8_t RM3100_GetData(short *x,short *y,short*z){static long Mag_Data[3] = {0};uint8_t temp[9]={0};uint8_t poll_request=POLL_XYZ;if(RM3100_CheckDataReady()==0x80){//data ready//读取9个字节HAL_StatusTypeDef status = HAL_I2C_Mem_Read(&RM3100_I2C,RM3100_ADDRESS,ADDR_MX,I2C_MEMADD_SIZE_8BIT,temp, 9, 1000);Mag_Data[0]= (long)temp[0]<<16 | (long)temp[1]<<8 | temp[2];if(Mag_Data[0] >= 0x00800000) {Mag_Data[0] |= 0xff000000;}Mag_Data[1] = (long)temp[3]<<16 | (long)temp[4]<<8 | temp[5];if(Mag_Data[1] >= 0x00800000) {Mag_Data[1] |= 0xff000000;}Mag_Data[2] = (long)temp[6]<<16 | (long)temp[7]<<8 | temp[8];if(Mag_Data[2] >= 0x00800000) {Mag_Data[2] |= 0xff000000;}*y = -Mag_Data[0];*x = -Mag_Data[1];*z = -Mag_Data[2];//发送一次poll请求,开始测量HAL_StatusTypeDef status1 = HAL_I2C_Mem_Write(&RM3100_I2C,RM3100_ADDRESS,ADDR_POLL,I2C_MEMADD_SIZE_8BIT,&poll_request, 1, 1000);if(status!=HAL_OK | status1!=HAL_OK){printf("Error!,status=%d,status1=%d\r\n",status,status1);return 1;}else{return 0;}}else{printf("Data Not Ready!\r\n");return 1;}
}

主函数:

int main(void)
{//初始化……RM3100_Init();short hx,hy,hz=0;while (1){RM3100_GetData(&hx, &hy, &hz);printf("RM3100 hx: %d, hy: %d, hz: %d\r\n", hx, hy, hz);HAL_Delay(8);}
}

其他功能没写,后面慢慢补上

最终效果

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

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

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

相关文章

Android studio 花式按键

一、activity_main.xml代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.a…

Bug:Too many open files【ulimit限制】

Bug&#xff1a;Too many open files 今天在开发某个下载功能时&#xff0c;发现文件总是下载到250多个程序就挂掉&#xff0c;同时会打崩服务器&#xff0c;查看错误日志发现报&#xff1a;too many open files. 思路&#xff1a;根据错误信息可以知道打开的文件数过多&#x…

001、安装 Rust

目录 1. 安装 Rust 2. 安装编译器 Visual Studio Code 3. 更新、卸载、文档命令 4. 结语 1. 安装 Rust 安装 Rust 非常简单&#xff0c;首先进入 Rust官网 &#xff0c;然后点击右上角的 Install 。 进入 Install 界面&#xff0c; 它会自动识别你当前的操作系统并给你推荐…

HBase基础知识(七):HBase 性能优化示例全解

1. 高可用 在 HBase 中 HMaster 负责监控 HRegionServer 的生命周期&#xff0c;均衡 RegionServer 的负载&#xff0c; 如果 HMaster 挂掉了&#xff0c;那么整个 HBase 集群将陷入不健康的状态&#xff0c;并且此时的工作状态并不会维持太久。所以 HBase 支持对 HMaster 的高…

用C求斐波那契数列-----(C每日一编程)

斐波那契数列: 斐波那契数列是指这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89……这个数列从第3项开始 &#xff0c;每一项都等于前两项之和。 递推…

数据库的连接池详解

什么是数据库连接池&#xff1f; 数据库连接池是一种管理和维护数据库连接的机制&#xff0c;用于提高数据库访问的性能和效率。连接池通过在应用程序启动时创建一组数据库连接&#xff0c;并在需要时将这些连接分配给应用程序&#xff0c;然后在不再需要时将其返回到池中。这…

Kubernetes (四) 资源清单及yaml文件详解

一. 资源清单 二. 编写yaml文件及内容详解 常用命令 …

前端---css 属性

css 作用是美化 HTML 网页和控制页面布局的,下面这些是经常使用的一些样式属性。 1. 布局常用样式属性 width 设置元素(标签)的宽度&#xff0c;如&#xff1a;width:100px;height 设置元素(标签)的高度&#xff0c;如&#xff1a;height:200px;background 设置元素背景色或者…

OSPF多区域配置-新版(12)

目录 整体拓扑 操作步骤 1.基本配置 1.1 配置R1的IP 1.2 配置R2的IP 1.3 配置R3的IP 1.4 配置R4的IP 1.5 配置R5的IP 1.6 配置R6的IP 1.7 配置PC-1的IP地址 1.8 配置PC-2的IP地址 1.9 配置PC-3的IP地址 1.10 配置PC-4的IP地址 1.11 检测R5与PC1连通性 1.12 检测…

Vue3-v-model原理

对比&#xff1a;Vue-2.3v-model原理-CSDN博客 v-model为:modelValue和update:modelValue的简写 表单类组件封装 父组件 <ChannelSelect v-model"cateId"></ChannelSelect> 子组件 <script setup> defineProps({modelValue: {type: [Number,…

人工智能_机器学习076_Kmeans聚类算法_体验_亚洲国家队自动划分类别---人工智能工作笔记0116

我们开始来看聚类算法 可以看到,聚类算法,其实就是发现事物之间的,潜在的关联,把 有关联的数据分为一类 我们先启动jupyter notebook,然后 我们看到这里我们需要两个测试文件 AsiaFootball.txt里面记录了,3年的,亚洲足球队的成绩

java获取两个List集合之间的交集、差集、并集

文章目录 方式一、jdk8 Stream求交集、并集、差集方式二、求交集方式三、collections4.CollectionUtils求交集、差集、并集 本文总结一下java中获取两个List之间的交集、补集、并集的几种方式。 最常用的通过for循环遍历两个集合的方式在这里就不整理了&#xff0c;主要整理一些…

结合el-upload修改支持上传图片、视频并预览

结合element plus的el-upload标签&#xff0c;实现上传图片和视频&#xff0c;并支持在线预览和放大 1、html部分 <el-form-item label"活动照片、视频"><el-uploadv-model:file-list"state.photoList":action"state.uploadUrl"accept…

数据分析——数据预处理和数据管道构建

目标&#xff1a;对于拿到的一个任意数据集&#xff0c;编写类似数据加载程序&#xff0c;以适应深度学习的研究。 框架&#xff1a; 针对不同的时间序列数据集&#xff0c;可以总结如下关键步骤&#xff0c;以编写类似上述代码的深度学习数据处理流程&#xff1a; 1. **了解…

MacOS编译安装PHP5.6

PHP&#xff1a;安装PHP5.6 安装依赖可以省略&#xff0c;缺少哪个装哪个即可&#xff0c;类似linux yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-deve…

开源低代码开发平台如何在数字化转型中发挥价值?

当前&#xff0c;数字化转型升级是发展潮流&#xff0c;也是很多企业提升市场竞争力&#xff0c;获得更多利润价值的发展路径。作为提质增效的办公利器&#xff0c;开源低代码开发平台也将发挥应有的价值和作用&#xff0c;在推动企业数字化转型和流程化办公的过程中贡献力量&a…

Linux - 记录问题:Ubuntu查看文件夹大小

在Ubuntu中&#xff0c;你可以使用du命令来查看文件夹的大小。du命令的全称是"disk usage"&#xff0c;用于估计和显示目录或文件的磁盘使用空间。 如果你想查看某个特定文件夹的大小&#xff0c;你可以使用以下命令&#xff1a; du -sh /path/to/directory在这个命…

layui表格中预览视频和图片

全代码 <!DOCTYPE html> <html><head><title>Layui&#xff1a;数据表格table中预览图片、视频</title><meta charset"utf-8"/><link rel"stylesheet" href"../dist/css/layui.css"><style>&l…

竞赛保研 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测

多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现SSA-BiLSTM麻雀算法优化…