STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
test_ms5611.c
Go to the documentation of this file.
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5#include "dev_ms5611.h"
6#include "fake_baro.h"
7
8#define CHECK(c) \
9 do { \
10 if (!(c)) { \
11 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, #c); \
12 exit(1); \
13 } \
14 } while (0)
15
16#define kProm fake_baro_datasheet_prom
17
18static void test_prom_read_and_crc(void) {
19 fake_baro_t f = {0};
20 memcpy(f.prom, kProm, sizeof(kProm));
21 dev_bus_t bus = fake_baro_bus(&f);
23 CHECK(ms5611_read_prom(&bus, &p) == DEV_OK);
24 CHECK(memcmp(p.word, kProm, sizeof(kProm)) == 0);
25 CHECK(ms5611_crc4(&p) == 3);
26 CHECK(f.transfers == 8);
27}
28
30 fake_baro_t f = {0};
31 memcpy(f.prom, kProm, sizeof(kProm));
32 f.prom[3] ^= 0x0100; /* one flipped bit */
33 dev_bus_t bus = fake_baro_bus(&f);
36 memset(f.prom, 0, sizeof(f.prom)); /* bus reads 0x00 */
38 memset(f.prom, 0xFF, sizeof(f.prom)); /* bus reads 0xFF */
40}
41
43 fake_baro_t f = {0};
44 f.d1 = 9085466;
45 f.d2 = 8569150;
46 dev_bus_t bus = fake_baro_bus(&f);
47 uint32_t raw = 0;
49 CHECK(f.last_cmd == 0x48);
50 CHECK(ms5611_read_adc(&bus, &raw) == DEV_OK && raw == 9085466);
52 CHECK(f.last_cmd == 0x58);
53 CHECK(ms5611_read_adc(&bus, &raw) == DEV_OK && raw == 8569150);
54 /* No conversion pending: the chip returns 0. */
55 CHECK(ms5611_read_adc(&bus, &raw) == DEV_ERR_DATA);
57 f.fail = 1;
59}
60
61static void compensate(uint32_t d1, uint32_t d2, int32_t* t, int32_t* p) {
62 ms5611_prom_t prom;
63 memcpy(prom.word, kProm, sizeof(kProm));
64 ms5611_compensate(&prom, d1, d2, t, p);
65}
66
68 /* p.8: D1 9085466, D2 8569150 -> TEMP 2007 (20.07 C), P 100009 (Pa) */
69 int32_t t, p;
70 compensate(9085466, 8569150, &t, &p);
71 CHECK(t == 2007);
72 CHECK(p == 100009);
73}
74
75static void test_second_order_below_20c(void) {
76 /* Vectors from an independent Python model of p.8-9 using C integer
77 * division (truncation toward zero). */
78 int32_t t, p;
79 compensate(8900000, 8330000, &t, &p); /* 11.75 C: T2/OFF2/SENS2 */
80 CHECK(t == 1175);
81 CHECK(p == 94911);
82 compensate(8500000, 7300000, &t, &p); /* -30.22 C: very-low branch */
83 CHECK(t == -3022);
84 CHECK(p == 79839);
85}
86
@ DEV_OK
Definition dev_bus.h:17
@ DEV_ERR_DATA
Definition dev_bus.h:23
@ DEV_ERR_PARAM
Definition dev_bus.h:22
@ DEV_ERR_BUS
Definition dev_bus.h:18
int ms5611_read_adc(const dev_bus_t *bus, uint32_t *raw)
Definition dev_ms5611.c:59
uint8_t ms5611_crc4(const ms5611_prom_t *prom)
Definition dev_ms5611.c:8
int ms5611_start(const dev_bus_t *bus, ms5611_conversion_t which)
Definition dev_ms5611.c:50
int ms5611_read_prom(const dev_bus_t *bus, ms5611_prom_t *prom)
Definition dev_ms5611.c:29
void ms5611_compensate(const ms5611_prom_t *prom, uint32_t d1, uint32_t d2, int32_t *temp_c100, int32_t *pressure_pa)
Definition dev_ms5611.c:72
ms5611_conversion_t
Definition dev_ms5611.h:35
@ MS5611_D1_PRESSURE
Definition dev_ms5611.h:36
@ MS5611_D2_TEMPERATURE
Definition dev_ms5611.h:37
dev_bus_t fake_baro_bus(fake_baro_t *f)
Definition fake_baro.c:41
uint32_t d1
Definition flight_e2e.c:77
int32_t p
Definition flight_e2e.c:78
uint32_t d2
Definition flight_e2e.c:77
uint32_t d2
Definition fake_baro.h:15
uint16_t prom[8]
Definition fake_baro.h:14
uint8_t last_cmd
Definition fake_baro.h:19
unsigned transfers
Definition fake_baro.h:18
uint32_t d1
Definition fake_baro.h:15
uint16_t word[8]
Definition dev_ms5611.h:32
int main()
static void test_prom_read_and_crc(void)
Definition test_ms5611.c:18
static void test_prom_crc_mismatch_and_blank_are_rejected(void)
Definition test_ms5611.c:29
static void compensate(uint32_t d1, uint32_t d2, int32_t *t, int32_t *p)
Definition test_ms5611.c:61
static void test_conversion_commands_and_adc(void)
Definition test_ms5611.c:42
#define CHECK(c)
Definition test_ms5611.c:8
static void test_datasheet_worked_example(void)
Definition test_ms5611.c:67
#define kProm
Definition test_ms5611.c:16
static void test_second_order_below_20c(void)
Definition test_ms5611.c:75