stm32 i2c/IIC读写HP303S气压传感器

该款芯片的详细信息可以看其数据手册 ,这里不多做介绍。
在这里插入图片描述
读写HP303S的操作是基于IIC通讯的。本实验采用的是硬件IIC通讯,所以器件地址是0x77,值得注意的是,在stm32的硬件IIC 读写操作是需要将 器件地址左移一位的,因为最低位是读写操作位(本人就是因为粗心 在这个细节上忽略了,搞得都怀疑人生)

stm32 硬件iic配置这里不做解释,很简单。

hp303S.h头文件

#ifndef HP303S_H
#define HP303S_H

#include "main.h"


#define Write 1
#define Read 0

#define HP303S_ADDRESS 0XEE  //0X77<<1 
#define HP303S_KP 253952.0
#define HP303S_TP 1



typedef struct
{
	//压力数据

	uint8_t PRS_B[3];
//	uint8_t PRS_B1;
//	uint8_t PRS_B0;

	//温度数据

	uint8_t TMP_B[3];
//	uint8_t TMP_B1;
//	uint8_t TMP_B0;
		
}HP303S_T_and_P;


typedef struct
{
	uint8_t reg0x10;
	uint8_t reg0x11;
	uint8_t reg0x12;
	uint8_t reg0x13;
	uint8_t reg0x14;
	uint8_t reg0x15;
	uint8_t reg0x16;
	uint8_t reg0x17;
	uint8_t reg0x18;
	uint8_t reg0x19;
	uint8_t reg0x1A;
	uint8_t reg0x1B;
	uint8_t reg0x1C;
	uint8_t reg0x1D;
	uint8_t reg0x1E;
	uint8_t reg0x1F;
	uint8_t reg0x20;
	uint8_t reg0x21;
	
}REG_0X10_0X21;


typedef struct
{
	int32_t C0;
	int32_t C1;
	long C00;
	long C01;
	int32_t C10;
	int32_t C11;
	int32_t C20;
	int32_t C21;
	int32_t C30;
	
	int32_t Praw;
	double Praw_sc;
	int32_t Traw;
	double Traw_sc;
	
	double Pcomp;
	double Tcomp;
	
}COEF_DATA;


extern HP303S_T_and_P hp303sData;
extern REG_0X10_0X21 Reg0x10_0x20;


void HP303S_init(void);
HAL_StatusTypeDef HP303S_ReadData(void);
HAL_StatusTypeDef HP303s_WriteData(uint8_t address, uint8_t *data, uint16_t length);
void COEF_CALC(void);


#endif

hp303S.c文件

#include "hp303s.h"
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

#include "i2c.h"
#include "lora.h"




uint8_t PRS_CFG = 0x34;//压力分辨率配置  128/s 16times oversampling   寄存器0x06
uint8_t TMP_CFG = 0X84;//温度分辨率配置  寄存器0x07
uint8_t CFG_REG = 0X0C;//FIFO配置  寄存器0x09




HP303S_T_and_P hp303sData;
REG_0X10_0X21 Reg0x10_0x20;
COEF_DATA coefData;
	

void HP303S_init(void)
{
//从寄存器 0x10 to 0x21 中读取系数
	uint8_t hpAddress = 0x10;

	HAL_I2C_Mem_Read(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&Reg0x10_0x20,sizeof(Reg0x10_0x20),5000);
	HAL_Delay(4000);
	//压力分辨率配置 0x06
	hpAddress = 0x06;
	HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&PRS_CFG,sizeof(PRS_CFG),5000);
	HAL_Delay(200);
	//温度分辨率配置 0x07
	hpAddress = 0x07;
	HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&TMP_CFG,sizeof(TMP_CFG),5000);
	HAL_Delay(200);
	// Set P result shift Write to reg: 0x09
	
	hpAddress = 0x09;
	HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&CFG_REG,sizeof(CFG_REG),5000);
	HAL_Delay(200);
	COEF_CALC();
}



