STM32 HAL MS5611驱动程序

驱动截图

ms5611驱动

.c文件

#include "MS5611.h"


/*
autor huashou
29/10/2024
 */
I2C_HandleTypeDef hi2c1;

/*
 * driver ms5611 build for I2C communication
 */

/*
 * Function for reseting the sensor
 */
void MS5611_Rest(I2C_HandleTypeDef* I2Cx)
{
	uint8_t RESET = (uint8_t)MS5611_CMD_REST;
	HAL_I2C_Master_Transmit(I2Cx, MS5611_SLAVE_ADDR, &RESET, 1, 1000);
	HAL_Delay(4);
}
/*
 * Function for reading PROM memories of the sensor
 */
uint8_t MS5611_PROM_read(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct){

	uint8_t i;
	uint8_t data[2];
	uint8_t PROM[8] = {MS5611_PROM_READ_0,
			MS5611_PROM_READ_1,
			MS5611_PROM_READ_2,
			MS5611_PROM_READ_3,
			MS5611_PROM_READ_4,
			MS5611_PROM_READ_5,
			MS5611_PROM_READ_6,
			MS5611_PROM_READ_7
	};
	I2C_HandleTypeDef* Handle = I2Cx;
	uint8_t address = datastruct->adress;

	while(HAL_I2C_Master_Transmit(Handle, address, &PROM[0], 1, 100) != HAL_OK);

	while(HAL_I2C_Master_Receive(Handle, address, data, 2, 100) != HAL_OK);

	datastruct->reserve = (uint16_t)(data[0] << 8 | data[1]);

	for (i=1;i<=6;i++){

		while(HAL_I2C_Master_Transmit(Handle, address, &PROM[i], 1, 100) != HAL_OK);

		while(HAL_I2C_Master_Receive(Handle, address, data, 2, 100) != HAL_OK);

		datastruct->C[i-1] = (uint16_t )(data[0] << 8 | data[1]);
	}

	while(HAL_I2C_Master_Transmit(Handle, address, &PROM[7], 1, 100) != HAL_OK);

	while(HAL_I2C_Master_Receive(Handle, address, data, 2, 100) != HAL_OK);

	datastruct->crc = (uint16_t)(data[0] << 8 | data[1]);

	return MS5611_OK;
}
uint8_t MS5611_init(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct)
{
	MS5611_Rest(I2Cx);
	datastruct->adress = MS5611_SLAVE_ADDR; //add slave adress to the datastruct
	MS5611_PROM_read(I2Cx,datastruct);
	return MS5611_OK;
}

/*
 * Function for reading raw temperature of the sensor
 */
uint8_t MS5611_read_temp(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct, uint8_t resolution)
{
	I2C_HandleTypeDef* Handle = I2Cx;
	uint8_t address = datastruct->adress;
	uint8_t reg = MS6511_ADC_READ;
	uint8_t data[5];
	uint8_t cmd;
	uint8_t conv_T;

	switch(resolution){
	case MS5611_CMD_CONVERT_D2_256 : cmd = MS5611_CMD_CONVERT_D2_256; conv_T = 1;
	break;
	case MS5611_CMD_CONVERT_D2_512 : cmd = MS5611_CMD_CONVERT_D2_512; conv_T = 2;
	break;
	case MS5611_CMD_CONVERT_D2_1024 : cmd = MS5611_CMD_CONVERT_D2_1024; conv_T = 3;
	break;
	case MS5611_CMD_CONVERT_D2_2048 : cmd = MS5611_CMD_CONVERT_D2_2048; conv_T = 5;
	break;
	case MS5611_CMD_CONVERT_D2_4096 : cmd = MS5611_CMD_CONVERT_D2_4096; conv_T = 9;
	break;
	default : cmd = MS5611_CMD_CONVERT_D2_4096; conv_T = 9;
	}

	while(HAL_I2C_Master_Transmit(Handle, address, &cmd, 1, 100) != HAL_OK);//asking adc to store data
	HAL_Delay(conv_T); 														//convertion time
	while(HAL_I2C_Master_Transmit(Handle, address, &reg, 1, 100) != HAL_OK);//asking for the data
	while(HAL_I2C_Master_Receive(Handle, address, data, 3, 100) != HAL_OK);//receive the data

	datastruct->D[1] = (data[0] << 16 | data[1] << 8 | data[2]);
	return MS5611_OK;
}

