LibDriver MS5611
Loading...
Searching...
No Matches
driver_ms5611.c
Go to the documentation of this file.
1
36
37#include "driver_ms5611.h"
38
42#define CHIP_NAME "TE MS5611"
43#define MANUFACTURER_NAME "TE"
44#define SUPPLY_VOLTAGE_MIN 1.8f
45#define SUPPLY_VOLTAGE_MAX 3.6f
46#define MAX_CURRENT 1.4f
47#define TEMPERATURE_MIN -40.0f
48#define TEMPERATURE_MAX 85.0f
49#define DRIVER_VERSION 1000
50
54#define MS5611_PRESSURE_SENSITIVITY_INDEX 1
55#define MS5611_PRESSURE_OFFSET_INDEX 2
56#define MS5611_TEMP_COEFF_OF_PRESSURE_SENSITIVITY_INDEX 3
57#define MS5611_TEMP_COEFF_OF_PRESSURE_OFFSET_INDEX 4
58#define MS5611_REFERENCE_TEMPERATURE_INDEX 5
59#define MS5611_TEMP_COEFF_OF_TEMPERATURE_INDEX 6
60
64#define MS5611_COMMAND_RESET 0x1E
65#define MS5611_COMMAND_PRESSURE 0x40
66#define MS5611_COMMAND_TEMPERATURE 0x50
67#define MS5611_COMMAND_ADC_READ 0x00
68#define MS5611_COMMAND_PROM_READ_ADDRESS_0 0xA0
69
81static uint8_t a_ms5611_iic_spi_read(ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
82{
83 if (handle->iic_spi == MS5611_INTERFACE_IIC) /* iic interface */
84 {
85 if (handle->iic_read(handle->iic_addr, reg, buf, len) != 0) /* read data */
86 {
87 return 1; /* return error */
88 }
89
90 return 0; /* success return 0 */
91 }
92 else /* spi interface */
93 {
94 if (handle->spi_read(reg, buf, len) != 0) /* read data */
95 {
96 return 1; /* return error */
97 }
98
99 return 0; /* success return 0 */
100 }
101}
102
114static uint8_t a_ms5611_iic_spi_write(ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
115{
116 if (handle->iic_spi == MS5611_INTERFACE_IIC) /* iic interface */
117 {
118 if (handle->iic_write(handle->iic_addr, reg, buf, len) != 0) /* write data */
119 {
120 return 1; /* return error */
121 }
122
123 return 0; /* success return 0 */
124 }
125 else /* spi interface */
126 {
127 if (handle->spi_write(reg, buf, len) != 0) /* write data */
128 {
129 return 1; /* return error */
130 }
131
132 return 0; /* success return 0 */
133 }
134}
135
145static uint8_t a_ms5611_crc_check(uint16_t *n_prom, uint8_t crc)
146{
147 uint8_t cnt;
148 uint8_t n_bit;
149 uint16_t n_rem;
150 uint16_t crc_read;
151
152 n_rem = 0x00; /* init 0 */
153 crc_read = n_prom[7]; /* get crc */
154 n_prom[7] = (0xFF00U & (n_prom[7])); /* init prom */
155 for (cnt = 0; cnt < 16; cnt++) /* loop all */
156 {
157 if ((cnt % 2) == 1) /* check bit */
158 {
159 n_rem ^= (uint16_t)((n_prom[cnt >> 1]) & 0x00FF); /* run part1 */
160 }
161 else
162 {
163 n_rem ^= (uint16_t)(n_prom[cnt >> 1] >> 8); /* run part1 */
164 }
165 for (n_bit = 8; n_bit > 0; n_bit--) /* loop all */
166 {
167 if ((n_rem & 0x8000U) != 0) /* check bit */
168 {
169 n_rem = (n_rem << 1) ^ 0x3000; /* run part2 */
170 }
171 else
172 {
173 n_rem = (n_rem << 1); /* run part2 */
174 }
175 }
176 }
177 n_rem = (0x000F & (n_rem >> 12)); /* get rem */
178 n_prom[7] = crc_read; /* set crc read */
179 n_rem ^= 0x00; /* xor */
180 if (n_rem == crc) /* check crc */
181 {
182 return 0; /* success return 0 */
183 }
184 else
185 {
186 return 1; /* return error */
187 }
188}
189
198static uint8_t a_ms5611_prom_read(ms5611_handle_t *handle)
199{
200 uint8_t res;
201 uint8_t i ;
202
203 for (i = 0; i < 8; i++) /* loop all */
204 {
205 uint8_t buf[2];
206
207 res = a_ms5611_iic_spi_read(handle, MS5611_COMMAND_PROM_READ_ADDRESS_0 + i * 2, buf, 2); /* read prom */
208 if (res != 0) /* check result */
209 {
210 return 1; /* return error */
211 }
212 handle->coeff[i] = (uint16_t)((uint16_t)buf[0]) << 8 | (uint16_t)buf[1]; /* set coeff */
213 }
214 if (a_ms5611_crc_check(handle->coeff, (uint8_t)(handle->coeff[7] & 0x0F)) != 0) /* check crc */
215 {
216 return 1; /* return error */
217 }
218
219 return 0; /* success return 0 */
220}
221
232{
233 if (handle == NULL) /* check handle */
234 {
235 return 2; /* return error */
236 }
237
238 handle->iic_spi = (uint8_t)interface; /* set interface */
239
240 return 0; /* success return 0 */
241}
242
253{
254 if (handle == NULL) /* check handle */
255 {
256 return 2; /* return error */
257 }
258
259 *interface = (ms5611_interface_t)(handle->iic_spi); /* get interface */
260
261 return 0; /* success return 0 */
262}
263
274{
275 if (handle == NULL) /* check handle */
276 {
277 return 2; /* return error */
278 }
279
280 handle->iic_addr = (uint8_t)addr_pin; /* set pin */
281
282 return 0; /* success return 0 */
283}
284
295{
296 if (handle == NULL) /* check handle */
297 {
298 return 2; /* return error */
299 }
300
301 *addr_pin = (ms5611_address_t)(handle->iic_addr); /* get pin */
302
303 return 0; /* success return 0 */
304}
305
316{
317 if (handle == NULL) /* check handle */
318 {
319 return 2; /* return error */
320 }
321
322 handle->temperature_osr = (uint8_t)osr; /* set temperature osr */
323
324 return 0; /* success return 0 */
325}
326
337{
338 if (handle == NULL) /* check handle */
339 {
340 return 2; /* return error */
341 }
342
343 *osr = (ms5611_osr_t)(handle->temperature_osr); /* get temperature osr */
344
345 return 0; /* success return 0 */
346}
347
358{
359 if (handle == NULL) /* check handle */
360 {
361 return 2; /* return error */
362 }
363
364 handle->pressure_osr = (uint8_t)osr; /* set pressure osr */
365
366 return 0; /* success return 0 */
367}
368
379{
380 if (handle == NULL) /* check handle */
381 {
382 return 2; /* return error */
383 }
384
385 *osr = (ms5611_osr_t)(handle->pressure_osr); /* get pressure osr */
386
387 return 0; /* success return 0 */
388}
389
401{
402 uint8_t res;
403
404 if (handle == NULL) /* check handle */
405 {
406 return 2; /* return error */
407 }
408 if (handle->inited != 1) /* check handle initialization */
409 {
410 return 3; /* return error */
411 }
412
413 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_RESET, NULL, 0); /* write config */
414 if (res != 0) /* check result */
415 {
416 handle->debug_print("ms5611: reset failed.\n"); /* reset failed */
417
418 return 1; /* return error */
419 }
420 handle->delay_ms(5); /* delay 5ms */
421
422 return 0; /* success return 0 */
423}
424
439uint8_t ms5611_read_temperature_pressure(ms5611_handle_t *handle, uint32_t *temperature_raw, float *temperature_c,
440 uint32_t *pressure_raw, float *pressure_mbar)
441{
442 uint8_t res;
443 int32_t dt;
444 int32_t temp;
445 int64_t off;
446 int64_t sens;
447 int64_t p;
448 int64_t t2;
449 int64_t off2;
450 int64_t sens2;
451 uint8_t buf[3];
452
453 if (handle == NULL) /* check handle */
454 {
455 return 2; /* return error */
456 }
457 if (handle->inited != 1) /* check handle initialization */
458 {
459 return 3; /* return error */
460 }
461
462 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_TEMPERATURE, NULL, 0); /* write config */
463 if (res != 0) /* check result */
464 {
465 handle->debug_print("ms5611: start temperature failed.\n"); /* start temperature failed */
466
467 return 1; /* return error */
468 }
469 if (handle->temperature_osr == MS5611_OSR_256) /* osr 256 */
470 {
471 handle->delay_ms(1); /* delay 1ms */
472 }
473 else if (handle->temperature_osr == MS5611_OSR_512) /* osr 512 */
474 {
475 handle->delay_ms(2); /* delay 2ms */
476 }
477 else if (handle->temperature_osr == MS5611_OSR_1024) /* osr 1024 */
478 {
479 handle->delay_ms(3); /* delay 3ms */
480 }
481 else if (handle->temperature_osr == MS5611_OSR_2048) /* osr 2048 */
482 {
483 handle->delay_ms(5); /* delay 5ms */
484 }
485 else /* osr 4096 */
486 {
487 handle->delay_ms(10); /* delay 10ms */
488 }
489 res = a_ms5611_iic_spi_read(handle, MS5611_COMMAND_ADC_READ, buf, 3); /* read adc */
490 if (res != 0) /* check result */
491 {
492 handle->debug_print("ms5611: read adc failed.\n"); /* read adc failed */
493
494 return 1; /* return error */
495 }
496 *temperature_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
497 ((uint32_t)(buf[2]) << 0); /* set temperature raw */
498
499 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_PRESSURE, NULL, 0); /* write config */
500 if (res != 0) /* check result */
501 {
502 handle->debug_print("ms5611: start pressure failed.\n"); /* start pressure failed */
503
504 return 1; /* return error */
505 }
506 if (handle->temperature_osr == MS5611_OSR_256) /* osr 256 */
507 {
508 handle->delay_ms(1); /* delay 1ms */
509 }
510 else if (handle->temperature_osr == MS5611_OSR_512) /* osr 512 */
511 {
512 handle->delay_ms(2); /* delay 2ms */
513 }
514 else if (handle->temperature_osr == MS5611_OSR_1024) /* osr 1024 */
515 {
516 handle->delay_ms(3); /* delay 3ms */
517 }
518 else if (handle->temperature_osr == MS5611_OSR_2048) /* osr 2048 */
519 {
520 handle->delay_ms(5); /* delay 5ms */
521 }
522 else /* osr 4096 */
523 {
524 handle->delay_ms(10); /* delay 10ms */
525 }
526 res = a_ms5611_iic_spi_read(handle, MS5611_COMMAND_ADC_READ, buf, 3); /* read adc */
527 if (res != 0) /* check result */
528 {
529 handle->debug_print("ms5611: read adc failed.\n"); /* read adc failed */
530
531 return 1; /* return error */
532 }
533 *pressure_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
534 ((uint32_t)(buf[2]) << 0); /* set pressure raw */
535
536 dt = (int32_t)(*temperature_raw) -
537 ((int32_t)handle->coeff[MS5611_REFERENCE_TEMPERATURE_INDEX] << 8); /* get dt */
538 temp = 2000 + ((int64_t)dt *
539 (int64_t)handle->coeff[MS5611_TEMP_COEFF_OF_TEMPERATURE_INDEX] >> 23); /* set temp */
540 if (temp < 2000) /* check temp */
541 {
542 t2 = (3 * ((int64_t)dt * (int64_t)dt)) >> 33; /* set t2 */
543 off2 = 61 * ((int64_t)temp - 2000) * ((int64_t)temp - 2000) / 16; /* set off2 */
544 sens2 = 29 * ((int64_t)temp - 2000) * ((int64_t)temp - 2000) / 16; /* set sens2 */
545 if (temp < -1500) /* if < -1500 */
546 {
547 off2 += 17 * ((int64_t)temp + 1500) * ((int64_t)temp + 1500); /* set off2 */
548 sens2 += 9 * ((int64_t)temp + 1500) * ((int64_t)temp + 1500); /* set sens2 */
549 }
550 }
551 else
552 {
553 t2 = (5 * ((int64_t)dt * (int64_t)dt)) >> 38; /* set t2 */
554 off2 = 0; /* init off2 0 */
555 sens2 = 0; /* init sens2 0 */
556 }
557 off = ((int64_t)(handle->coeff[MS5611_PRESSURE_OFFSET_INDEX]) << 16) +
558 (((int64_t)(handle->coeff[MS5611_TEMP_COEFF_OF_PRESSURE_OFFSET_INDEX]) * dt) >> 7); /* set off */
559 off -= off2; /* get off */
560 sens = ((int64_t)handle->coeff[MS5611_PRESSURE_SENSITIVITY_INDEX] << 15) +
561 (((int64_t)handle->coeff[MS5611_TEMP_COEFF_OF_PRESSURE_SENSITIVITY_INDEX] * dt) >> 8); /* set sens */
562 sens -= sens2; /* get new sens */
563 p = ((((*pressure_raw) * sens) >> 21) - off) >> 15; /* get p */
564 *temperature_c = ((float)temp - (float)t2) / 100.0f; /* get real temperature */
565 *pressure_mbar = (float)p / 100.0f; /* get real pressure */
566
567 return 0; /* success return 0 */
568}
569
582uint8_t ms5611_read_temperature(ms5611_handle_t *handle, uint32_t *temperature_raw, float *temperature_c)
583{
584 uint8_t res;
585 int32_t dt;
586 int32_t temp;
587 int64_t t2;
588 uint8_t buf[3];
589
590 if (handle == NULL) /* check handle */
591 {
592 return 2; /* return error */
593 }
594 if (handle->inited != 1) /* check handle initialization */
595 {
596 return 3; /* return error */
597 }
598
599 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_TEMPERATURE, NULL, 0); /* write config */
600 if (res != 0) /* check result */
601 {
602 handle->debug_print("ms5611: start temperature failed.\n"); /* start temperature failed */
603
604 return 1; /* return error */
605 }
606 if (handle->temperature_osr == MS5611_OSR_256) /* osr 256 */
607 {
608 handle->delay_ms(1); /* delay 1ms */
609 }
610 else if (handle->temperature_osr == MS5611_OSR_512) /* osr 512 */
611 {
612 handle->delay_ms(2); /* delay 2ms */
613 }
614 else if (handle->temperature_osr == MS5611_OSR_1024) /* osr 1024 */
615 {
616 handle->delay_ms(3); /* delay 3ms */
617 }
618 else if (handle->temperature_osr == MS5611_OSR_2048) /* osr 2048 */
619 {
620 handle->delay_ms(5); /* delay 5ms */
621 }
622 else /* osr 4096 */
623 {
624 handle->delay_ms(10); /* delay 10ms */
625 }
626 res = a_ms5611_iic_spi_read(handle, MS5611_COMMAND_ADC_READ, buf, 3); /* read adc */
627 if (res != 0) /* check result */
628 {
629 handle->debug_print("ms5611: read adc failed.\n"); /* read adc failed */
630
631 return 1; /* return error */
632 }
633 *temperature_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
634 ((uint32_t)(buf[2]) << 0); /* set temperature raw */
635
636 dt = (int32_t)(*temperature_raw) -
637 ((int32_t)handle->coeff[MS5611_REFERENCE_TEMPERATURE_INDEX] << 8); /* get dt */
638 temp = 2000 + ((int64_t)dt *
639 (int64_t)handle->coeff[MS5611_TEMP_COEFF_OF_TEMPERATURE_INDEX] >> 23); /* set temp */
640 if (temp < 2000) /* check temp */
641 {
642 t2 = (3 * ((int64_t)dt * (int64_t)dt)) >> 33; /* set t2 */
643 }
644 else
645 {
646 t2 = (5 * ((int64_t)dt * (int64_t)dt)) >> 38; /* set t2 */
647 }
648 *temperature_c = ((float)temp - (float)t2) / 100.0f; /* get real temperature */
649
650 return 0; /* success return 0 */
651}
652
665uint8_t ms5611_read_pressure(ms5611_handle_t *handle, uint32_t *pressure_raw, float *pressure_mbar)
666{
667 uint8_t res;
668 int32_t dt;
669 int32_t temp;
670 uint32_t temperature_raw;
671 int64_t off;
672 int64_t sens;
673 int64_t p;
674 int64_t off2;
675 int64_t sens2;
676 uint8_t buf[3];
677
678 if (handle == NULL) /* check handle */
679 {
680 return 2; /* return error */
681 }
682 if (handle->inited != 1) /* check handle initialization */
683 {
684 return 3; /* return error */
685 }
686
687 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_TEMPERATURE, NULL, 0); /* write config */
688 if (res != 0) /* check result */
689 {
690 handle->debug_print("ms5611: start temperature failed.\n"); /* start temperature failed */
691
692 return 1; /* return error */
693 }
694 if (handle->temperature_osr == MS5611_OSR_256) /* osr 256 */
695 {
696 handle->delay_ms(1); /* delay 1ms */
697 }
698 else if (handle->temperature_osr == MS5611_OSR_512) /* osr 512 */
699 {
700 handle->delay_ms(2); /* delay 2ms */
701 }
702 else if (handle->temperature_osr == MS5611_OSR_1024) /* osr 1024 */
703 {
704 handle->delay_ms(3); /* delay 3ms */
705 }
706 else if (handle->temperature_osr == MS5611_OSR_2048) /* osr 2048 */
707 {
708 handle->delay_ms(5); /* delay 5ms */
709 }
710 else /* osr 4096 */
711 {
712 handle->delay_ms(10); /* delay 10ms */
713 }
714 res = a_ms5611_iic_spi_read(handle, MS5611_COMMAND_ADC_READ, buf, 3); /* read adc */
715 if (res != 0) /* check result */
716 {
717 handle->debug_print("ms5611: read adc failed.\n"); /* read adc failed */
718
719 return 1; /* return error */
720 }
721 temperature_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
722 ((uint32_t)(buf[2]) << 0); /* set temperature raw */
723
724 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_PRESSURE, NULL, 0); /* write config */
725 if (res != 0) /* check result */
726 {
727 handle->debug_print("ms5611: start pressure failed.\n"); /* start pressure failed */
728
729 return 1; /* return error */
730 }
731 if (handle->temperature_osr == MS5611_OSR_256) /* osr 256 */
732 {
733 handle->delay_ms(1); /* delay 1ms */
734 }
735 else if (handle->temperature_osr == MS5611_OSR_512) /* osr 512 */
736 {
737 handle->delay_ms(2); /* delay 2ms */
738 }
739 else if (handle->temperature_osr == MS5611_OSR_1024) /* osr 1024 */
740 {
741 handle->delay_ms(3); /* delay 3ms */
742 }
743 else if (handle->temperature_osr == MS5611_OSR_2048) /* osr 2048 */
744 {
745 handle->delay_ms(5); /* delay 5ms */
746 }
747 else /* osr 4096 */
748 {
749 handle->delay_ms(10); /* delay 10ms */
750 }
751 res = a_ms5611_iic_spi_read(handle, MS5611_COMMAND_ADC_READ, buf, 3); /* read adc */
752 if (res != 0) /* check result */
753 {
754 handle->debug_print("ms5611: read adc failed.\n"); /* read adc failed */
755
756 return 1; /* return error */
757 }
758 *pressure_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
759 ((uint32_t)(buf[2]) << 0); /* set pressure raw */
760
761 dt = (int32_t)(temperature_raw) -
762 ((int32_t)handle->coeff[MS5611_REFERENCE_TEMPERATURE_INDEX] << 8); /* get dt */
763 temp = 2000 + ((int64_t)dt *
764 (int64_t)handle->coeff[MS5611_TEMP_COEFF_OF_TEMPERATURE_INDEX] >> 23); /* set temp */
765 if (temp < 2000) /* check temp */
766 {
767 off2 = 61 * ((int64_t)temp - 2000) * ((int64_t)temp - 2000) / 16; /* set off2 */
768 sens2 = 29 * ((int64_t)temp - 2000) * ((int64_t)temp - 2000) / 16; /* set sens2 */
769 if (temp < -1500) /* if < -1500 */
770 {
771 off2 += 17 * ((int64_t)temp + 1500) * ((int64_t)temp + 1500); /* set off2 */
772 sens2 += 9 * ((int64_t)temp + 1500) * ((int64_t)temp + 1500); /* set sens2 */
773 }
774 }
775 else
776 {
777 off2 = 0; /* init off2 0 */
778 sens2 = 0; /* init sens2 0 */
779 }
780 off = ((int64_t)(handle->coeff[MS5611_PRESSURE_OFFSET_INDEX]) << 16) +
781 (((int64_t)(handle->coeff[MS5611_TEMP_COEFF_OF_PRESSURE_OFFSET_INDEX]) * dt) >> 7); /* set off */
782 off -= off2; /* get off */
783 sens = ((int64_t)handle->coeff[MS5611_PRESSURE_SENSITIVITY_INDEX] << 15) +
784 (((int64_t)handle->coeff[MS5611_TEMP_COEFF_OF_PRESSURE_SENSITIVITY_INDEX] * dt) >> 8); /* set sens */
785 sens -= sens2; /* get new sens */
786 p = ((((*pressure_raw) * sens) >> 21) - off) >> 15; /* get p */
787 *pressure_mbar = (float)p / 100.0f; /* get real pressure */
788
789 return 0; /* success return 0 */
790}
791
800static uint8_t a_ms5611_close(ms5611_handle_t *handle)
801{
802 if (handle->iic_spi == MS5611_INTERFACE_IIC) /* iic interface */
803 {
804 if (handle->iic_deinit() != 0) /* iic deinit */
805 {
806 handle->debug_print("ms5611: iic deinit failed.\n"); /* iic deinit failed */
807
808 return 1; /* return error */
809 }
810 else
811 {
812 return 0; /* success return 0 */
813 }
814 }
815 else /* spi interface */
816 {
817 if (handle->spi_deinit() != 0) /* spi deinit */
818 {
819 handle->debug_print("ms5611: spi deinit failed.\n"); /* spi deinit failed */
820
821 return 1; /* return error */
822 }
823 else
824 {
825 return 0; /* success return 0 */
826 }
827 }
828}
829
843{
844 uint8_t res;
845
846 if (handle == NULL) /* check handle */
847 {
848 return 2; /* return error */
849 }
850 if (handle->debug_print == NULL) /* check debug_print */
851 {
852 return 3; /* return error */
853 }
854 if (handle->iic_init == NULL) /* check iic_init */
855 {
856 handle->debug_print("ms5611: iic_init is null.\n"); /* iic_init is null */
857
858 return 3; /* return error */
859 }
860 if (handle->iic_deinit == NULL) /* check iic_deinit */
861 {
862 handle->debug_print("ms5611: iic_deinit is null.\n"); /* iic_deinit is null */
863
864 return 3; /* return error */
865 }
866 if (handle->iic_read == NULL) /* check iic_read */
867 {
868 handle->debug_print("ms5611: iic_read is null.\n"); /* iic_read is null */
869
870 return 3; /* return error */
871 }
872 if (handle->iic_write == NULL) /* check iic_write */
873 {
874 handle->debug_print("ms5611: iic_write is null.\n"); /* iic_write is null */
875
876 return 3; /* return error */
877 }
878 if (handle->spi_init == NULL) /* check spi_init */
879 {
880 handle->debug_print("ms5611: spi_init is null.\n"); /* spi_init is null */
881
882 return 3; /* return error */
883 }
884 if (handle->spi_deinit == NULL) /* check spi_deinit */
885 {
886 handle->debug_print("ms5611: spi_deinit is null.\n"); /* spi_deinit is null */
887
888 return 3; /* return error */
889 }
890 if (handle->spi_read == NULL) /* check spi_read */
891 {
892 handle->debug_print("ms5611: spi_read is null.\n"); /* spi_read is null */
893
894 return 3; /* return error */
895 }
896 if (handle->spi_write == NULL) /* check spi_write */
897 {
898 handle->debug_print("ms5611: spi_write is null.\n"); /* spi_write is null */
899
900 return 3; /* return error */
901 }
902 if (handle->delay_ms == NULL) /* check delay_ms */
903 {
904 handle->debug_print("ms5611: delay_ms is null.\n"); /* delay_ms is null */
905
906 return 3; /* return error */
907 }
908
909 if (handle->iic_spi == MS5611_INTERFACE_IIC) /* iic interface */
910 {
911 if (handle->iic_init() != 0) /* initialize iic bus */
912 {
913 handle->debug_print("ms5611: iic init failed.\n"); /* iic init failed */
914
915 return 1; /* return error */
916 }
917 }
918 else /* spi interface */
919 {
920 if (handle->spi_init() != 0) /* initialize spi bus */
921 {
922 handle->debug_print("ms5611: spi init failed.\n"); /* spi init failed */
923
924 return 1; /* return error */
925 }
926 }
927 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_RESET,
928 NULL, 0); /* write config */
929 if (res != 0) /* check result */
930 {
931 handle->debug_print("ms5611: reset failed.\n"); /* reset failed */
932
933 return 4; /* return error */
934 }
935 handle->delay_ms(5); /* delay 5ms */
936 res = a_ms5611_prom_read(handle); /* prom read */
937 if (res != 0) /* check result */
938 {
939 handle->debug_print("ms5611: prom read failed.\n"); /* prom read failed */
940
941 return 5; /* return error */
942 }
943 handle->inited = 1; /* flag finish initialization */
944
945 return 0; /* success return 0 */
946}
947
960{
961 uint8_t res;
962
963 if (handle == NULL) /* check handle */
964 {
965 return 2; /* return error */
966 }
967 if (handle->inited != 1) /* check handle initialization */
968 {
969 return 3; /* return error */
970 }
971
972 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_RESET, NULL, 0); /* write config */
973 if (res != 0) /* check result */
974 {
975 handle->debug_print("ms5611: reset failed.\n"); /* reset failed */
976
977 return 4; /* return error */
978 }
979 handle->delay_ms(5); /* delay 5ms */
980 res = a_ms5611_close(handle); /* close */
981 if (res != 0) /* check result */
982 {
983 return 1; /* return error */
984 }
985 else
986 {
987 handle->inited = 0; /* flag close */
988
989 return 0; /* success return 0 */
990 }
991}
992
1006uint8_t ms5611_set_reg(ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
1007{
1008 if (handle == NULL) /* check handle */
1009 {
1010 return 2; /* return error */
1011 }
1012 if (handle->inited != 1) /* check handle initialization */
1013 {
1014 return 3; /* return error */
1015 }
1016
1017 return a_ms5611_iic_spi_write(handle, reg, buf, len); /* write data */
1018}
1019
1033uint8_t ms5611_get_reg(ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
1034{
1035 if (handle == NULL) /* check handle */
1036 {
1037 return 2; /* return error */
1038 }
1039 if (handle->inited != 1) /* check handle initialization */
1040 {
1041 return 3; /* return error */
1042 }
1043
1044 return a_ms5611_iic_spi_read(handle, reg, buf, len); /* read data */
1045}
1046
1056{
1057 if (info == NULL) /* check handle */
1058 {
1059 return 2; /* return error */
1060 }
1061
1062 memset(info, 0, sizeof(ms5611_info_t)); /* initialize ms5611 info structure */
1063 strncpy(info->chip_name, CHIP_NAME, 32); /* copy chip name */
1064 strncpy(info->manufacturer_name, MANUFACTURER_NAME, 32); /* copy manufacturer name */
1065 strncpy(info->interface, "IIC SPI", 8); /* copy interface name */
1066 info->supply_voltage_min_v = SUPPLY_VOLTAGE_MIN; /* set minimal supply voltage */
1067 info->supply_voltage_max_v = SUPPLY_VOLTAGE_MAX; /* set maximum supply voltage */
1068 info->max_current_ma = MAX_CURRENT; /* set maximum current */
1069 info->temperature_max = TEMPERATURE_MAX; /* set minimal temperature */
1070 info->temperature_min = TEMPERATURE_MIN; /* set maximum temperature */
1071 info->driver_version = DRIVER_VERSION; /* set driver version */
1072
1073 return 0; /* success return 0 */
1074}
#define MS5611_COMMAND_ADC_READ
#define MAX_CURRENT
#define MS5611_COMMAND_PROM_READ_ADDRESS_0
#define SUPPLY_VOLTAGE_MAX
#define MS5611_COMMAND_RESET
chip command definition
#define MS5611_COMMAND_TEMPERATURE
#define MS5611_PRESSURE_SENSITIVITY_INDEX
coeff index definition
#define MS5611_PRESSURE_OFFSET_INDEX
#define TEMPERATURE_MAX
#define MS5611_COMMAND_PRESSURE
#define MANUFACTURER_NAME
#define TEMPERATURE_MIN
#define MS5611_TEMP_COEFF_OF_TEMPERATURE_INDEX
#define SUPPLY_VOLTAGE_MIN
#define MS5611_TEMP_COEFF_OF_PRESSURE_SENSITIVITY_INDEX
#define CHIP_NAME
chip register definition
#define MS5611_TEMP_COEFF_OF_PRESSURE_OFFSET_INDEX
#define DRIVER_VERSION
#define MS5611_REFERENCE_TEMPERATURE_INDEX
driver ms5611 header file
struct ms5611_info_s ms5611_info_t
ms5611 information structure definition
ms5611_osr_t
ms5611 osr enumeration definition
uint8_t ms5611_get_pressure_osr(ms5611_handle_t *handle, ms5611_osr_t *osr)
get pressure osr
ms5611_address_t
ms5611 address enumeration definition
uint8_t ms5611_reset(ms5611_handle_t *handle)
reset the chip
uint8_t ms5611_read_pressure(ms5611_handle_t *handle, uint32_t *pressure_raw, float *pressure_mbar)
read the pressure
uint8_t ms5611_info(ms5611_info_t *info)
get chip's information
uint8_t ms5611_deinit(ms5611_handle_t *handle)
close the chip
uint8_t ms5611_set_pressure_osr(ms5611_handle_t *handle, ms5611_osr_t osr)
set pressure osr
uint8_t ms5611_set_addr_pin(ms5611_handle_t *handle, ms5611_address_t addr_pin)
set the iic address pin
uint8_t ms5611_read_temperature_pressure(ms5611_handle_t *handle, uint32_t *temperature_raw, float *temperature_c, uint32_t *pressure_raw, float *pressure_mbar)
read the temperature and pressure
ms5611_interface_t
ms5611 interface enumeration definition
uint8_t ms5611_read_temperature(ms5611_handle_t *handle, uint32_t *temperature_raw, float *temperature_c)
read the temperature
uint8_t ms5611_get_interface(ms5611_handle_t *handle, ms5611_interface_t *interface)
get the chip interface
struct ms5611_handle_s ms5611_handle_t
ms5611 handle structure definition
uint8_t ms5611_init(ms5611_handle_t *handle)
initialize the chip
uint8_t ms5611_get_addr_pin(ms5611_handle_t *handle, ms5611_address_t *addr_pin)
get the iic address pin
uint8_t ms5611_set_interface(ms5611_handle_t *handle, ms5611_interface_t interface)
set the chip interface
uint8_t ms5611_get_temperature_osr(ms5611_handle_t *handle, ms5611_osr_t *osr)
get temperature osr
uint8_t ms5611_set_temperature_osr(ms5611_handle_t *handle, ms5611_osr_t osr)
set temperature osr
@ MS5611_OSR_1024
@ MS5611_OSR_2048
@ MS5611_OSR_512
@ MS5611_OSR_256
@ MS5611_INTERFACE_IIC
uint8_t ms5611_set_reg(ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
set the chip register
uint8_t ms5611_get_reg(ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
get the chip register
uint8_t(* spi_init)(void)
uint16_t coeff[8]
void(* delay_ms)(uint32_t ms)
uint8_t(* spi_read)(uint8_t reg, uint8_t *buf, uint16_t len)
uint8_t(* spi_write)(uint8_t reg, uint8_t *buf, uint16_t len)
void(* debug_print)(const char *const fmt,...)
uint8_t(* iic_init)(void)
uint8_t temperature_osr
uint8_t(* spi_deinit)(void)
uint8_t(* iic_write)(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
uint8_t(* iic_read)(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
uint8_t(* iic_deinit)(void)
float supply_voltage_max_v
uint32_t driver_version
char manufacturer_name[32]
float supply_voltage_min_v
char chip_name[32]