source: ctrl/firmware/Main/SES/Core/Src/bme280.c

Last change on this file was 88, checked in by Zed, 3 months ago

BME280 data transfer works ok. Device returns its ID 0x60.

File size: 5.4 KB
Line 
1/*
2 * bme280.c
3 *
4 * Created: 08.01.2024 09:51:51
5 *  Author: ecs
6 */
7
8#include <string.h>
9
10#include "bme280.h"
11
12static BME280_S32_t t_fine;
13static BME280_S64_t Var1, Var2;
14
15//-----------------------------------------------------------------------------
16
17/*uint8_t BME280_ReadDeviceID(TWI_Master_t* twi)
18{
19        // Output buffer must contain only one byte, the ID itself - 0xD0
20        if (1 == twi->bytesRead) return twi->readData[0];
21        return 0;
22}
23
24//-----------------------------------------------------------------------------
25
26uint8_t BME280_ReadDeviceStatus(TWI_Master_t* twi)
27{
28        if (1 == twi->bytesRead) return twi->readData[0];
29        return 0;
30}
31
32//-----------------------------------------------------------------------------
33
34uint32_t BME280_ReadPress(TWI_Master_t* twi)
35{
36        if (8 == twi->bytesRead)
37        {
38                uint32_t press = (((uint32_t)twi->readData[0]) << 12) + (((uint32_t)twi->readData[1]) << 4) + (((uint32_t)twi->readData[2]) & 0xF);
39                return press;
40        }
41        return 0;
42}
43
44//-----------------------------------------------------------------------------
45
46uint32_t BME280_ReadTemp(TWI_Master_t* twi)
47{
48        if (8 == twi->bytesRead)
49        {
50                uint32_t temp = (((uint32_t)twi->readData[3]) << 12) + (((uint32_t)twi->readData[4]) << 4) + (((uint32_t)twi->readData[5]) & 0xF);
51                return temp;
52        }
53        return 0;
54}
55
56//-----------------------------------------------------------------------------
57
58uint16_t BME280_ReadHum(TWI_Master_t* twi)
59{
60        if (8 == twi->bytesRead)
61        {
62                uint16_t hum = (((uint16_t)twi->readData[6]) << 8) + ((uint16_t)twi->readData[7]);
63                return hum;
64        }
65        return 0;
66}
67
68//-----------------------------------------------------------------------------
69
70int BME280_Calib00_25(TWI_Master_t* twi, BME280_Calib_0_t* digs)
71{
72        if (sizeof(BME280_Calib_0_t) == twi->bytesRead)
73        {
74                memcpy(digs, (void*)twi->readData, sizeof(BME280_Calib_0_t));
75                return 0;
76        }
77        return 1;
78}
79
80//-----------------------------------------------------------------------------
81
82int BME280_Calib26_32(TWI_Master_t* twi, BME280_Calib_1_t* digs)
83{
84        if (sizeof(BME280_Calib_1_t) == twi->bytesRead)
85        {
86                digs->dig_H2 = (int16_t)((((uint16_t)twi->readData[1]) << 8) + (uint16_t)twi->readData[0]);
87                digs->dig_H3 = twi->readData[2];
88                digs->dig_H4 = (int16_t)((((uint16_t)twi->readData[3]) << 4) + (((uint16_t)twi->readData[4]) & 0xF));
89                digs->dig_H5 = (int16_t)((((uint16_t)twi->readData[6]) << 4) + (((uint16_t)twi->readData[5]) >> 4));
90                digs->dig_H6 = (int8_t)twi->readData[7];
91                return 0;
92        }
93        return 1;
94}
95
96//-----------------------------------------------------------------------------
97
98BME280_S32_t BME280_compensate_T(BME280_S32_t adc_T, BME280_Calib_0_t* digs)
99{
100        BME280_S32_t var1, var2, T;
101
102        var1 = ((((adc_T / 8U) - ((BME280_S32_t)digs->dig_T1 << 1))) * ((BME280_S32_t)digs->dig_T2)) >> 11;
103        var2 = (((((adc_T >> 4) - ((BME280_S32_t)digs->dig_T1)) * ((adc_T) - ((BME280_S32_t)digs->dig_T1))) >> 12) * ((BME280_S32_t)digs->dig_T3)) >> 14;
104        t_fine = var1 + var2;
105        T = (t_fine * 5 + 128) >> 8;
106
107        return T;
108}
109
110//-----------------------------------------------------------------------------
111
112void BME280_compensate_P_step1(BME280_Calib_0_t* digs)
113{
114        BME280_S64_t var1, var2;
115
116        var1 = ((BME280_S64_t)t_fine) - 128000;
117        var2 = var1 * var1 * (BME280_S64_t)digs->dig_P6;
118        var2 = var2 + ((var1 * (BME280_S64_t)digs->dig_P5) << 17U);
119        var2 = var2 + (((BME280_S64_t)digs->dig_P4) << 35U);
120        var1 = ((var1 * var1 * (BME280_S64_t)digs->dig_P3) >> 8U) + ((var1 * (BME280_S64_t)digs->dig_P2) << 12U);
121        var1 = (((((BME280_S64_t)1) << 47U) + var1)) * ((BME280_S64_t)digs->dig_P1) >> 33U;
122
123        Var1 = var1;
124        Var2 = var2;
125}
126
127//-----------------------------------------------------------------------------
128
129BME280_U32_t BME280_compensate_P_step2(BME280_S32_t adc_P, BME280_Calib_0_t* digs)
130{
131        if (Var1 == 0U) return 0U;
132
133        BME280_S64_t var1, var2, P;
134
135        var1 = Var1;
136        var2 = Var2;
137
138        P = (BME280_S32_t)((BME280_U32_t)1 << 20U) - adc_P;
139        P = (((P << 31U) - var2) * 3125) / var1;
140        var1 = (((BME280_S64_t)digs->dig_P9) * (P >> 13U) * (P >> 13)) >> 25U;
141        var2 = (((BME280_S64_t)digs->dig_P8) * P) >> 19U;
142        P = ((P + var1 + var2) >> 8U) + (((BME280_S64_t)digs->dig_P7) << 4U);
143
144        return (BME280_U32_t)P;
145}
146
147//-----------------------------------------------------------------------------
148
149BME280_U32_t BME280_compensate_H(BME280_S32_t adc_H, BME280_Calib_0_t* dig0s, BME280_Calib_1_t* dig1s)
150{
151        BME280_S32_t v_x1_u32r;
152
153        v_x1_u32r = (t_fine - ((BME280_S32_t)76800));
154        v_x1_u32r = (((((adc_H << 14U) - (((BME280_S32_t)dig1s->dig_H4) << 20U) - (((BME280_S32_t)dig1s->dig_H5) * v_x1_u32r)) + ((BME280_S32_t)16384)) >> 15U) * (((((((v_x1_u32r * ((BME280_S32_t)dig1s->dig_H6)) >> 10U) * (((v_x1_u32r * ((BME280_S32_t)dig1s->dig_H3)) >> 11) + ((BME280_S32_t)32768))) >> 10) + ((BME280_S32_t)2097152)) * ((BME280_S32_t)dig1s->dig_H2) + 8192) >> 14U));
155
156        //v_x1_u32r = (((((adc_H << 14U) - (dig_H4 << 20U) - (dig_H5 * v_x1_u32r)) + 16384) >> 15U) * (((((((v_x1_u32r * dig_H6) >> 10U) * (((v_x1_u32r * dig_H3) >> 11) + 32768)) >> 10) + 2097152) * dig_H2 + 8192) >> 14U));
157
158        v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15U) * (v_x1_u32r >> 15U)) >> 7U) * ((BME280_S32_t)dig0s->dig_H1)) >> 4U));
159        v_x1_u32r = (v_x1_u32r < 0 ? 0: v_x1_u32r);
160        v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400: v_x1_u32r);
161
162        return (BME280_U32_t)(v_x1_u32r >> 12U);
163}
164*/
165//-----------------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.