/*
 * Function for reading raw pressure of the sensor
 */
uint8_t MS5611_read_press (I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct, uint8_t resolution)
{
	I2C_HandleTypeDef* Handle = I2Cx;
	uint8_t address = datastruct->adress;
	uint8_t reg = MS6511_ADC_READ;
	uint8_t data[3];
	uint8_t cmd;
	uint8_t conv_T;

	switch(resolution){
	case MS5611_CMD_CONVERT_D1_256 : cmd = MS5611_CMD_CONVERT_D1_256; conv_T = 1;
	break;
	case MS5611_CMD_CONVERT_D1_512 : cmd = MS5611_CMD_CONVERT_D1_512; conv_T = 2;
	break;
	case MS5611_CMD_CONVERT_D1_1024 : cmd = MS5611_CMD_CONVERT_D1_1024; conv_T = 3;
	break;
	case MS5611_CMD_CONVERT_D1_2048 : cmd = MS5611_CMD_CONVERT_D1_2048; conv_T = 5;
	break;
	case MS5611_CMD_CONVERT_D1_4096 : cmd = MS5611_CMD_CONVERT_D1_4096; conv_T = 9;
	break;
	default : cmd = MS5611_CMD_CONVERT_D1_4096; conv_T = 9;
	}

	while(HAL_I2C_Master_Transmit(Handle, address, &cmd, 1, 100) != HAL_OK);//asking adc to store data
	HAL_Delay(conv_T); 														//convertion time
	while(HAL_I2C_Master_Transmit(Handle, address, &reg, 1, 100) != HAL_OK);//asking for the data
	while(HAL_I2C_Master_Receive(Handle, address, data, 3, 100) != HAL_OK);//receive the data

	datastruct->D[0] = (data[0] << 16 | data[1] << 8 | data[2]);
	return MS5611_OK;
}

/*
 * Function for pressure and temperature calculation
 */
uint8_t MS5611_calculate(MS5611_t* datastruct)
{
	int64_t dT = 0,TEMP = 0,T2 = 0,OFF = 0,OFF2 = 0,SENS2 = 0,SENS = 0,PRES = 0;

	dT = datastruct->D[1] - ((int32_t) (datastruct->C[4])<<8);
	TEMP = 2000 + ((int32_t) (dT*(datastruct->C[5]))>>23);
	OFF = (((int64_t)(datastruct->C[1])) << 16) + (((datastruct->C[3]) * dT) >> 7);
	SENS = (((int64_t)(datastruct->C[0])) << 15) + (((datastruct->C[2]) * dT) >> 8);

	if(TEMP < 2000) { //temperature < 20°C
		T2 = ( dT*dT )>>31;
		OFF2 = 5 * (TEMP - 2000) * (TEMP - 2000) / 2;
		SENS2 = 5 * (TEMP - 2000) * (TEMP - 2000) / 4;

		if (TEMP < -1500) { //temperature < -15°C
			OFF2 = OFF2 + (7 * (TEMP + 1500) * (TEMP + 1500));
			SENS2 = SENS2 + (11 * (TEMP + 1500) * (TEMP + 1500) / 2);
		}
	}
	else { //temperature > 20°C
		T2 = 0;
		OFF2 = 0;
		SENS2 = 0;
	}

	datastruct->dT = dT;
	datastruct->OFF = OFF - OFF2;
	datastruct->TEMP = TEMP - T2;
	datastruct->SENS = SENS - SENS2;

	PRES = ((((int32_t)(datastruct->D[0]) * (datastruct->SENS))>>21) - (datastruct->OFF))>>15;
	datastruct->P = PRES;
	return MS5611_OK;
}


