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