1+ /*
2+ P3T1755DPZ (Temperature Sensor) Driver
3+ Datasheet: https://www.nxp.com/docs/en/data-sheet/P3T1755.pdf
4+ */
5+
6+ #include "p3t1755.h"
7+
8+ void p3t1755_init (p3t1755_t * p3t , WritePtr write , ReadPtr read ,
9+ uint16_t dev_addr )
10+ {
11+ p3t -> write = write ;
12+ p3t -> read = read ;
13+ p3t -> dev_addr = dev_addr ;
14+ }
15+
16+ int p3t1755_write_reg (p3t1755_t * p3t , uint16_t reg , uint16_t * data )
17+ {
18+ return p3t -> write (p3t -> dev_addr , reg , data );
19+ }
20+
21+ int p3t1755_read_reg (p3t1755_t * p3t , uint16_t reg , uint16_t * data )
22+ {
23+ return p3t -> read (p3t -> dev_addr , reg , data );
24+ }
25+
26+ int p3t1755_read_temperature (p3t1755_t * p3t , float * temp_c )
27+ {
28+ uint16_t temp_reg ;
29+
30+ int status = p3t1755_read_reg (p3t , p3t1755_TEMPERATURE , & temp_reg );
31+ if (status != 0 ) {
32+ return status ;
33+ }
34+
35+ * temp_c = p3t1755_RAW_TO_CELSIUS (temp_reg );
36+ return status ;
37+ }
38+
39+ int p3t1755_configure (p3t1755_t * p3t , uint8_t shutdown , uint8_t thermostat ,
40+ uint8_t polarity , uint8_t fault_queue ,
41+ uint8_t conversion_time )
42+ {
43+ uint16_t config = 0 ;
44+
45+ if (shutdown ) {
46+ config |= p3t1755_SHUTDOWN_MODE_MASK ;
47+ }
48+ if (thermostat ) {
49+ config |= p3t1755_THERMOSTAT_MODE_MASK ;
50+ }
51+ if (polarity ) {
52+ config |= p3t1755_POLARITY_MASK ;
53+ }
54+ config |= (fault_queue & p3t1755_FAULT_QUEUE_MASK );
55+ config |= (conversion_time & p3t1755_CONVERSION_TIME_MASK );
56+
57+ return p3t1755_write_reg (p3t , p3t1755_CONFIGURATION , & config );
58+ }
59+
60+ int p3t1755_set_shutdown_mode (p3t1755_t * p3t , uint8_t enable )
61+ {
62+ uint16_t config ;
63+
64+ int status = p3t1755_read_reg (p3t , p3t1755_CONFIGURATION , & config );
65+ if (status != 0 ) {
66+ return status ;
67+ }
68+
69+ if (enable != 0 ) {
70+ config |= p3t1755_SHUTDOWN_MODE_MASK ;
71+ } else {
72+ config &= ~p3t1755_SHUTDOWN_MODE_MASK ;
73+ }
74+
75+ return p3t1755_write_reg (p3t , p3t1755_CONFIGURATION , & config );
76+ }
77+
78+ int p3t1755_set_thermostat_mode (p3t1755_t * p3t , uint8_t enable )
79+ {
80+ uint16_t config ;
81+
82+ int status = p3t1755_read_reg (p3t , p3t1755_CONFIGURATION , & config );
83+ if (status != 0 ) {
84+ return status ;
85+ }
86+
87+ if (enable != 0 ) {
88+ config |= p3t1755_THERMOSTAT_MODE_MASK ;
89+ } else {
90+ config &= ~p3t1755_THERMOSTAT_MODE_MASK ;
91+ }
92+
93+ return p3t1755_write_reg (p3t , p3t1755_CONFIGURATION , & config );
94+ }
95+
96+ int p3t1755_set_one_shot_mode (p3t1755_t * p3t , uint8_t enable )
97+ {
98+ uint16_t config ;
99+
100+ int status = p3t1755_read_reg (p3t , p3t1755_CONFIGURATION , & config );
101+ if (status != 0 ) {
102+ return status ;
103+ }
104+
105+ if (enable != 0 ) {
106+ config |= p3t1755_ONE_SHOT_MASK ;
107+ } else {
108+ config &= ~p3t1755_ONE_SHOT_MASK ;
109+ }
110+
111+ return p3t1755_write_reg (p3t , p3t1755_CONFIGURATION , & config );
112+ }
113+
114+ int p3t1755_set_polarity (p3t1755_t * p3t , uint8_t setting )
115+ {
116+ uint16_t config ;
117+
118+ int status = p3t1755_read_reg (p3t , p3t1755_CONFIGURATION , & config );
119+ if (status != 0 ) {
120+ return status ;
121+ }
122+
123+ if (setting != 0 ) {
124+ config |= p3t1755_POLARITY_MASK ;
125+ } else {
126+ config &= ~p3t1755_POLARITY_MASK ;
127+ }
128+
129+ return p3t1755_write_reg (p3t , p3t1755_CONFIGURATION , & config );
130+ }
131+
132+ int p3t1755_set_fault_queue (p3t1755_t * p3t , uint8_t data )
133+ {
134+ uint16_t config ;
135+
136+ int status = p3t1755_read_reg (p3t , p3t1755_CONFIGURATION , & config );
137+ if (status != 0 ) {
138+ return status ;
139+ }
140+
141+ config &= ~p3t1755_FAULT_QUEUE_MASK ;
142+ config |= (data & p3t1755_FAULT_QUEUE_MASK );
143+
144+ return p3t1755_write_reg (p3t , p3t1755_CONFIGURATION , & config );
145+ }
146+
147+ int p3t1755_set_conversion_time (p3t1755_t * p3t , uint8_t data )
148+ {
149+ uint16_t config ;
150+
151+ int status = p3t1755_read_reg (p3t , p3t1755_CONFIGURATION , & config );
152+ if (status != 0 ) {
153+ return status ;
154+ }
155+
156+ config &= ~p3t1755_CONVERSION_TIME_MASK ;
157+ config |= (data & p3t1755_CONVERSION_TIME_MASK );
158+
159+ return p3t1755_write_reg (p3t , p3t1755_CONFIGURATION , & config );
160+ }
161+
162+ int p3t1755_read_high_temp (p3t1755_t * p3t , float * temp_c )
163+ {
164+ uint16_t high_temp_reg ;
165+
166+ int status = p3t1755_read_reg (p3t , p3t1755_T_HIGH , & high_temp_reg );
167+ if (status != 0 ) {
168+ return status ;
169+ }
170+
171+ * temp_c = p3t1755_RAW_TO_CELSIUS (high_temp_reg );
172+ return status ;
173+ }
174+
175+ int p3t1755_read_low_temp (p3t1755_t * p3t , float * temp_c )
176+ {
177+ uint16_t low_temp_reg ;
178+
179+ int status = p3t1755_read_reg (p3t , p3t1755_T_LOW , & low_temp_reg );
180+ if (status != 0 ) {
181+ return status ;
182+ }
183+
184+ * temp_c = p3t1755_RAW_TO_CELSIUS (low_temp_reg );
185+ return status ;
186+ }
187+
188+ int p3t1755_set_high_temp (p3t1755_t * p3t , float temp_c )
189+ {
190+ uint16_t raw_temp = p3t1755_CELSIUS_TO_RAW (temp_c );
191+
192+ return p3t1755_write_reg (p3t , p3t1755_T_HIGH , & raw_temp );
193+ }
194+
195+ int p3t1755_set_low_temp (p3t1755_t * p3t , float temp_c )
196+ {
197+ uint16_t raw_temp = p3t1755_CELSIUS_TO_RAW (temp_c );
198+
199+ return p3t1755_write_reg (p3t , p3t1755_T_LOW , & raw_temp );
200+ }
0 commit comments