uint8_t NB_MS5611_request_temp(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct, uint8_t resolution){

	I2C_HandleTypeDef* Handle = I2Cx;
	uint8_t address = datastruct->adress;
	uint8_t cmd;
	uint8_t timeout = 0;

	switch(resolution){
	case MS5611_CMD_CONVERT_D2_256 : cmd = MS5611_CMD_CONVERT_D2_256;
	break;
	case MS5611_CMD_CONVERT_D2_512 : cmd = MS5611_CMD_CONVERT_D2_512;
	break;
	case MS5611_CMD_CONVERT_D2_1024 : cmd = MS5611_CMD_CONVERT_D2_1024;
	break;
	case MS5611_CMD_CONVERT_D2_2048 : cmd = MS5611_CMD_CONVERT_D2_2048;
	break;
	case MS5611_CMD_CONVERT_D2_4096 : cmd = MS5611_CMD_CONVERT_D2_4096;
	break;
	default : cmd = MS5611_CMD_CONVERT_D2_4096;
	}

	while(HAL_I2C_Master_Transmit(Handle, address, &cmd, 1, 100) != HAL_OK){ //asking adc to store data
		HAL_Delay(1);
		timeout++;
		if(timeout >= 10){
			return MS5611_ERROR; //time out max 10ms
			break;
		}
	}
	return MS5611_OK;
}

uint8_t NB_MS5611_pull_temp(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct){

	I2C_HandleTypeDef* Handle = I2Cx;
	uint8_t address = datastruct->adress;
	uint8_t reg = MS6511_ADC_READ;
	uint8_t data[3];
	uint8_t timeout = 0;

	while(HAL_I2C_Master_Transmit(Handle, address, &reg, 1, 100) != HAL_OK){//asking for the data
		HAL_Delay(1);
		timeout++;
		if(timeout >= 10){
			return MS5611_ERROR; //time out max 10ms
			break;
		}
	}
	while(HAL_I2C_Master_Receive(Handle, address, data, 3, 100) != HAL_OK){//receive the data
		HAL_Delay(1);
		timeout++;
		if(timeout >= 10){
			return MS5611_ERROR; //time out max 10ms
			break;
		}
	}
	datastruct->D[1] = (data[0] << 16 | data[1] << 8 | data[2]);
	return MS5611_OK;
}

uint8_t NB_MS5611_request_press(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct, uint8_t resolution){

	I2C_HandleTypeDef* Handle = I2Cx;
	uint8_t address = datastruct->adress;
	uint8_t cmd;
	uint8_t timeout = 0;

	switch(resolution){
	case MS5611_CMD_CONVERT_D2_256 : cmd = MS5611_CMD_CONVERT_D1_256;
	break;
	case MS5611_CMD_CONVERT_D2_512 : cmd = MS5611_CMD_CONVERT_D1_512;
	break;
	case MS5611_CMD_CONVERT_D2_1024 : cmd = MS5611_CMD_CONVERT_D1_1024;
	break;
	case MS5611_CMD_CONVERT_D2_2048 : cmd = MS5611_CMD_CONVERT_D1_2048;
	break;
	case MS5611_CMD_CONVERT_D2_4096 : cmd = MS5611_CMD_CONVERT_D1_4096;
	break;
	default : cmd = MS5611_CMD_CONVERT_D1_4096;
	}

	while(HAL_I2C_Master_Transmit(Handle, address, &cmd, 1, 100) != HAL_OK){ //asking adc to store data
		HAL_Delay(1);
		timeout++;
		if(timeout >= 10){
			return MS5611_ERROR; //time out max 10ms
			break;
		}
	}
	return MS5611_OK;
}

