1. 买来MAX30102模块,某宝卖家只提供了两个小小的例程,一个是基于mBed的STM32F103C8T6的Keil例程,另外一个是arduion程序,其余啥都没有了,失望,网上好多人抱怨移植好麻烦,有营养的帖子不多,推荐一个这个老哥有点东西,强,可惜没有分享工程,有移植经验分享。
2. 在Keil例程中,文件如下,最需要注意的是MAX30102.cpp、MAX30102.h,以及algorithm.cpp、algorithm.h,其中algorithm两个文件是对读取的MAX30102数据的处理,主要有两个均值滤波器,还经过了一个汉明窗,最后返回了结果,还好我大三数字信号处理学的还不错,能看懂,具体算法有兴趣的可以查一下,能看懂就行,我也不想着自己编了,将algorithm.cpp重命名为algorithm.c。还有MAX30102两个文件,是MAX30102的驱动程序,总结起来就是初始化一个IIC,然后传输数据完成配置再使用IIC进行读取,接下来是具体的分析
3. 首先在工程中加入I2C bus device,具体什么环境按照相应方法配置,env或者RT-Thread Studio。在rtconfig.h加入
#define BSP_USING_I2C2 /* Notice: PH4 --> 116; PH5 --> 117 */ #define BSP_I2C2_SCL_PIN 116 #define BSP_I2C2_SDA_PIN 117
打开I2C,并且配置了SCL和SDA的引脚,编译工程下载,使用串口助手连接板子的串口1,在msh中输入list_device查看设备,有i2c2证明i2c2配置成功
4. 接下来就是MAX30102驱动重写
MAX30102.h直接搬来使用,重命名为max30102.h,但是其中的MAX30102的IIC从机地址需要更改,原先是给出写地址和读地址,但在RT-Thread中会自动移位,读操作会加一,这个文章有介绍,所以0xAE和0xAF右移一位就是0x57
/* #define I2C_WRITE_ADDR 0xAE// 0B 1010 1110 >>1 0B 0101 0111 #define I2C_READ_ADDR 0xAF// 0B 1010 1111 */ #define MAX30102_ADDR 0x57
MAX30102.cpp重命名为max30102.c,将里边的IIC的发送接受函数更改为RT-Thread的IIC API,结果如下
/* * Copyright (c) 2006-2020, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2020-03-30 NUAAQIANJIN the first version */ #include "max30102.h" rt_err_t maxim_max30102_write_reg(struct rt_i2c_bus_device *bus, rt_uint8_t i2c_addr, rt_uint8_t i2c_data) { struct rt_i2c_msg msgs; rt_uint8_t send_data[2]; send_data[0] = i2c_addr; send_data[1] = i2c_data;