驱动截图
.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, ®, 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, ®, 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, ®, 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, ®, 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