当前位置: 首页 > news >正文

STM32G474 STM32CubeMX SPL06-001驱动程序

STM32CubeMX配置

打开I2C,设置为Fast Mode Plus

代码编写

 SPL06-001.c

//
// Created by Lenovo on 2025/7/3.
//
#include "SPL06-001.h"
/*寄存器函数*/
#define SPL06_SENSOR_ADDR (0x77 << 1) //SPL06传感器地址
/*传感器初始化函数*/
#define RESET_Addr          0x0C
#define ID_Addr             0x0D
#define MEAS_CFG_Addr       0x08
#define PRS_CFG_Addr        0x06
#define TMP_CFG_Addr        0x07
#define CFG_REG_Addr        0x09uint8_t SPL06_Init(I2C_HandleTypeDef *hi2c){// 复位传感器uint8_t reset_cmd = 0x09;HAL_I2C_Mem_Write(hi2c, SPL06_SENSOR_ADDR, RESET_Addr, I2C_MEMADD_SIZE_8BIT, &reset_cmd, 1, 100);HAL_Delay(200);  // 等待复位完成// 读取ID(验证通信)uint8_t SPL06_ID;HAL_I2C_Mem_Read(hi2c, SPL06_SENSOR_ADDR, ID_Addr, I2C_MEMADD_SIZE_8BIT, &SPL06_ID, 1, 100);// 读取校准系数SPL06_Read_Calib_SPL06_Coeffs(hi2c);// 配置压力测量(128倍过采样,4Hz)uint8_t prs_cfg = 0x27;  // PM_RATE=4Hz, PM_PRC=128xHAL_I2C_Mem_Write(hi2c, SPL06_SENSOR_ADDR, PRS_CFG_Addr, I2C_MEMADD_SIZE_8BIT, &prs_cfg, 1, 100);// 配置温度测量(外部传感器,单次采样,4Hz)uint8_t tmp_cfg = 0xA0;  // TMP_RATE=4Hz, TMP_EXT=1HAL_I2C_Mem_Write(hi2c, SPL06_SENSOR_ADDR, TMP_CFG_Addr, I2C_MEMADD_SIZE_8BIT, &tmp_cfg, 1, 100);// 启用数据移位(P_SHIFT)uint8_t cfg_reg = 0x04;  // P_SHIFT=1HAL_I2C_Mem_Write(hi2c, SPL06_SENSOR_ADDR, CFG_REG_Addr, I2C_MEMADD_SIZE_8BIT, &cfg_reg, 1, 100);// 配置工作模式(连续测量)uint8_t meas_cfg = 0x07;  // Background ModeHAL_I2C_Mem_Write(hi2c, SPL06_SENSOR_ADDR, MEAS_CFG_Addr, I2C_MEMADD_SIZE_8BIT, &meas_cfg, 1, 100);//首次读数丢弃SPL06_Read_Pressure_Raw_Data(hi2c);SPL06_Read_Temperature_Raw_Data(hi2c);return SPL06_ID;  // 返回ID(通常应为0x10)
}
/*读取校准系数*/
typedef struct {int16_t c0, c1;int32_t c00, c10, c01, c11, c20, c21, c30;
} SPL06CalibCoeffs;
SPL06CalibCoeffs SPL06_coeffs;// 读取校准系数
void SPL06_Read_Calib_SPL06_Coeffs(I2C_HandleTypeDef *hi2c)
{uint8_t buf[18];HAL_I2C_Mem_Read(hi2c,SPL06_SENSOR_ADDR,0x10, I2C_MEMADD_SIZE_8BIT,buf, 18,1000); // 读取所有校准系数uint8_t meas_cfg;do {HAL_I2C_Mem_Read(hi2c, SPL06_SENSOR_ADDR, 0x08, I2C_MEMADD_SIZE_8BIT, &meas_cfg, 1, 100);HAL_Delay(10);} while((meas_cfg & 0xC0) != 0xC0); // 等待双RDY置位// 解析温度系数(12位有符号)SPL06_coeffs.c0 = (int16_t)((buf[0] << 4) | ((buf[1] & 0xF0) >> 4));if(SPL06_coeffs.c0 > 0x7FF) SPL06_coeffs.c0 -= 0x1000;SPL06_coeffs.c1 = (int16_t)(((buf[1] & 0x0F) << 8) | buf[2]);if(SPL06_coeffs.c1 > 0x7FF) SPL06_coeffs.c1 -= 0x1000;// 解析压力系数(16/20位有符号)SPL06_coeffs.c00 = (int32_t)((buf[3] << 12) | (buf[4] << 4) | ((buf[5] & 0xF0) >> 4));if(SPL06_coeffs.c00 > 0x7FFFF) SPL06_coeffs.c00 -= 0x100000;SPL06_coeffs.c10 = (int32_t)(((buf[5] & 0x0F) << 16) | (buf[6] << 8) | buf[7]);if(SPL06_coeffs.c10 > 0x7FFFF) SPL06_coeffs.c10 -= 0x100000;SPL06_coeffs.c01 = (int16_t)((buf[8] << 8) | buf[9]);SPL06_coeffs.c11 = (int16_t)((buf[10] << 8) | buf[11]);SPL06_coeffs.c20 = (int16_t)((buf[12] << 8) | buf[13]);SPL06_coeffs.c21 = (int16_t)((buf[14] << 8) | buf[15]);SPL06_coeffs.c30 = (int16_t)((buf[16] << 8) | buf[17]);
}// 读取压强原始数据(24位有符号)
int32_t SPL06_Read_Pressure_Raw_Data(I2C_HandleTypeDef *hi2c)
{uint8_t buf[3];int32_t pressure_raw_data;HAL_I2C_Mem_Read(hi2c,SPL06_SENSOR_ADDR,0x00,I2C_MEMADD_SIZE_8BIT, buf, 3,100);pressure_raw_data=(int32_t)((buf[0] << 16) | (buf[1] << 8) | buf[2]);return (pressure_raw_data & 0x800000) ? (pressure_raw_data - 0x1000000) : pressure_raw_data;
}// 读取温度原始数据(24位有符号)
int32_t SPL06_Read_Temperature_Raw_Data(I2C_HandleTypeDef *hi2c)
{uint8_t buf[3];int32_t temperature_raw_data;HAL_I2C_Mem_Read(hi2c,SPL06_SENSOR_ADDR,0x03,I2C_MEMADD_SIZE_8BIT, buf, 3,100);temperature_raw_data=(int32_t)((buf[0] << 16) | (buf[1] << 8) | buf[2]);return temperature_raw_data;
}// 温度补偿计算(文档5.6.2节)
float SPL06_Compensate_Temperature(int32_t raw_temp)
{float kT=524288.0f; // 2倍过采样的kT值float traw_sc = (float)raw_temp / kT;float temperature_data;temperature_data=(float)SPL06_coeffs.c0 * 0.5f + (float)SPL06_coeffs.c1 * traw_sc;return temperature_data;
}// 压力补偿计算(文档5.6.1节)
float SPL06_Compensate_Pressure(int32_t raw_press, int32_t raw_temp)
{float kT=524288.0f; // 单次采样的kT值float kP=2088960.0f; // 128倍过采样的kP值float pressure_data;float traw_sc = (float)raw_temp / kT;float praw_sc = (float)raw_press / kP;pressure_data=(float)SPL06_coeffs.c00+ praw_sc * ((float)SPL06_coeffs.c10 + praw_sc * ((float)SPL06_coeffs.c20 + praw_sc * (float)SPL06_coeffs.c30))+ traw_sc * (float)SPL06_coeffs.c01+ traw_sc * praw_sc * ((float)SPL06_coeffs.c11 + praw_sc * (float)SPL06_coeffs.c21);return pressure_data;
}

