LibDriver PCA9548A
Loading...
Searching...
No Matches
driver_pca9548a.c
Go to the documentation of this file.
1
36
37#include "driver_pca9548a.h"
38
42#define CHIP_NAME "NXP PCA9548A"
43#define MANUFACTURER_NAME "NXP"
44#define SUPPLY_VOLTAGE_MIN 2.3f
45#define SUPPLY_VOLTAGE_MAX 5.5f
46#define MAX_CURRENT 100.0f
47#define TEMPERATURE_MIN -40.0f
48#define TEMPERATURE_MAX 85.0f
49#define DRIVER_VERSION 1000
50
61{
62 if (handle == NULL) /* check handle */
63 {
64 return 2; /* return error */
65 }
66
67 handle->iic_addr = (uint8_t)(addr_pin); /* set iic address */
68
69 return 0; /* success return 0 */
70}
71
82{
83 if (handle == NULL) /* check handle */
84 {
85 return 2; /* return error */
86 }
87
88 *addr_pin = (pca9548a_address_t)(handle->iic_addr); /*get iic address */
89
90 return 0; /* success return 0 */
91}
92
106{
107 if (handle == NULL) /* check handle */
108 {
109 return 2; /* return error */
110 }
111 if (handle->debug_print == NULL) /* check debug_print */
112 {
113 return 3; /* return error */
114 }
115 if (handle->reset_gpio_init == NULL) /* check reset_gpio_init */
116 {
117 handle->debug_print("pca9548a: reset_gpio_init is null.\n"); /* reset_gpio_init is null */
118
119 return 3; /* return error */
120 }
121 if (handle->reset_gpio_deinit == NULL) /* check reset_gpio_deinit */
122 {
123 handle->debug_print("pca9548a: reset_gpio_deinit is null.\n"); /* reset_gpio_deinit is null */
124
125 return 3; /* return error */
126 }
127 if (handle->reset_gpio_write == NULL) /* check reset_gpio_write */
128 {
129 handle->debug_print("pca9548a: reset_gpio_write is null.\n"); /* reset_gpio_write is null */
130
131 return 3; /* return error */
132 }
133 if (handle->iic_init == NULL) /* check iic_init */
134 {
135 handle->debug_print("pca9548a: iic_init is null.\n"); /* iic_init is null */
136
137 return 3; /* return error */
138 }
139 if (handle->iic_deinit == NULL) /* check iic_deinit */
140 {
141 handle->debug_print("pca9548a: iic_deinit is null.\n"); /* iic_deinit is null */
142
143 return 3; /* return error */
144 }
145 if (handle->iic_read_cmd == NULL) /* check iic_read_cmd */
146 {
147 handle->debug_print("pca9548a: iic_read_cmd is null.\n"); /* iic_read_cmd is null */
148
149 return 3; /* return error */
150 }
151 if (handle->iic_write_cmd == NULL) /* check iic_write_cmd */
152 {
153 handle->debug_print("pca9548a: iic_write_cmd is null.\n"); /* iic_write_cmd is null */
154
155 return 3; /* return error */
156 }
157 if (handle->iic_read == NULL) /* check iic_read */
158 {
159 handle->debug_print("pca9548a: iic_read is null.\n"); /* iic_read is null */
160
161 return 3; /* return error */
162 }
163 if (handle->iic_write == NULL) /* check iic_write */
164 {
165 handle->debug_print("pca9548a: iic_write is null.\n"); /* iic_write is null */
166
167 return 3; /* return error */
168 }
169 if (handle->iic_read_address16 == NULL) /* check iic_read_address16 */
170 {
171 handle->debug_print("pca9548a: iic_read_address16 is null.\n"); /* iic_read_address16 is null */
172
173 return 3; /* return error */
174 }
175 if (handle->iic_write_address16 == NULL) /* check iic_write_address16 */
176 {
177 handle->debug_print("pca9548a: iic_write_address16 is null.\n"); /* iic_write_address16 is null */
178
179 return 3; /* return error */
180 }
181 if (handle->delay_ms == NULL) /* check delay_ms */
182 {
183 handle->debug_print("pca9548a: delay_ms is null.\n"); /* delay_ms is null */
184
185 return 3; /* return error */
186 }
187
188 if (handle->iic_init() != 0) /* iic init */
189 {
190 handle->debug_print("pca9548a: iic init failed.\n"); /* iic init failed */
191
192 return 1; /* return error */
193 }
194 if (handle->reset_gpio_init() != 0) /* reset gpio init */
195 {
196 handle->debug_print("pca9548a: reset gpio init failed.\n"); /* reset gpio init failed */
197 (void)handle->iic_deinit(); /* iic deinit */
198
199 return 1; /* return error */
200 }
201 if (handle->reset_gpio_write(0) != 0) /* set low */
202 {
203 handle->debug_print("pca9548a: reset gpio write failed.\n"); /* reset gpio write failed */
204 (void)handle->iic_deinit(); /* iic deinit */
205 (void)handle->reset_gpio_deinit(); /* reset gpio deinit */
206
207 return 4; /* return error */
208 }
209 handle->delay_ms(2); /* delay 2ms */
210 if (handle->reset_gpio_write(1) != 0) /* set high */
211 {
212 handle->debug_print("pca9548a: reset gpio write failed.\n"); /* reset gpio write failed */
213 (void)handle->iic_deinit(); /* iic deinit */
214 (void)handle->reset_gpio_deinit(); /* reset gpio deinit */
215
216 return 4; /* return error */
217 }
218 handle->delay_ms(2); /* delay 2ms */
219 handle->channel = 0x00; /* set 0x00 */
220 if (handle->iic_write_cmd(handle->iic_addr,
221 (uint8_t *)&handle->channel, 1) != 0) /* write all channel disabled */
222 {
223 handle->debug_print("pca9548a: iic write failed.\n"); /* iic write failed */
224 (void)handle->iic_deinit(); /* iic deinit */
225
226 return 5; /* return error */
227 }
228 handle->inited = 1; /* flag finish initialization */
229
230 return 0; /* success return 0 */
231}
232
245{
246 uint8_t res;
247
248 if (handle == NULL) /* check handle */
249 {
250 return 2; /* return error */
251 }
252 if (handle->inited != 1) /* check handle initialization */
253 {
254 return 3; /* return error */
255 }
256
257 handle->channel = 0x00; /* set 0x00 */
258 if (handle->iic_write_cmd(handle->iic_addr,
259 (uint8_t *)&handle->channel, 1) != 0) /* write all channel disabled */
260 {
261 handle->debug_print("pca9548a: iic write failed.\n"); /* iic write failed */
262
263 return 4; /* return error */
264 }
265 res = handle->iic_deinit(); /* iic deinit */
266 if (res != 0) /* check error */
267 {
268 handle->debug_print("pca9548a: iic deinit failed.\n"); /* iic deinit failed */
269
270 return 1; /* return error */
271 }
272 res = handle->reset_gpio_deinit(); /* reset gpio deinit */
273 if (res != 0) /* check error */
274 {
275 handle->debug_print("pca9548a: reset gpio deinit failed.\n"); /* reset gpio deinit failed */
276
277 return 1; /* return error */
278 }
279 handle->inited = 0; /* flag closed */
280
281 return 0; /* success return 0 */
282}
283
295{
296 uint8_t res;
297
298 if (handle == NULL) /* check handle */
299 {
300 return 2; /* return error */
301 }
302 if (handle->inited != 1) /* check handle initialization */
303 {
304 return 3; /* return error */
305 }
306
307 res = handle->reset_gpio_write(0); /* set low */
308 if (res != 0) /* check result */
309 {
310 handle->debug_print("pca9548a: reset gpio write failed.\n"); /* reset gpio write failed */
311
312 return 1; /* return error */
313 }
314 handle->delay_ms(2); /* delay 2ms */
315 res = handle->reset_gpio_write(1); /* set high */
316 if (res != 0) /* check result */
317 {
318 handle->debug_print("pca9548a: reset gpio write failed.\n"); /* reset gpio write failed */
319
320 return 1; /* return error */
321 }
322 handle->delay_ms(2); /* delay 2ms */
323
324 return 0; /* success return 0 */
325}
326
340{
341 if (handle == NULL) /* check handle */
342 {
343 return 2; /* return error */
344 }
345 if (handle->inited != 1) /* check handle initialization */
346 {
347 return 3; /* return error */
348 }
349
350 handle->channel &= ~(1 << channel); /* clear channel */
351 handle->channel |= enable << channel; /* set channel */
352 if (handle->iic_write_cmd(handle->iic_addr, (uint8_t *)&handle->channel, 1) != 0) /* write channel config */
353 {
354 handle->debug_print("pca9548a: set channel failed.\n"); /* set channel failed */
355
356 return 1; /* return error */
357 }
358
359 return 0; /* success return 0 */
360}
361
374{
375 if (handle == NULL) /* check handle */
376 {
377 return 2; /* return error */
378 }
379 if (handle->inited != 1) /* check handle initialization */
380 {
381 return 3; /* return error */
382 }
383
384 *enable = (pca9548a_bool_t)((handle->channel >> channel) & 0x01); /* set channel */
385
386 return 0; /* success return 0 */
387}
388
402uint8_t pca9548a_iic_read_command(pca9548a_handle_t *handle, uint8_t addr, uint8_t *buf, uint16_t len)
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 if (handle->iic_read_cmd(addr, buf, len) != 0) /* iic read */
414 {
415 handle->debug_print("pca9548a: iic read failed.\n"); /* iic read failed */
416
417 return 1; /* return error */
418 }
419
420 return 0; /* success return 0 */
421}
422
436uint8_t pca9548a_iic_write_command(pca9548a_handle_t *handle, uint8_t addr, uint8_t *buf, uint16_t len)
437{
438 if (handle == NULL) /* check handle */
439 {
440 return 2; /* return error */
441 }
442 if (handle->inited != 1) /* check handle initialization */
443 {
444 return 3; /* return error */
445 }
446
447 if (handle->iic_write_cmd(addr, buf, len) != 0) /* iic write */
448 {
449 handle->debug_print("pca9548a: iic write failed.\n"); /* iic write failed */
450
451 return 1; /* return error */
452 }
453
454 return 0; /* success return 0 */
455}
456
471uint8_t pca9548a_iic_read(pca9548a_handle_t *handle, uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
472{
473 if (handle == NULL) /* check handle */
474 {
475 return 2; /* return error */
476 }
477 if (handle->inited != 1) /* check handle initialization */
478 {
479 return 3; /* return error */
480 }
481
482 if (handle->iic_read(addr, reg, buf, len) != 0) /* iic read */
483 {
484 handle->debug_print("pca9548a: iic read failed.\n"); /* iic read failed */
485
486 return 1; /* return error */
487 }
488
489 return 0; /* success return 0 */
490}
491
506uint8_t pca9548a_iic_write(pca9548a_handle_t *handle, uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
507{
508 if (handle == NULL) /* check handle */
509 {
510 return 2; /* return error */
511 }
512 if (handle->inited != 1) /* check handle initialization */
513 {
514 return 3; /* return error */
515 }
516
517 if (handle->iic_write(addr, reg, buf, len) != 0) /* iic write */
518 {
519 handle->debug_print("pca9548a: iic write failed.\n"); /* iic write failed */
520
521 return 1; /* return error */
522 }
523
524 return 0; /* success return 0 */
525}
526
541uint8_t pca9548a_iic_read_address16(pca9548a_handle_t *handle, uint8_t addr, uint16_t reg, uint8_t *buf, uint16_t len)
542{
543 if (handle == NULL) /* check handle */
544 {
545 return 2; /* return error */
546 }
547 if (handle->inited != 1) /* check handle initialization */
548 {
549 return 3; /* return error */
550 }
551
552 if (handle->iic_read_address16(addr, reg, buf, len) != 0) /* iic read */
553 {
554 handle->debug_print("pca9548a: iic read failed.\n"); /* iic read failed */
555
556 return 1; /* return error */
557 }
558
559 return 0; /* success return 0 */
560}
561
576uint8_t pca9548a_iic_write_address16(pca9548a_handle_t *handle, uint8_t addr, uint16_t reg, uint8_t *buf, uint16_t len)
577{
578 if (handle == NULL) /* check handle */
579 {
580 return 2; /* return error */
581 }
582 if (handle->inited != 1) /* check handle initialization */
583 {
584 return 3; /* return error */
585 }
586
587 if (handle->iic_write_address16(addr, reg, buf, len) != 0) /* iic write */
588 {
589 handle->debug_print("pca9548a: iic write failed.\n"); /* iic write failed */
590
591 return 1; /* return error */
592 }
593
594 return 0; /* success return 0 */
595}
596
606{
607 if (info == NULL) /* check handle */
608 {
609 return 2; /* return error */
610 }
611
612 memset(info, 0, sizeof(pca9548a_info_t)); /* initialize pca9548a info structure */
613 strncpy(info->chip_name, CHIP_NAME, 32); /* copy chip name */
614 strncpy(info->manufacturer_name, MANUFACTURER_NAME, 32); /* copy manufacturer name */
615 strncpy(info->interface, "IIC", 8); /* copy interface name */
616 info->supply_voltage_min_v = SUPPLY_VOLTAGE_MIN; /* set minimal supply voltage */
617 info->supply_voltage_max_v = SUPPLY_VOLTAGE_MAX; /* set maximum supply voltage */
618 info->max_current_ma = MAX_CURRENT; /* set maximum current */
619 info->temperature_max = TEMPERATURE_MAX; /* set minimal temperature */
620 info->temperature_min = TEMPERATURE_MIN; /* set maximum temperature */
621 info->driver_version = DRIVER_VERSION; /* set driver version */
622
623 return 0; /* success return 0 */
624}
#define MAX_CURRENT
#define SUPPLY_VOLTAGE_MAX
#define TEMPERATURE_MAX
#define MANUFACTURER_NAME
#define TEMPERATURE_MIN
#define SUPPLY_VOLTAGE_MIN
#define CHIP_NAME
chip information definition
#define DRIVER_VERSION
driver pca9548a header file
uint8_t pca9548a_get_channel(pca9548a_handle_t *handle, pca9548a_channel_t channel, pca9548a_bool_t *enable)
get channel
uint8_t pca9548a_set_channel(pca9548a_handle_t *handle, pca9548a_channel_t channel, pca9548a_bool_t enable)
set channel
uint8_t pca9548a_iic_read_address16(pca9548a_handle_t *handle, uint8_t addr, uint16_t reg, uint8_t *buf, uint16_t len)
iic read address16
uint8_t pca9548a_init(pca9548a_handle_t *handle)
initialize the chip
uint8_t pca9548a_iic_read_command(pca9548a_handle_t *handle, uint8_t addr, uint8_t *buf, uint16_t len)
iic read command
uint8_t pca9548a_reset_bus(pca9548a_handle_t *handle)
reset bus
uint8_t pca9548a_get_addr_pin(pca9548a_handle_t *handle, pca9548a_address_t *addr_pin)
get the address pin
uint8_t pca9548a_iic_write_address16(pca9548a_handle_t *handle, uint8_t addr, uint16_t reg, uint8_t *buf, uint16_t len)
iic write address16
pca9548a_channel_t
pca9548a channel enumeration definition
uint8_t pca9548a_iic_write(pca9548a_handle_t *handle, uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
iic write
pca9548a_address_t
pca9548a address enumeration definition
uint8_t pca9548a_set_addr_pin(pca9548a_handle_t *handle, pca9548a_address_t addr_pin)
set the address pin
uint8_t pca9548a_iic_write_command(pca9548a_handle_t *handle, uint8_t addr, uint8_t *buf, uint16_t len)
iic write command
struct pca9548a_info_s pca9548a_info_t
pca9548a information structure definition
pca9548a_bool_t
pca9548a bool enumeration definition
uint8_t pca9548a_info(pca9548a_info_t *info)
get chip's information
uint8_t pca9548a_deinit(pca9548a_handle_t *handle)
close the chip
struct pca9548a_handle_s pca9548a_handle_t
pca9548a handle structure definition
uint8_t pca9548a_iic_read(pca9548a_handle_t *handle, uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
iic read
void(* delay_ms)(uint32_t ms)
uint8_t(* reset_gpio_deinit)(void)
uint8_t(* iic_read_address16)(uint8_t addr, uint16_t reg, uint8_t *buf, uint16_t len)
void(* debug_print)(const char *const fmt,...)
uint8_t(* iic_init)(void)
uint8_t(* reset_gpio_init)(void)
uint8_t(* iic_read_cmd)(uint8_t addr, uint8_t *buf, uint16_t len)
uint8_t(* iic_write_address16)(uint8_t addr, uint16_t reg, uint8_t *buf, uint16_t len)
uint8_t(* reset_gpio_write)(uint8_t level)
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)
uint8_t(* iic_write_cmd)(uint8_t addr, uint8_t *buf, uint16_t len)
char manufacturer_name[32]