uint8_t NB_MS5611_pull_press(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct){

	I2C_HandleTypeDef* Handle = I2Cx;
	uint8_t address = datastruct->adress;
	uint8_t reg = MS6511_ADC_READ;
	uint8_t data[3];
	uint8_t timeout = 0;

	while(HAL_I2C_Master_Transmit(Handle, address, &reg, 1, 100) != HAL_OK){//asking for the data
		HAL_Delay(1);
		timeout++;
		if(timeout >= 10){
			return MS5611_ERROR; //time out max 10ms
			break;
		}
	}
	while(HAL_I2C_Master_Receive(Handle, address, data, 3, 100) != HAL_OK){//receive the data
		HAL_Delay(1);
		timeout++;
		if(timeout >= 10){
			return MS5611_ERROR; //time out max 10ms
			break;
		}
	}
	datastruct->D[0] = (data[0] << 16 | data[1] << 8 | data[2]);
	return MS5611_OK;
}




.h文件

#ifndef _MS5611_H
#define _MS5611_H
#include "main.h"
#include "stdio.h"
#include "stdlib.h"

#define MS5611_OK 0x01
#define MS5611_ERROR 0x00
//MS5611 ADDR CSB
#define MS5611_SLAVE_ADDR 0XEE

//COMMAND
#define MS5611_CMD_REST 0X1E 
#define MS5611_CMD_CONVERT_D1_256 0X40
#define MS5611_CMD_CONVERT_D1_512 0X42
#define MS5611_CMD_CONVERT_D1_1024 0X44
#define MS5611_CMD_CONVERT_D1_2048 0X46
#define MS5611_CMD_CONVERT_D1_4096 0X48
#define MS5611_CMD_CONVERT_D2_256 0X50
#define MS5611_CMD_CONVERT_D2_512 0X52
#define MS5611_CMD_CONVERT_D2_1024 0X54
#define MS5611_CMD_CONVERT_D2_2048 0X56
#define MS5611_CMD_CONVERT_D2_4096 0X58

#define MS6511_ADC_READ 0X00

#define MS5611_PROM_READ_0 0XA0
#define MS5611_PROM_READ_1 0XA2
#define MS5611_PROM_READ_2 0XA4
#define MS5611_PROM_READ_3 0XA6
#define MS5611_PROM_READ_4 0XA8
#define MS5611_PROM_READ_5 0XAA
#define MS5611_PROM_READ_6 0XAC
#define MS5611_PROM_READ_7 0XAE

typedef struct
{
	uint8_t adress;
	uint16_t C[6];	//PROM
	uint16_t reserve;
	uint16_t crc;
	uint32_t D[2];	//D1 temperature data & D2 pressure data
	int32_t dT;	//Difference between actual and reference temperature
	int64_t OFF;	//Offset at actual temperature
	int64_t SENS;	//Sensitivity at actual temperature
	int32_t TEMP;	//Actual temperature
	int32_t P;	//Actual pressure
}MS5611_t;

void MS5611_Rest(I2C_HandleTypeDef* I2Cx);
uint8_t MS5611_init(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct);
uint8_t MS5611_PROM_read(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct);
uint8_t MS5611_read_temp(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct, uint8_t resolution);
uint8_t NB_MS5611_request_temp(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct, uint8_t resolution);
uint8_t NB_MS5611_pull_temp(I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct);
uint8_t MS5611_read_press (I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct, uint8_t resolution);
uint8_t NB_MS5611_request_press (I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct, uint8_t resolution);
uint8_t NB_MS5611_pull_press (I2C_HandleTypeDef* I2Cx, MS5611_t* datastruct);
uint8_t MS5611_calculate(MS5611_t* datastruct);

#endif

驱动下载链接

通过网盘分享的文件:HAL_MS5611_DRIVER.zip
链接: https://pan.baidu.com/s/1G821q_QO9BNbtAp4tmrdCQ?pwd=dmuc 提取码: dmuc

有STM32项目需求可以私信我,价格公道

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值