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 + handle->temperature_osr, 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 + handle->pressure_osr, 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->pressure_osr == MS5611_OSR_256) /* osr 256 */
507 {
508 handle->delay_ms(1); /* delay 1ms */
509 }
510 else if (handle->pressure_osr == MS5611_OSR_512) /* osr 512 */
511 {
512 handle->delay_ms(2); /* delay 2ms */
513 }
514 else if (handle->pressure_osr == MS5611_OSR_1024) /* osr 1024 */
515 {
516 handle->delay_ms(3); /* delay 3ms */
517 }
518 else if (handle->pressure_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,
601 NULL, 0); /* write config */
602 if (res != 0) /* check result */
603 {
604 handle->debug_print("ms5611: start temperature failed.\n"); /* start temperature failed */
605
606 return 1; /* return error */
607 }
608 if (handle->temperature_osr == MS5611_OSR_256) /* osr 256 */
609 {
610 handle->delay_ms(1); /* delay 1ms */
611 }
612 else if (handle->temperature_osr == MS5611_OSR_512) /* osr 512 */
613 {
614 handle->delay_ms(2); /* delay 2ms */
615 }
616 else if (handle->temperature_osr == MS5611_OSR_1024) /* osr 1024 */
617 {
618 handle->delay_ms(3); /* delay 3ms */
619 }
620 else if (handle->temperature_osr == MS5611_OSR_2048) /* osr 2048 */
621 {
622 handle->delay_ms(5); /* delay 5ms */
623 }
624 else /* osr 4096 */
625 {
626 handle->delay_ms(10); /* delay 10ms */
627 }
628 res = a_ms5611_iic_spi_read(handle, MS5611_COMMAND_ADC_READ, buf, 3); /* read adc */
629 if (res != 0) /* check result */
630 {
631 handle->debug_print("ms5611: read adc failed.\n"); /* read adc failed */
632
633 return 1; /* return error */
634 }
635 *temperature_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
636 ((uint32_t)(buf[2]) << 0); /* set temperature raw */
637
638 dt = (int32_t)(*temperature_raw) -
639 ((int32_t)handle->coeff[MS5611_REFERENCE_TEMPERATURE_INDEX] << 8); /* get dt */
640 temp = 2000 + ((int64_t)dt *
641 (int64_t)handle->coeff[MS5611_TEMP_COEFF_OF_TEMPERATURE_INDEX] >> 23); /* set temp */
642 if (temp < 2000) /* check temp */
643 {
644 t2 = (3 * ((int64_t)dt * (int64_t)dt)) >> 33; /* set t2 */
645 }
646 else
647 {
648 t2 = (5 * ((int64_t)dt * (int64_t)dt)) >> 38; /* set t2 */
649 }
650 *temperature_c = ((float)temp - (float)t2) / 100.0f; /* get real temperature */
651
652 return 0; /* success return 0 */
653}
654
667uint8_t ms5611_read_pressure(ms5611_handle_t *handle, uint32_t *pressure_raw, float *pressure_mbar)
668{
669 uint8_t res;
670 int32_t dt;
671 int32_t temp;
672 uint32_t temperature_raw;
673 int64_t off;
674 int64_t sens;
675 int64_t p;
676 int64_t off2;
677 int64_t sens2;
678 uint8_t buf[3];
679
680 if (handle == NULL) /* check handle */
681 {
682 return 2; /* return error */
683 }
684 if (handle->inited != 1) /* check handle initialization */
685 {
686 return 3; /* return error */
687 }
688
689 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_TEMPERATURE + handle->temperature_osr, NULL, 0); /* write config */
690 if (res != 0) /* check result */
691 {
692 handle->debug_print("ms5611: start temperature failed.\n"); /* start temperature failed */
693
694 return 1; /* return error */
695 }
696 if (handle->temperature_osr == MS5611_OSR_256) /* osr 256 */
697 {
698 handle->delay_ms(1); /* delay 1ms */
699 }
700 else if (handle->temperature_osr == MS5611_OSR_512) /* osr 512 */
701 {
702 handle->delay_ms(2); /* delay 2ms */
703 }
704 else if (handle->temperature_osr == MS5611_OSR_1024) /* osr 1024 */
705 {
706 handle->delay_ms(3); /* delay 3ms */
707 }
708 else if (handle->temperature_osr == MS5611_OSR_2048) /* osr 2048 */
709 {
710 handle->delay_ms(5); /* delay 5ms */
711 }
712 else /* osr 4096 */
713 {
714 handle->delay_ms(10); /* delay 10ms */
715 }
716 res = a_ms5611_iic_spi_read(handle, MS5611_COMMAND_ADC_READ, buf, 3); /* read adc */
717 if (res != 0) /* check result */
718 {
719 handle->debug_print("ms5611: read adc failed.\n"); /* read adc failed */
720
721 return 1; /* return error */
722 }
723 temperature_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
724 ((uint32_t)(buf[2]) << 0); /* set temperature raw */
725
726 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_PRESSURE + handle->pressure_osr, NULL, 0); /* write config */
727 if (res != 0) /* check result */
728 {
729 handle->debug_print("ms5611: start pressure failed.\n"); /* start pressure failed */
730
731 return 1; /* return error */
732 }
733 if (handle->pressure_osr == MS5611_OSR_256) /* osr 256 */
734 {
735 handle->delay_ms(1); /* delay 1ms */
736 }
737 else if (handle->pressure_osr == MS5611_OSR_512) /* osr 512 */
738 {
739 handle->delay_ms(2); /* delay 2ms */
740 }
741 else if (handle->pressure_osr == MS5611_OSR_1024) /* osr 1024 */
742 {
743 handle->delay_ms(3); /* delay 3ms */
744 }
745 else if (handle->pressure_osr == MS5611_OSR_2048) /* osr 2048 */
746 {
747 handle->delay_ms(5); /* delay 5ms */
748 }
749 else /* osr 4096 */
750 {
751 handle->delay_ms(10); /* delay 10ms */
752 }
753 res = a_ms5611_iic_spi_read(handle, MS5611_COMMAND_ADC_READ, buf, 3); /* read adc */
754 if (res != 0) /* check result */
755 {
756 handle->debug_print("ms5611: read adc failed.\n"); /* read adc failed */
757
758 return 1; /* return error */
759 }
760 *pressure_raw = ((uint32_t)(buf[0]) << 16) | ((uint32_t)(buf[1]) << 8) |
761 ((uint32_t)(buf[2]) << 0); /* set pressure raw */
762
763 dt = (int32_t)(temperature_raw) -
764 ((int32_t)handle->coeff[MS5611_REFERENCE_TEMPERATURE_INDEX] << 8); /* get dt */
765 temp = 2000 + ((int64_t)dt *
766 (int64_t)handle->coeff[MS5611_TEMP_COEFF_OF_TEMPERATURE_INDEX] >> 23); /* set temp */
767 if (temp < 2000) /* check temp */
768 {
769 off2 = 61 * ((int64_t)temp - 2000) * ((int64_t)temp - 2000) / 16; /* set off2 */
770 sens2 = 29 * ((int64_t)temp - 2000) * ((int64_t)temp - 2000) / 16; /* set sens2 */
771 if (temp < -1500) /* if < -1500 */
772 {
773 off2 += 17 * ((int64_t)temp + 1500) * ((int64_t)temp + 1500); /* set off2 */
774 sens2 += 9 * ((int64_t)temp + 1500) * ((int64_t)temp + 1500); /* set sens2 */
775 }
776 }
777 else
778 {
779 off2 = 0; /* init off2 0 */
780 sens2 = 0; /* init sens2 0 */
781 }
782 off = ((int64_t)(handle->coeff[MS5611_PRESSURE_OFFSET_INDEX]) << 16) +
783 (((int64_t)(handle->coeff[MS5611_TEMP_COEFF_OF_PRESSURE_OFFSET_INDEX]) * dt) >> 7); /* set off */
784 off -= off2; /* get off */
785 sens = ((int64_t)handle->coeff[MS5611_PRESSURE_SENSITIVITY_INDEX] << 15) +
786 (((int64_t)handle->coeff[MS5611_TEMP_COEFF_OF_PRESSURE_SENSITIVITY_INDEX] * dt) >> 8); /* set sens */
787 sens -= sens2; /* get new sens */
788 p = ((((*pressure_raw) * sens) >> 21) - off) >> 15; /* get p */
789 *pressure_mbar = (float)p / 100.0f; /* get real pressure */
790
791 return 0; /* success return 0 */
792}
793
802static uint8_t a_ms5611_close(ms5611_handle_t *handle)
803{
804 if (handle->iic_spi == MS5611_INTERFACE_IIC) /* iic interface */
805 {
806 if (handle->iic_deinit() != 0) /* iic deinit */
807 {
808 handle->debug_print("ms5611: iic deinit failed.\n"); /* iic deinit failed */
809
810 return 1; /* return error */
811 }
812 else
813 {
814 return 0; /* success return 0 */
815 }
816 }
817 else /* spi interface */
818 {
819 if (handle->spi_deinit() != 0) /* spi deinit */
820 {
821 handle->debug_print("ms5611: spi deinit failed.\n"); /* spi deinit failed */
822
823 return 1; /* return error */
824 }
825 else
826 {
827 return 0; /* success return 0 */
828 }
829 }
830}
831
845{
846 uint8_t res;
847
848 if (handle == NULL) /* check handle */
849 {
850 return 2; /* return error */
851 }
852 if (handle->debug_print == NULL) /* check debug_print */
853 {
854 return 3; /* return error */
855 }
856 if (handle->iic_init == NULL) /* check iic_init */
857 {
858 handle->debug_print("ms5611: iic_init is null.\n"); /* iic_init is null */
859
860 return 3; /* return error */
861 }
862 if (handle->iic_deinit == NULL) /* check iic_deinit */
863 {
864 handle->debug_print("ms5611: iic_deinit is null.\n"); /* iic_deinit is null */
865
866 return 3; /* return error */
867 }
868 if (handle->iic_read == NULL) /* check iic_read */
869 {
870 handle->debug_print("ms5611: iic_read is null.\n"); /* iic_read is null */
871
872 return 3; /* return error */
873 }
874 if (handle->iic_write == NULL) /* check iic_write */
875 {
876 handle->debug_print("ms5611: iic_write is null.\n"); /* iic_write is null */
877
878 return 3; /* return error */
879 }
880 if (handle->spi_init == NULL) /* check spi_init */
881 {
882 handle->debug_print("ms5611: spi_init is null.\n"); /* spi_init is null */
883
884 return 3; /* return error */
885 }
886 if (handle->spi_deinit == NULL) /* check spi_deinit */
887 {
888 handle->debug_print("ms5611: spi_deinit is null.\n"); /* spi_deinit is null */
889
890 return 3; /* return error */
891 }
892 if (handle->spi_read == NULL) /* check spi_read */
893 {
894 handle->debug_print("ms5611: spi_read is null.\n"); /* spi_read is null */
895
896 return 3; /* return error */
897 }
898 if (handle->spi_write == NULL) /* check spi_write */
899 {
900 handle->debug_print("ms5611: spi_write is null.\n"); /* spi_write is null */
901
902 return 3; /* return error */
903 }
904 if (handle->delay_ms == NULL) /* check delay_ms */
905 {
906 handle->debug_print("ms5611: delay_ms is null.\n"); /* delay_ms is null */
907
908 return 3; /* return error */
909 }
910
911 if (handle->iic_spi == MS5611_INTERFACE_IIC) /* iic interface */
912 {
913 if (handle->iic_init() != 0) /* initialize iic bus */
914 {
915 handle->debug_print("ms5611: iic init failed.\n"); /* iic init failed */
916
917 return 1; /* return error */
918 }
919 }
920 else /* spi interface */
921 {
922 if (handle->spi_init() != 0) /* initialize spi bus */
923 {
924 handle->debug_print("ms5611: spi init failed.\n"); /* spi init failed */
925
926 return 1; /* return error */
927 }
928 }
929 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_RESET,
930 NULL, 0); /* write config */
931 if (res != 0) /* check result */
932 {
933 handle->debug_print("ms5611: reset failed.\n"); /* reset failed */
934
935 return 4; /* return error */
936 }
937 handle->delay_ms(5); /* delay 5ms */
938 res = a_ms5611_prom_read(handle); /* prom read */
939 if (res != 0) /* check result */
940 {
941 handle->debug_print("ms5611: prom read failed.\n"); /* prom read failed */
942
943 return 5; /* return error */
944 }
945 handle->inited = 1; /* flag finish initialization */
946
947 return 0; /* success return 0 */
948}
949
962{
963 uint8_t res;
964
965 if (handle == NULL) /* check handle */
966 {
967 return 2; /* return error */
968 }
969 if (handle->inited != 1) /* check handle initialization */
970 {
971 return 3; /* return error */
972 }
973
974 res = a_ms5611_iic_spi_write(handle, MS5611_COMMAND_RESET, NULL, 0); /* write config */
975 if (res != 0) /* check result */
976 {
977 handle->debug_print("ms5611: reset failed.\n"); /* reset failed */
978
979 return 4; /* return error */
980 }
981 handle->delay_ms(5); /* delay 5ms */
982 res = a_ms5611_close(handle); /* close */
983 if (res != 0) /* check result */
984 {
985 return 1; /* return error */
986 }
987 else
988 {
989 handle->inited = 0; /* flag close */
990
991 return 0; /* success return 0 */
992 }
993}
994
1008uint8_t ms5611_set_reg(ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
1009{
1010 if (handle == NULL) /* check handle */
1011 {
1012 return 2; /* return error */
1013 }
1014 if (handle->inited != 1) /* check handle initialization */
1015 {
1016 return 3; /* return error */
1017 }
1018
1019 return a_ms5611_iic_spi_write(handle, reg, buf, len); /* write data */
1020}
1021
1035uint8_t ms5611_get_reg(ms5611_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
1036{
1037 if (handle == NULL) /* check handle */
1038 {
1039 return 2; /* return error */
1040 }
1041 if (handle->inited != 1) /* check handle initialization */
1042 {
1043 return 3; /* return error */
1044 }
1045
1046 return a_ms5611_iic_spi_read(handle, reg, buf, len); /* read data */
1047}
1048
1058{
1059 if (info == NULL) /* check handle */
1060 {
1061 return 2; /* return error */
1062 }
1063
1064 memset(info, 0, sizeof(ms5611_info_t)); /* initialize ms5611 info structure */
1065 strncpy(info->chip_name, CHIP_NAME, 32); /* copy chip name */
1066 strncpy(info->manufacturer_name, MANUFACTURER_NAME, 32); /* copy manufacturer name */
1067 strncpy(info->interface, "IIC SPI", 8); /* copy interface name */
1068 info->supply_voltage_min_v = SUPPLY_VOLTAGE_MIN; /* set minimal supply voltage */
1069 info->supply_voltage_max_v = SUPPLY_VOLTAGE_MAX; /* set maximum supply voltage */
1070 info->max_current_ma = MAX_CURRENT; /* set maximum current */
1071 info->temperature_max = TEMPERATURE_MAX; /* set minimal temperature */
1072 info->temperature_min = TEMPERATURE_MIN; /* set maximum temperature */
1073 info->driver_version = DRIVER_VERSION; /* set driver version */
1074
1075 return 0; /* success return 0 */
1076}
#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]