HAL_StatusTypeDef HP303S_ReadData(void)
{	
	uint8_t hpAddress = 0;
	uint8_t HP303_temp = 0;//临时参数
	//write 0x02 to 0x08reg
	hpAddress = 0x08;
	HP303_temp = 0x02;
	HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&HP303_temp,sizeof(HP303_temp),5000);
	HAL_Delay(10);
	
	//read reg 0x03 to 0x05
	hpAddress = 0x03;
	HAL_I2C_Mem_Read(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&hp303sData.TMP_B,sizeof(hp303sData.TMP_B),5000);
	HAL_Delay(10);

	//计算温度
	coefData.Traw = (hp303sData.TMP_B[0] << 16)| (hp303sData.TMP_B[1] << 8) | (hp303sData.TMP_B[0] << 0);
	if(coefData.Traw > 8388607)
	{
		coefData.Traw = coefData.Traw -16777216;
	}
	coefData.Traw_sc = ((double)coefData.Traw/HP303S_KP);
	coefData.Tcomp = coefData.C0*0.5 + coefData.C1*coefData.Traw_sc;
	
	
	
	//write 0x01  to 0x08
	hpAddress = 0x08;
	HP303_temp = 0x01;
	HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&HP303_temp,sizeof(HP303_temp),2000);	
	HAL_Delay(10);
	//read 0x00 to 0x02
	hpAddress = 0x00;
	HAL_I2C_Mem_Read(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&hp303sData.PRS_B,sizeof(hp303sData.TMP_B),2000);
	HAL_Delay(10);

	//计算压强
	coefData.Praw = (hp303sData.PRS_B[0] << 16) | (hp303sData.PRS_B[1] << 8) | (hp303sData.PRS_B[2] << 0);
	if( coefData.Praw > 8388607)
	{
		coefData.Praw = coefData.Praw - 16777216;
	}
	
	coefData.Praw_sc = ((double)coefData.Praw/HP303S_KP);
	coefData.Pcomp = coefData.C00 + (coefData.Praw_sc *(coefData.C10 + coefData.Praw_sc*(coefData.C20 + (coefData.Praw_sc *coefData.C30)))) + (coefData.Traw_sc *coefData.C01) + (coefData.Traw_sc * coefData.Praw_sc *(coefData.C11 + (coefData.Praw_sc*coefData.C21)));
	
	//清除缓存数据
	hpAddress = 0x0c;
	HP303_temp = 0x80;
	HAL_I2C_Mem_Write(&hi2c1,HP303S_ADDRESS,hpAddress,sizeof(hpAddress),(uint8_t *)&HP303_temp,sizeof(HP303_temp),2000);
	
	return HAL_OK;
}



HAL_StatusTypeDef HP303s_WriteData(uint8_t address, uint8_t *data, uint16_t length)
{
	HAL_StatusTypeDef res;
	
	res = HAL_I2C_Master_Transmit(&hi2c1,address,data,length,5000);
	
	return res;
}


void COEF_CALC(void)
{
	
		coefData.C0 = ( Reg0x10_0x20.reg0x10 << 4) | ((Reg0x10_0x20.reg0x11 & 0XF0) >> 4);
	if(coefData.C0 > (2048 - 1))
	{
		coefData.C0 = coefData.C0 - 4096;
	}
	
	coefData.C1 = ((Reg0x10_0x20.reg0x11 & 0X0F)<<8 | (Reg0x10_0x20.reg0x12));
	if(coefData.C1 > 2047)
	{
		coefData.C1 = coefData.C1-4096;
	}
	
		coefData.C00 = (Reg0x10_0x20.reg0x13<<12)|(Reg0x10_0x20.reg0x14 << 4)|((Reg0x10_0x20.reg0x15&0xF0) >> 4);
	if(coefData.C00 > 524287)
	{
		coefData.C00 = coefData.C00 - 1048576;
	}
	
		coefData.C10 = ((Reg0x10_0x20.reg0x15&0x0F) << 16) |   (Reg0x10_0x20.reg0x16 << 8) | Reg0x10_0x20.reg0x17;
	if(coefData.C10 > 524287)
	{
		coefData.C10 = coefData.C10 - 1048576;
	}
	
		coefData.C01= (Reg0x10_0x20.reg0x18 <<8) | (Reg0x10_0x20.reg0x19);
	if(coefData.C01 > 32767)
	{
		coefData.C01 = coefData.C01 - 65536;
	}
	
		coefData.C11 = (Reg0x10_0x20.reg0x1A << 8) |(Reg0x10_0x20.reg0x1B);
	if(coefData.C11 > 32767)
	{
			coefData.C11 = coefData.C11 - 65536;
	}
	
		coefData.C20 = Reg0x10_0x20.reg0x1B | (Reg0x10_0x20.reg0x1C << 8);
	if(coefData.C20 > (32768-1))
	{
		coefData.C20 = coefData.C20 - 65536;
	}
	
		coefData.C21 = (Reg0x10_0x20.reg0x1E <<8) | (Reg0x10_0x20.reg0x1F);
	if(coefData.C21 > 32767)
	{
		coefData.C21 = coefData.C21 - 65536;
	}
	
	coefData.C30 = (Reg0x10_0x20.reg0x20 <<8 ) | (Reg0x10_0x20.reg0x21);
	if(coefData.C30 > 32767)
	{
		coefData.C30  = coefData.C30  - 65536;
	}
}




main函数

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
	HP303S_init();
  /* USER CODE END 2 */

  /* We should never get here as control is now taken by the scheduler */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	HP303S_ReadData();
    HAL_Delay(100);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

试验现象
在这里插入图片描述
制作不易,如果对你有帮助记得点赞哦

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值