SPL06-001.h

//
// Created by Lenovo on 2025/7/3.
//#ifndef TRAIN_STAGE2_SPL06_001_H
#define TRAIN_STAGE2_SPL06_001_H#include "main.h"
#include "stm32g4xx_hal_i2c.h"uint8_t SPL06_Init(I2C_HandleTypeDef *hi2c);
void SPL06_Read_Calib_SPL06_Coeffs(I2C_HandleTypeDef *hi2c);
int32_t SPL06_Read_Pressure_Raw_Data(I2C_HandleTypeDef *hi2c);
int32_t SPL06_Read_Temperature_Raw_Data(I2C_HandleTypeDef *hi2c);
float SPL06_Compensate_Temperature(int32_t raw_temp);
float SPL06_Compensate_Pressure(int32_t raw_press, int32_t raw_temp);#endif //TRAIN_STAGE2_SPL06_001_H

main.c

引用 "SPL06-001.h"库,并初始化

int32_t raw_press= SPL06_Read_Pressure_Raw_Data(&hi2c1);
int32_t raw_temp= SPL06_Read_Temperature_Raw_Data(&hi2c1);
float temperature = SPL06_Compensate_Temperature(raw_temp);
float pressure= SPL06_Compensate_Pressure(raw_press,raw_temp);
pressure/=100.0f; //单位转换为hp

http://www.dtcms.com/a/453770.html

相关文章:

  • 域名注册好怎么建设网站工作态度和责任心感悟
  • 网站充值链接怎么做php网站空间支持
  • 做网站商城如何优化3 阐述网站建设的步骤过程 9分
  • 沈阳建网站公司wordpress posts page
  • [论文阅读] 软件工程 | 量子计算即服务(QCaaS)落地难?软件工程视角的解决方案来了
  • 上海网站建设的企哪些网站可以直接做英文字谜
  • 北京网站建设模板主题做一个小游戏要多少钱
  • jsx加密详解
  • 网站导航如何用响应式做管理咨询公司收费标准
  • 自助建站网站源码网站被百度k
  • 整体设计 逻辑系统程序 之15 Go 语言 / For 语句 / Do 句子
  • 贵阳工程建设招聘信息网站推广方式英文
  • 对称破局:双变量求值镜像之道
  • 智慧物流教师赛的意义:培养适应行业发展的新型教师
  • VBA之Word应用第四章第三节:段落集合Paragraphs对象的方法(一)
  • 微企点网站建设如何学习网站开发编程
  • 住房和城乡建设部网站买卖合同汽车拆车件网上商城
  • Sourcetree克隆/获取gitee工程,Git获取SSH密钥
  • 保定 网站制作 招聘wordpress图片清理
  • C++网络编程(四)文件描述符
  • Nginx+Keepalived高可用部署
  • 网站建设费用表格做网站 用 显示器
  • 【学习K230-例程47】GT6700-视频播放实验
  • 如何运用好DeepSeek为自己服务:智能增强的范式革命 || 2.1 认知负荷的量化分析
  • 自学做网站多久有ip地址如何做网站
  • 慈溪市网站制作iis网站没有属性
  • 网站建设法语聊城设计网站
  • 做二手钢结构网站有哪些WordPress搜索优化工具
  • Reflexion对ReAct的改进
  • 公司网站建设计入科目如何做网站规划