LibDriver CS1237
Loading...
Searching...
No Matches
driver_cs1237.c
Go to the documentation of this file.
1
36
37#include "driver_cs1237.h"
38
42#define CHIP_NAME "CHIPSEA CS1237"
43#define MANUFACTURER_NAME "CHIPSEA"
44#define SUPPLY_VOLTAGE_MIN 3.0f
45#define SUPPLY_VOLTAGE_MAX 5.5f
46#define MAX_CURRENT 2.34f
47#define TEMPERATURE_MIN -40.0f
48#define TEMPERATURE_MAX 85.0f
49#define DRIVER_VERSION 1000
50
54#define CS1237_COMMAND_READ 0x56
55#define CS1237_COMMAND_WRITE 0x65
56
66static uint8_t a_cs1237_check_ready(cs1237_handle_t *handle, uint8_t *ready)
67{
68 uint8_t level;
69 uint16_t timeout = 500; /* 500ms */
70
71 while (timeout != 0) /* loop */
72 {
73 timeout--; /* timeout-- */
74
75 if (handle->dout_gpio_read(&level) != 0) /* read level */
76 {
77 handle->debug_print("cs1237: dout gpio read failed.\n"); /* dout gpio read failed */
78
79 return 1; /* return error */
80 }
81
82 if (level == 0) /* check low */
83 {
84 *ready = 1; /* set true */
85
86 return 0; /* return ok */
87 }
88
89 handle->delay_ms(1); /* delay 1ms */
90 }
91
92 *ready = 0; /* set false */
93
94 return 0; /* return ok */
95}
96
106static uint8_t a_cs1237_read_data(cs1237_handle_t *handle, int32_t *data)
107{
108 uint8_t i;
109 uint8_t level;
110 uint8_t ready;
111 uint32_t raw = 0; /* init 0 */
112
113 if (a_cs1237_check_ready(handle, &ready) != 0) /* check ready */
114 {
115 return 1; /* return error */
116 }
117 if (ready == 0) /* check ready */
118 {
119 handle->debug_print("cs1237: data is not ready.\n"); /* data is not ready */
120
121 return 1; /* return error */
122 }
123
124 for (i = 0; i < 24; i++) /* 24bits */
125 {
126 if (handle->sclk_gpio_write(1) != 0) /* set high */
127 {
128 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
129
130 return 1; /* return error */
131 }
132 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
133 if (handle->sclk_gpio_write(0) != 0) /* set low */
134 {
135 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
136
137 return 1; /* return error */
138 }
139 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
140
141 raw <<= 1; /* left shift */
142
143 if (handle->dout_gpio_read(&level) != 0) /* read level */
144 {
145 handle->debug_print("cs1237: dout gpio read failed.\n"); /* dout gpio read failed */
146
147 return 1; /* return error */
148 }
149
150 if (level != 0) /* high level */
151 {
152 raw |= 0x01; /* set bit */
153 }
154 }
155
156 if (handle->sclk_gpio_write(1) != 0) /* set high */
157 {
158 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
159
160 return 1; /* return error */
161 }
162 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
163 if (handle->sclk_gpio_write(0) != 0) /* set low */
164 {
165 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
166
167 return 1; /* return error */
168 }
169 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
170
171 if (handle->sclk_gpio_write(1) != 0) /* set high */
172 {
173 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
174
175 return 1; /* return error */
176 }
177 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
178 if (handle->sclk_gpio_write(0) != 0) /* set low */
179 {
180 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
181
182 return 1; /* return error */
183 }
184 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
185
186 if (handle->sclk_gpio_write(1) != 0) /* set high */
187 {
188 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
189
190 return 1; /* return error */
191 }
192 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
193 if (handle->sclk_gpio_write(0) != 0) /* set low */
194 {
195 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
196
197 return 1; /* return error */
198 }
199 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
200
201 if ((raw & 0x800000U) != 0) /* check msb */
202 {
203 raw |= 0xFF000000U; /* set negative */
204 }
205
206 *data = (int32_t)(raw); /* set output */
207
208 return 0; /* return ok */
209}
210
221static uint8_t a_cs1237_write_config(cs1237_handle_t *handle, uint8_t command, uint8_t configuration)
222{
223 uint8_t i;
224 uint8_t cmd;
225 uint8_t config;
226 uint8_t level;
227 int32_t data;
228
229 if (a_cs1237_read_data(handle, &data) != 0) /* read data */
230 {
231 return 1; /* return error */
232 }
233
234 if (handle->sclk_gpio_write(1) != 0) /* set high */
235 {
236 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
237
238 return 1; /* return error */
239 }
240 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
241 if (handle->sclk_gpio_write(0) != 0) /* set low */
242 {
243 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
244
245 return 1; /* return error */
246 }
247 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
248
249 if (handle->sclk_gpio_write(1) != 0) /* set high */
250 {
251 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
252
253 return 1; /* return error */
254 }
255 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
256 if (handle->sclk_gpio_write(0) != 0) /* set low */
257 {
258 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
259
260 return 1; /* return error */
261 }
262 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
263
264 cmd = command; /* set command */
265 for (i = 0; i < 7; i++) /* loop */
266 {
267 if (handle->dout_gpio_write((cmd & 0x40) ? 1 : 0) != 0) /* write level */
268 {
269 handle->debug_print("cs1237: dout gpio write failed.\n"); /* dout gpio write failed */
270
271 return 1; /* return error */
272 }
273
274 if (handle->sclk_gpio_write(1) != 0) /* set high */
275 {
276 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
277
278 return 1; /* return error */
279 }
280 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
281 if (handle->sclk_gpio_write(0) != 0) /* set low */
282 {
283 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
284
285 return 1; /* return error */
286 }
287 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
288
289 cmd <<= 1; /* left shift */
290 }
291
292 if (handle->sclk_gpio_write(1) != 0) /* set high */
293 {
294 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
295
296 return 1; /* return error */
297 }
298 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
299 if (handle->sclk_gpio_write(0) != 0) /* set low */
300 {
301 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
302
303 return 1; /* return error */
304 }
305 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
306
307 config = configuration; /* set config */
308 for (i = 0; i < 8; i++) /* loop */
309 {
310 if (handle->dout_gpio_write((config & 0x80) ? 1 : 0) != 0) /* write level */
311 {
312 handle->debug_print("cs1237: dout gpio write failed.\n"); /* dout gpio write failed */
313
314 return 1; /* return error */
315 }
316
317 if (handle->sclk_gpio_write(1) != 0) /* set high */
318 {
319 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
320
321 return 1; /* return error */
322 }
323 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
324 if (handle->sclk_gpio_write(0) != 0) /* set low */
325 {
326 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
327
328 return 1; /* return error */
329 }
330 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
331
332 config <<= 1; /* left shift */
333 }
334
335 if (handle->dout_gpio_read(&level) != 0) /* read level */
336 {
337 handle->debug_print("cs1237: dout gpio read failed.\n"); /* dout gpio read failed */
338
339 return 1; /* return error */
340 }
341
342 if (handle->sclk_gpio_write(1) != 0) /* set high */
343 {
344 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
345
346 return 1; /* return error */
347 }
348 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
349 if (handle->sclk_gpio_write(0) != 0) /* set low */
350 {
351 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
352
353 return 1; /* return error */
354 }
355 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
356
357 return 0; /* return ok */
358}
359
370static uint8_t a_cs1237_read_config(cs1237_handle_t *handle, uint8_t command, uint8_t *configuration)
371{
372 uint8_t i;
373 uint8_t cmd;
374 uint8_t config;
375 uint8_t level;
376 int32_t data;
377
378 if (a_cs1237_read_data(handle, &data) != 0) /* read data */
379 {
380 return 1; /* return error */
381 }
382
383 if (handle->sclk_gpio_write(1) != 0) /* set high */
384 {
385 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
386
387 return 1; /* return error */
388 }
389 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
390 if (handle->sclk_gpio_write(0) != 0) /* set low */
391 {
392 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
393
394 return 1; /* return error */
395 }
396 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
397
398 if (handle->sclk_gpio_write(1) != 0) /* set high */
399 {
400 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
401
402 return 1; /* return error */
403 }
404 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
405 if (handle->sclk_gpio_write(0) != 0) /* set low */
406 {
407 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
408
409 return 1; /* return error */
410 }
411 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
412
413 cmd = command; /* set command */
414 for (i = 0; i < 7; i++) /* loop */
415 {
416 if (handle->dout_gpio_write((cmd & 0x40) ? 1 : 0) != 0) /* write level */
417 {
418 handle->debug_print("cs1237: dout gpio write failed.\n"); /* dout gpio write failed */
419
420 return 1; /* return error */
421 }
422
423 if (handle->sclk_gpio_write(1) != 0) /* set high */
424 {
425 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
426
427 return 1; /* return error */
428 }
429 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
430 if (handle->sclk_gpio_write(0) != 0) /* set low */
431 {
432 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
433
434 return 1; /* return error */
435 }
436 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
437
438 cmd <<= 1; /* left shift */
439 }
440
441 if (handle->dout_gpio_read(&level) != 0) /* change to read mode */
442 {
443 handle->debug_print("cs1237: dout gpio read failed.\n"); /* dout gpio read failed */
444
445 return 1; /* return error */
446 }
447
448 if (handle->sclk_gpio_write(1) != 0) /* set high */
449 {
450 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
451
452 return 1; /* return error */
453 }
454 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
455 if (handle->sclk_gpio_write(0) != 0) /* set low */
456 {
457 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
458
459 return 1; /* return error */
460 }
461 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
462
463 config = 0; /* set 0 */
464 for (i = 0; i < 8; i++) /* loop */
465 {
466 if (handle->sclk_gpio_write(1) != 0) /* set high */
467 {
468 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
469
470 return 1; /* return error */
471 }
472 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
473 if (handle->sclk_gpio_write(0) != 0) /* set low */
474 {
475 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
476
477 return 1; /* return error */
478 }
479 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
480
481 config <<= 1; /* left shift */
482
483 if (handle->dout_gpio_read(&level) != 0) /* read level */
484 {
485 handle->debug_print("cs1237: dout gpio read failed.\n"); /* dout gpio read failed */
486
487 return 1; /* return error */
488 }
489
490 if (level != 0) /* high level */
491 {
492 config |= 0x01; /* set bit */
493 }
494 }
495
496 if (handle->sclk_gpio_write(1) != 0) /* set high */
497 {
498 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
499
500 return 1; /* return error */
501 }
502 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
503 if (handle->sclk_gpio_write(0) != 0) /* set low */
504 {
505 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
506
507 return 1; /* return error */
508 }
509 handle->delay_us(CS1237_COMMAND_DATA_DELAY); /* delay */
510 *configuration = config; /* set config */
511
512 return 0; /* return ok */
513}
514
523static uint8_t a_cs1237_power_down(cs1237_handle_t *handle)
524{
525 if (handle->sclk_gpio_write(1) != 0) /* set high */
526 {
527 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
528
529 return 1; /* return error */
530 }
531 handle->delay_us(150); /* delay 150us */
532
533 return 0; /* return ok */
534}
535
544static uint8_t a_cs1237_wake_up(cs1237_handle_t *handle)
545{
546 if (handle->sclk_gpio_write(0) != 0) /* set low */
547 {
548 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
549
550 return 1; /* return error */
551 }
552 handle->delay_us(20); /* delay 20us */
553
554 return 0; /* return ok */
555}
556
567{
568 if (handle == NULL) /* check handle */
569 {
570 return 2; /* return error */
571 }
572
573 handle->reference_voltage_v = volt; /* set volt */
574
575 return 0; /* return ok */
576}
577
588{
589 if (handle == NULL) /* check handle */
590 {
591 return 2; /* return error */
592 }
593
594 *volt = handle->reference_voltage_v; /* set volt */
595
596 return 0; /* return ok */
597}
598
609uint8_t cs1237_set_temperature_calibration_point(cs1237_handle_t *handle, int32_t temperature_raw, float temperature_deg)
610{
611 if (handle == NULL) /* check handle */
612 {
613 return 2; /* return error */
614 }
615
616 handle->temperature_raw = temperature_raw; /* set temperature raw */
617 handle->temperature_deg = temperature_deg; /* set temperature degrees */
618
619 return 0; /* return ok */
620}
621
632uint8_t cs1237_get_temperature_calibration_point(cs1237_handle_t *handle, int32_t *temperature_raw, float *temperature_deg)
633{
634 if (handle == NULL) /* check handle */
635 {
636 return 2; /* return error */
637 }
638
639 *temperature_raw = handle->temperature_raw; /* set temperature raw */
640 *temperature_deg = handle->temperature_deg; /* set temperature degrees */
641
642 return 0; /* return ok */
643}
644
657{
658 uint8_t res;
659 uint8_t config;
660
661 if (handle == NULL) /* check handle */
662 {
663 return 2; /* return error */
664 }
665 if (handle->inited != 1) /* check handle initialization */
666 {
667 return 3; /* return error */
668 }
669
670 res = a_cs1237_read_config(handle, CS1237_COMMAND_READ, &config); /* read config */
671 if (res != 0) /* check error */
672 {
673 return 1; /* return error */
674 }
675 config &= ~(1 << 6); /* clear settings */
676 config |= !enable << 6; /* set bool */
677 res = a_cs1237_write_config(handle, CS1237_COMMAND_WRITE, config); /* write config */
678 if (res != 0) /* check error */
679 {
680 return 1; /* return error */
681 }
682
683 return 0; /* success return 0 */
684}
685
698{
699 uint8_t res;
700 uint8_t config;
701
702 if (handle == NULL) /* check handle */
703 {
704 return 2; /* return error */
705 }
706 if (handle->inited != 1) /* check handle initialization */
707 {
708 return 3; /* return error */
709 }
710
711 res = a_cs1237_read_config(handle, CS1237_COMMAND_READ, &config); /* read config */
712 if (res != 0) /* check error */
713 {
714 return 1; /* return error */
715 }
716 *enable = (cs1237_bool_t)(!((config >> 6) & 0x01)); /* set bool */
717
718 return 0; /* success return 0 */
719}
720
733{
734 uint8_t res;
735 uint8_t config;
736
737 if (handle == NULL) /* check handle */
738 {
739 return 2; /* return error */
740 }
741 if (handle->inited != 1) /* check handle initialization */
742 {
743 return 3; /* return error */
744 }
745
746 res = a_cs1237_read_config(handle, CS1237_COMMAND_READ, &config); /* read config */
747 if (res != 0) /* check error */
748 {
749 return 1; /* return error */
750 }
751 config &= ~(3 << 4); /* clear settings */
752 config |= rate << 4; /* set rate */
753 res = a_cs1237_write_config(handle, CS1237_COMMAND_WRITE, config); /* write config */
754 if (res != 0) /* check error */
755 {
756 return 1; /* return error */
757 }
758
759 return 0; /* success return 0 */
760}
761
774{
775 uint8_t res;
776 uint8_t config;
777
778 if (handle == NULL) /* check handle */
779 {
780 return 2; /* return error */
781 }
782 if (handle->inited != 1) /* check handle initialization */
783 {
784 return 3; /* return error */
785 }
786
787 res = a_cs1237_read_config(handle, CS1237_COMMAND_READ, &config); /* read config */
788 if (res != 0) /* check error */
789 {
790 return 1; /* return error */
791 }
792 *rate = (cs1237_adc_rate_t)((config >> 4) & 0x03); /* set rate */
793
794 return 0; /* success return 0 */
795}
796
809{
810 uint8_t res;
811 uint8_t config;
812
813 if (handle == NULL) /* check handle */
814 {
815 return 2; /* return error */
816 }
817 if (handle->inited != 1) /* check handle initialization */
818 {
819 return 3; /* return error */
820 }
821
822 res = a_cs1237_read_config(handle, CS1237_COMMAND_READ, &config); /* read config */
823 if (res != 0) /* check error */
824 {
825 return 1; /* return error */
826 }
827 config &= ~(3 << 2); /* clear settings */
828 config |= pga << 2; /* set pga */
829 res = a_cs1237_write_config(handle, CS1237_COMMAND_WRITE, config); /* write config */
830 if (res != 0) /* check error */
831 {
832 return 1; /* return error */
833 }
834
835 if (pga == CS1237_PGA_1) /* pga 1 */
836 {
837 handle->pga = 1; /* set 1 */
838 }
839 else if (pga == CS1237_PGA_2) /* pga 2 */
840 {
841 handle->pga = 2; /* set 2 */
842 }
843 else if (pga == CS1237_PGA_64) /* pga 64 */
844 {
845 handle->pga = 64; /* set 64 */
846 }
847 else /* pga 128 */
848 {
849 handle->pga = 128; /* set 128 */
850 }
851
852 return 0; /* success return 0 */
853}
854
867{
868 uint8_t res;
869 uint8_t config;
870
871 if (handle == NULL) /* check handle */
872 {
873 return 2; /* return error */
874 }
875 if (handle->inited != 1) /* check handle initialization */
876 {
877 return 3; /* return error */
878 }
879
880 res = a_cs1237_read_config(handle, CS1237_COMMAND_READ, &config); /* read config */
881 if (res != 0) /* check error */
882 {
883 return 1; /* return error */
884 }
885 *pga = (cs1237_pga_t)((config >> 2) & 0x03); /* set pga */
886
887 if ((*pga) == CS1237_PGA_1) /* pga 1 */
888 {
889 handle->pga = 1; /* set 1 */
890 }
891 else if ((*pga) == CS1237_PGA_2) /* pga 2 */
892 {
893 handle->pga = 2; /* set 2 */
894 }
895 else if ((*pga) == CS1237_PGA_64) /* pga 64 */
896 {
897 handle->pga = 64; /* set 64 */
898 }
899 else /* pga 128 */
900 {
901 handle->pga = 128; /* set 128 */
902 }
903
904 return 0; /* success return 0 */
905}
906
919{
920 uint8_t res;
921 uint8_t config;
922
923 if (handle == NULL) /* check handle */
924 {
925 return 2; /* return error */
926 }
927 if (handle->inited != 1) /* check handle initialization */
928 {
929 return 3; /* return error */
930 }
931
932 res = a_cs1237_read_config(handle, CS1237_COMMAND_READ, &config); /* read config */
933 if (res != 0) /* check error */
934 {
935 return 1; /* return error */
936 }
937 config &= ~(3 << 0); /* clear settings */
938 config |= channel << 0; /* set channel */
939 res = a_cs1237_write_config(handle, CS1237_COMMAND_WRITE, config); /* write config */
940 if (res != 0) /* check error */
941 {
942 return 1; /* return error */
943 }
944
945 if (channel == CS1237_CHANNEL_A) /* channel a */
946 {
947 handle->channel = (uint8_t)CS1237_CHANNEL_A; /* set channel a */
948 }
949 else if (channel == CS1237_CHANNEL_TEMPERATURE) /* channel temperature */
950 {
951 handle->channel = (uint8_t)CS1237_CHANNEL_TEMPERATURE; /* set channel temperature */
952 }
953 else /* channel short circuit */
954 {
955 handle->channel = (uint8_t)CS1237_CHANNEL_SHORT_CIRCUIT; /* set channel short circuit */
956 }
957
958 return 0; /* success return 0 */
959}
960
973{
974 uint8_t res;
975 uint8_t config;
976
977 if (handle == NULL) /* check handle */
978 {
979 return 2; /* return error */
980 }
981 if (handle->inited != 1) /* check handle initialization */
982 {
983 return 3; /* return error */
984 }
985
986 res = a_cs1237_read_config(handle, CS1237_COMMAND_READ, &config); /* read config */
987 if (res != 0) /* check error */
988 {
989 return 1; /* return error */
990 }
991 *channel = (cs1237_channel_t)((config >> 0) & 0x03); /* set channel */
992
993 if ((*channel) == CS1237_CHANNEL_A) /* channel a */
994 {
995 handle->channel = (uint8_t)CS1237_CHANNEL_A; /* set channel a */
996 }
997 else if ((*channel) == CS1237_CHANNEL_TEMPERATURE) /* channel temperature */
998 {
999 handle->channel = (uint8_t)CS1237_CHANNEL_TEMPERATURE; /* set channel temperature */
1000 }
1001 else /* channel short circuit */
1002 {
1003 handle->channel = (uint8_t)CS1237_CHANNEL_SHORT_CIRCUIT; /* set channel short circuit */
1004 }
1005
1006 return 0; /* success return 0 */
1007}
1008
1020{
1021 uint8_t res;
1022
1023 if (handle == NULL) /* check handle */
1024 {
1025 return 2; /* return error */
1026 }
1027 if (handle->inited != 1) /* check handle initialization */
1028 {
1029 return 3; /* return error */
1030 }
1031
1032 res = a_cs1237_power_down(handle); /* power down */
1033 if (res != 0) /* check error */
1034 {
1035 return 1; /* return error */
1036 }
1037
1038 return 0; /* success return 0 */
1039}
1040
1052{
1053 uint8_t res;
1054
1055 if (handle == NULL) /* check handle */
1056 {
1057 return 2; /* return error */
1058 }
1059 if (handle->inited != 1) /* check handle initialization */
1060 {
1061 return 3; /* return error */
1062 }
1063
1064 res = a_cs1237_wake_up(handle); /* wake up */
1065 if (res != 0) /* check error */
1066 {
1067 return 1; /* return error */
1068 }
1069
1070 return 0; /* success return 0 */
1071}
1072
1086uint8_t cs1237_read(cs1237_handle_t *handle, int32_t *raw, double *mv)
1087{
1088 uint8_t res;
1089
1090 if (handle == NULL) /* check handle */
1091 {
1092 return 2; /* return error */
1093 }
1094 if (handle->inited != 1) /* check handle initialization */
1095 {
1096 return 3; /* return error */
1097 }
1098 if (handle->channel == (uint8_t)CS1237_CHANNEL_TEMPERATURE) /* check channel */
1099 {
1100 handle->debug_print("cs1237: can't be temperature channel.\n"); /* can't be temperature channel */
1101
1102 return 4; /* return error */
1103 }
1104
1105 res = a_cs1237_read_data(handle, raw); /* read data */
1106 if (res != 0) /* check error */
1107 {
1108 return 1; /* return error */
1109 }
1110
1111 *mv = (double)(*raw) *
1112 (0.5 * handle->reference_voltage_v / (double)handle->pga) /
1113 8388607.0 * 1000.0; /* set mv */
1114
1115 return 0; /* success return 0 */
1116}
1117
1133uint8_t cs1237_read_temperature(cs1237_handle_t *handle, int32_t *raw, float *degrees)
1134{
1135 uint8_t res;
1136
1137 if (handle == NULL) /* check handle */
1138 {
1139 return 2; /* return error */
1140 }
1141 if (handle->inited != 1) /* check handle initialization */
1142 {
1143 return 3; /* return error */
1144 }
1145 if (handle->channel != (uint8_t)CS1237_CHANNEL_TEMPERATURE) /* check channel */
1146 {
1147 handle->debug_print("cs1237: not temperature channel.\n"); /* not temperature channel */
1148
1149 return 4; /* return error */
1150 }
1151 if (handle->pga != 1) /* check pga */
1152 {
1153 handle->debug_print("cs1237: pga must be 1.\n"); /* pga must be 1 */
1154
1155 return 5; /* return error */
1156 }
1157 if (handle->temperature_raw == 0) /* check 0 */
1158 {
1159 handle->debug_print("cs1237: temperature raw can't be 0.\n"); /* temperature raw can't be 0 */
1160
1161 return 6; /* return error */
1162 }
1163
1164 res = a_cs1237_read_data(handle, raw); /* read data */
1165 if (res != 0) /* check error */
1166 {
1167 return 1; /* return error */
1168 }
1169
1170 *degrees = ((float)(*raw) * (273.15f + handle->temperature_deg) /
1171 (float)handle->temperature_raw) - 273.15f; /* set degrees */
1172
1173 return 0; /* success return 0 */
1174}
1175
1187{
1188 uint8_t res;
1189 uint8_t level;
1190
1191 if (handle == NULL) /* check handle */
1192 {
1193 return 2; /* return error */
1194 }
1195 if (handle->debug_print == NULL) /* check debug_print */
1196 {
1197 return 3; /* return error */
1198 }
1199 if (handle->sclk_gpio_init == NULL) /* check sclk_gpio_init */
1200 {
1201 handle->debug_print("cs1237: sclk_gpio_init is null.\n"); /* sclk_gpio_init is null */
1202
1203 return 3; /* return error */
1204 }
1205 if (handle->sclk_gpio_deinit == NULL) /* check sclk_gpio_deinit */
1206 {
1207 handle->debug_print("cs1237: sclk_gpio_deinit is null.\n"); /* sclk_gpio_deinit is null */
1208
1209 return 3; /* return error */
1210 }
1211 if (handle->sclk_gpio_write == NULL) /* check sclk_gpio_write */
1212 {
1213 handle->debug_print("cs1237: sclk_gpio_write is null.\n"); /* sclk_gpio_write is null */
1214
1215 return 3; /* return error */
1216 }
1217 if (handle->dout_gpio_init == NULL) /* check dout_gpio_init */
1218 {
1219 handle->debug_print("cs1237: dout_gpio_init is null.\n"); /* dout_gpio_init is null */
1220
1221 return 3; /* return error */
1222 }
1223 if (handle->dout_gpio_deinit == NULL) /* check dout_gpio_deinit */
1224 {
1225 handle->debug_print("cs1237: dout_gpio_deinit is null.\n"); /* dout_gpio_deinit is null */
1226
1227 return 3; /* return error */
1228 }
1229 if (handle->dout_gpio_write == NULL) /* check dout_gpio_write */
1230 {
1231 handle->debug_print("cs1237: dout_gpio_write is null.\n"); /* dout_gpio_write is null */
1232
1233 return 3; /* return error */
1234 }
1235 if (handle->dout_gpio_read == NULL) /* check dout_gpio_read */
1236 {
1237 handle->debug_print("cs1237: dout_gpio_read is null.\n"); /* dout_gpio_read is null */
1238
1239 return 3; /* return error */
1240 }
1241 if (handle->delay_us == NULL) /* check delay_us */
1242 {
1243 handle->debug_print("cs1237: delay_us is null.\n"); /* delay_us is null */
1244
1245 return 3; /* return error */
1246 }
1247 if (handle->delay_ms == NULL) /* check delay_ms */
1248 {
1249 handle->debug_print("cs1237: delay_ms is null.\n"); /* delay_ms is null */
1250
1251 return 3; /* return error */
1252 }
1253
1254 res = handle->sclk_gpio_init(); /* sclk gpio init */
1255 if (res != 0) /* check result */
1256 {
1257 handle->debug_print("cs1237: sclk gpio init failed.\n"); /* sclk gpio init failed */
1258
1259 return 1; /* return error */
1260 }
1261 res = handle->dout_gpio_init(); /* dout gpio init */
1262 if (res != 0) /* check result */
1263 {
1264 handle->debug_print("cs1237: dout gpio init failed.\n"); /* dout gpio init failed */
1265 (void)handle->sclk_gpio_deinit(); /* sclk gpio deinit */
1266
1267 return 1; /* return error */
1268 }
1269
1270 res = handle->sclk_gpio_write(0); /* set low */
1271 if (res != 0) /* check result */
1272 {
1273 handle->debug_print("cs1237: sclk gpio write failed.\n"); /* sclk gpio write failed */
1274 (void)handle->sclk_gpio_deinit(); /* sclk gpio deinit */
1275 (void)handle->dout_gpio_deinit(); /* dout gpio deinit */
1276
1277 return 1; /* return error */
1278 }
1279 if (handle->dout_gpio_read(&level) != 0) /* change to read mode */
1280 {
1281 handle->debug_print("cs1237: dout gpio read failed.\n"); /* dout gpio read failed */
1282 (void)handle->sclk_gpio_deinit(); /* sclk gpio deinit */
1283 (void)handle->dout_gpio_deinit(); /* dout gpio deinit */
1284
1285 return 1; /* return error */
1286 }
1287 handle->pga = 128; /* set 128 */
1288 handle->channel = (uint8_t)CS1237_CHANNEL_A; /* set channel a */
1289 handle->inited = 1; /* flag inited */
1290
1291 return 0; /* success return 0 */
1292}
1293
1306{
1307 uint8_t res;
1308
1309 if (handle == NULL) /* check handle */
1310 {
1311 return 2; /* return error */
1312 }
1313 if (handle->inited != 1) /* check handle initialization */
1314 {
1315 return 3; /* return error */
1316 }
1317
1318 res = a_cs1237_power_down(handle); /* write command */
1319 if (res != 0) /* check error */
1320 {
1321 return 4; /* return error */
1322 }
1323
1324 res = handle->sclk_gpio_deinit(); /* sclk gpio deinit */
1325 if (res != 0) /* check the result */
1326 {
1327 handle->debug_print("cs1237: sclk gpio deinit failed.\n"); /* sclk gpio deinit failed */
1328
1329 return 1; /* return error */
1330 }
1331 res = handle->dout_gpio_deinit(); /* dout gpio deinit */
1332 if (res != 0) /* check the result */
1333 {
1334 handle->debug_print("cs1237: dout gpio deinit failed.\n"); /* dout gpio deinit failed */
1335
1336 return 1; /* return error */
1337 }
1338
1339 handle->inited = 0; /* flag close */
1340
1341 return 0; /* success return 0 */
1342}
1343
1356uint8_t cs1237_set_command(cs1237_handle_t *handle, uint8_t command, uint8_t config)
1357{
1358 uint8_t res;
1359
1360 if (handle == NULL) /* check handle */
1361 {
1362 return 2; /* return error */
1363 }
1364 if (handle->inited != 1) /* check handle initialization */
1365 {
1366 return 3; /* return error */
1367 }
1368
1369 res = a_cs1237_write_config(handle, command, config); /* write */
1370 if (res != 0) /* check error */
1371 {
1372 return 1; /* return error */
1373 }
1374
1375 return 0; /* success return 0 */
1376}
1377
1390uint8_t cs1237_get_command(cs1237_handle_t *handle, uint8_t command, uint8_t *config)
1391{
1392 uint8_t res;
1393
1394 if (handle == NULL) /* check handle */
1395 {
1396 return 2; /* return error */
1397 }
1398 if (handle->inited != 1) /* check handle initialization */
1399 {
1400 return 3; /* return error */
1401 }
1402
1403 res = a_cs1237_read_config(handle, command, config); /* read */
1404 if (res != 0) /* check error */
1405 {
1406 return 1; /* return error */
1407 }
1408
1409 return 0; /* success return 0 */
1410}
1411
1423uint8_t cs1237_get_data(cs1237_handle_t *handle, int32_t *data)
1424{
1425 uint8_t res;
1426
1427 if (handle == NULL) /* check handle */
1428 {
1429 return 2; /* return error */
1430 }
1431 if (handle->inited != 1) /* check handle initialization */
1432 {
1433 return 3; /* return error */
1434 }
1435
1436 res = a_cs1237_read_data(handle, data); /* read data */
1437 if (res != 0) /* check error */
1438 {
1439 return 1; /* return error */
1440 }
1441
1442 return 0; /* success return 0 */
1443}
1444
1454{
1455 if (info == NULL) /* check handle */
1456 {
1457 return 2; /* return error */
1458 }
1459
1460 memset(info, 0, sizeof(cs1237_info_t)); /* initialize cs1237 info structure */
1461 strncpy(info->chip_name, CHIP_NAME, 32); /* copy chip name */
1462 strncpy(info->manufacturer_name, MANUFACTURER_NAME, 32); /* copy manufacturer name */
1463 strncpy(info->interface, "GPIO", 8); /* copy interface name */
1464 info->supply_voltage_min_v = SUPPLY_VOLTAGE_MIN; /* set minimal supply voltage */
1465 info->supply_voltage_max_v = SUPPLY_VOLTAGE_MAX; /* set maximum supply voltage */
1466 info->max_current_ma = MAX_CURRENT; /* set maximum current */
1467 info->temperature_max = TEMPERATURE_MAX; /* set maximum temperature */
1468 info->temperature_min = TEMPERATURE_MIN; /* set minimal temperature */
1469 info->driver_version = DRIVER_VERSION; /* set driver version */
1470
1471 return 0; /* success return 0 */
1472}
#define MAX_CURRENT
#define SUPPLY_VOLTAGE_MAX
#define CS1237_COMMAND_READ
chip command definition
#define TEMPERATURE_MAX
#define MANUFACTURER_NAME
#define TEMPERATURE_MIN
#define SUPPLY_VOLTAGE_MIN
#define CS1237_COMMAND_WRITE
#define CHIP_NAME
chip information definition
#define DRIVER_VERSION
driver cs1237 header file
uint8_t cs1237_set_adc_rate(cs1237_handle_t *handle, cs1237_adc_rate_t rate)
set adc rate
uint8_t cs1237_read_temperature(cs1237_handle_t *handle, int32_t *raw, float *degrees)
read temperature
uint8_t cs1237_set_reference_voltage_output(cs1237_handle_t *handle, cs1237_bool_t enable)
enable or disable reference voltage output
uint8_t cs1237_get_channel(cs1237_handle_t *handle, cs1237_channel_t *channel)
get adc channel
struct cs1237_handle_s cs1237_handle_t
cs1237 handle structure definition
uint8_t cs1237_get_temperature_calibration_point(cs1237_handle_t *handle, int32_t *temperature_raw, float *temperature_deg)
get temperature calibration point
uint8_t cs1237_deinit(cs1237_handle_t *handle)
close the chip
uint8_t cs1237_get_reference_voltage(cs1237_handle_t *handle, float *volt)
get reference voltage
uint8_t cs1237_info(cs1237_info_t *info)
get chip's information
cs1237_bool_t
cs1237 bool enumeration definition
uint8_t cs1237_read(cs1237_handle_t *handle, int32_t *raw, double *mv)
read voltage
uint8_t cs1237_set_reference_voltage(cs1237_handle_t *handle, float volt)
set reference voltage
uint8_t cs1237_wake_up(cs1237_handle_t *handle)
wake up
uint8_t cs1237_get_pga(cs1237_handle_t *handle, cs1237_pga_t *pga)
get adc pga
#define CS1237_COMMAND_DATA_DELAY
cs1237 command data delay definition
uint8_t cs1237_get_adc_rate(cs1237_handle_t *handle, cs1237_adc_rate_t *rate)
get adc rate
uint8_t cs1237_set_pga(cs1237_handle_t *handle, cs1237_pga_t pga)
set adc pga
uint8_t cs1237_get_reference_voltage_output(cs1237_handle_t *handle, cs1237_bool_t *enable)
get reference voltage output status
uint8_t cs1237_power_down(cs1237_handle_t *handle)
power down
cs1237_pga_t
cs1237 pga enumeration definition
uint8_t cs1237_set_temperature_calibration_point(cs1237_handle_t *handle, int32_t temperature_raw, float temperature_deg)
set temperature calibration point
cs1237_adc_rate_t
cs1237 adc rate enumeration definition
struct cs1237_info_s cs1237_info_t
cs1237 information structure definition
uint8_t cs1237_set_channel(cs1237_handle_t *handle, cs1237_channel_t channel)
set adc channel
uint8_t cs1237_init(cs1237_handle_t *handle)
initialize the chip
cs1237_channel_t
cs1237 channel enumeration definition
@ CS1237_PGA_2
@ CS1237_PGA_1
@ CS1237_PGA_64
@ CS1237_CHANNEL_SHORT_CIRCUIT
@ CS1237_CHANNEL_TEMPERATURE
@ CS1237_CHANNEL_A
uint8_t cs1237_get_command(cs1237_handle_t *handle, uint8_t command, uint8_t *config)
get command
uint8_t cs1237_get_data(cs1237_handle_t *handle, int32_t *data)
get data
uint8_t cs1237_set_command(cs1237_handle_t *handle, uint8_t command, uint8_t config)
set command
int32_t temperature_raw
void(* delay_ms)(uint32_t ms)
uint8_t(* sclk_gpio_deinit)(void)
uint8_t(* dout_gpio_init)(void)
uint8_t(* dout_gpio_write)(uint8_t level)
void(* debug_print)(const char *const fmt,...)
void(* delay_us)(uint32_t us)
uint8_t(* sclk_gpio_init)(void)
uint8_t(* dout_gpio_deinit)(void)
uint8_t(* dout_gpio_read)(uint8_t *level)
uint8_t(* sclk_gpio_write)(uint8_t level)
float supply_voltage_max_v
uint32_t driver_version
char manufacturer_name[32]
float supply_voltage_min_v
char chip_name[32]